aboutsummaryrefslogtreecommitdiff
path: root/.venv/lib/python3.12/site-packages/botocore
diff options
context:
space:
mode:
Diffstat (limited to '.venv/lib/python3.12/site-packages/botocore')
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/__init__.py191
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/args.py933
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/auth.py1188
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/awsrequest.py635
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/cacert.pem4361
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/client.py1393
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/compat.py362
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/compress.py126
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/config.py468
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/configloader.py287
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/configprovider.py1061
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/context.py128
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/credentials.py2391
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/crt/__init__.py27
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/crt/auth.py631
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/_retry.json292
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/accessanalyzer/2019-11-01/endpoint-rule-set-1.json.gzbin0 -> 1241 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/accessanalyzer/2019-11-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/accessanalyzer/2019-11-01/paginators-1.json70
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/accessanalyzer/2019-11-01/paginators-1.sdk-extras.json31
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/accessanalyzer/2019-11-01/service-2.json.gzbin0 -> 25266 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/account/2021-02-01/endpoint-rule-set-1.json.gzbin0 -> 1382 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/account/2021-02-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/account/2021-02-01/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/account/2021-02-01/service-2.json.gzbin0 -> 5514 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/acm-pca/2017-08-22/endpoint-rule-set-1.json.gzbin0 -> 1236 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/acm-pca/2017-08-22/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/acm-pca/2017-08-22/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/acm-pca/2017-08-22/service-2.json.gzbin0 -> 24708 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/acm-pca/2017-08-22/waiters-2.json64
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/acm/2015-12-08/endpoint-rule-set-1.json.gzbin0 -> 1232 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/acm/2015-12-08/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/acm/2015-12-08/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/acm/2015-12-08/service-2.json.gzbin0 -> 14187 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/acm/2015-12-08/waiters-2.json35
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/amp/2020-08-01/endpoint-rule-set-1.json.gzbin0 -> 1146 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/amp/2020-08-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/amp/2020-08-01/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/amp/2020-08-01/service-2.json.gzbin0 -> 10920 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/amp/2020-08-01/waiters-2.json76
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/amplify/2017-07-25/endpoint-rule-set-1.json.gzbin0 -> 1150 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/amplify/2017-07-25/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/amplify/2017-07-25/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/amplify/2017-07-25/service-2.json.gzbin0 -> 17121 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/amplifybackend/2020-08-11/endpoint-rule-set-1.json.gzbin0 -> 1152 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/amplifybackend/2020-08-11/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/amplifybackend/2020-08-11/service-2.json.gzbin0 -> 10990 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/amplifyuibuilder/2021-08-11/endpoint-rule-set-1.json.gzbin0 -> 1158 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/amplifyuibuilder/2021-08-11/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/amplifyuibuilder/2021-08-11/paginators-1.json43
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/amplifyuibuilder/2021-08-11/service-2.json.gzbin0 -> 15634 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/amplifyuibuilder/2021-08-11/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/apigateway/2015-07-09/endpoint-rule-set-1.json.gzbin0 -> 1152 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/apigateway/2015-07-09/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/apigateway/2015-07-09/paginators-1.json117
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/apigateway/2015-07-09/service-2.json.gzbin0 -> 38790 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/apigatewaymanagementapi/2018-11-29/endpoint-rule-set-1.json.gzbin0 -> 1150 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/apigatewaymanagementapi/2018-11-29/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/apigatewaymanagementapi/2018-11-29/service-2.json.gzbin0 -> 1422 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/apigatewayv2/2018-11-29/endpoint-rule-set-1.json.gzbin0 -> 1152 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/apigatewayv2/2018-11-29/paginators-1.json64
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/apigatewayv2/2018-11-29/service-2.json.gzbin0 -> 40680 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appconfig/2019-10-09/endpoint-rule-set-1.json.gzbin0 -> 1232 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appconfig/2019-10-09/examples-1.json720
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appconfig/2019-10-09/paginators-1.json52
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appconfig/2019-10-09/service-2.json.gzbin0 -> 19453 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appconfigdata/2021-11-11/endpoint-rule-set-1.json.gzbin0 -> 1237 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appconfigdata/2021-11-11/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appconfigdata/2021-11-11/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appconfigdata/2021-11-11/service-2.json.gzbin0 -> 3114 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appfabric/2023-05-19/endpoint-rule-set-1.json.gzbin0 -> 1290 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appfabric/2023-05-19/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appfabric/2023-05-19/service-2.json.gzbin0 -> 8601 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appfabric/2023-05-19/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appflow/2020-08-23/endpoint-rule-set-1.json.gzbin0 -> 1150 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appflow/2020-08-23/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appflow/2020-08-23/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appflow/2020-08-23/service-2.json.gzbin0 -> 32806 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appintegrations/2020-07-29/endpoint-rule-set-1.json.gzbin0 -> 1154 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appintegrations/2020-07-29/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appintegrations/2020-07-29/paginators-1.json40
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appintegrations/2020-07-29/service-2.json.gzbin0 -> 6412 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/application-autoscaling/2016-02-06/endpoint-rule-set-1.json.gzbin0 -> 1245 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/application-autoscaling/2016-02-06/examples-1.json221
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/application-autoscaling/2016-02-06/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/application-autoscaling/2016-02-06/service-2.json.gzbin0 -> 24099 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/application-insights/2018-11-25/endpoint-rule-set-1.json.gzbin0 -> 1160 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/application-insights/2018-11-25/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/application-insights/2018-11-25/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/application-insights/2018-11-25/service-2.json.gzbin0 -> 12427 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/application-signals/2024-04-15/endpoint-rule-set-1.json.gzbin0 -> 842 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/application-signals/2024-04-15/paginators-1.json40
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/application-signals/2024-04-15/paginators-1.sdk-extras.json31
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/application-signals/2024-04-15/service-2.json.gzbin0 -> 17179 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/applicationcostprofiler/2020-09-10/endpoint-rule-set-1.json.gzbin0 -> 1159 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/applicationcostprofiler/2020-09-10/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/applicationcostprofiler/2020-09-10/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/applicationcostprofiler/2020-09-10/service-2.json.gzbin0 -> 2827 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appmesh/2018-10-01/endpoint-rule-set-1.json.gzbin0 -> 1289 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appmesh/2018-10-01/examples-1.json4
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appmesh/2018-10-01/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appmesh/2018-10-01/service-2.json.gzbin0 -> 7902 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appmesh/2019-01-25/endpoint-rule-set-1.json.gzbin0 -> 1150 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appmesh/2019-01-25/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appmesh/2019-01-25/paginators-1.json52
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appmesh/2019-01-25/service-2.json.gzbin0 -> 23271 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/apprunner/2020-05-15/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/apprunner/2020-05-15/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/apprunner/2020-05-15/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/apprunner/2020-05-15/service-2.json.gzbin0 -> 19780 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appstream/2016-12-01/endpoint-rule-set-1.json.gzbin0 -> 1244 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appstream/2016-12-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appstream/2016-12-01/paginators-1.json60
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appstream/2016-12-01/service-2.json.gzbin0 -> 32138 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appstream/2016-12-01/waiters-2.json55
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appsync/2017-07-25/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appsync/2017-07-25/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appsync/2017-07-25/paginators-1.json76
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/appsync/2017-07-25/service-2.json.gzbin0 -> 30994 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/apptest/2022-12-06/endpoint-rule-set-1.json.gzbin0 -> 1297 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/apptest/2022-12-06/paginators-1.json40
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/apptest/2022-12-06/service-2.json.gzbin0 -> 9493 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/apptest/2022-12-06/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/arc-zonal-shift/2022-10-30/endpoint-rule-set-1.json.gzbin0 -> 1306 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/arc-zonal-shift/2022-10-30/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/arc-zonal-shift/2022-10-30/service-2.json.gzbin0 -> 10072 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/artifact/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1380 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/artifact/2018-05-10/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/artifact/2018-05-10/service-2.json.gzbin0 -> 3350 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/artifact/2018-05-10/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/athena/2017-05-18/endpoint-rule-set-1.json.gzbin0 -> 1149 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/athena/2017-05-18/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/athena/2017-05-18/paginators-1.json50
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/athena/2017-05-18/service-2.json.gzbin0 -> 31476 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/auditmanager/2017-07-25/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/auditmanager/2017-07-25/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/auditmanager/2017-07-25/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/auditmanager/2017-07-25/service-2.json.gzbin0 -> 27539 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/autoscaling-plans/2018-01-06/endpoint-rule-set-1.json.gzbin0 -> 1154 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/autoscaling-plans/2018-01-06/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/autoscaling-plans/2018-01-06/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/autoscaling-plans/2018-01-06/service-2.json.gzbin0 -> 9084 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/autoscaling/2011-01-01/endpoint-rule-set-1.json.gzbin0 -> 1238 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/autoscaling/2011-01-01/examples-1.json1696
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/autoscaling/2011-01-01/paginators-1.json70
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/autoscaling/2011-01-01/paginators-1.sdk-extras.json12
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/autoscaling/2011-01-01/service-2.json.gzbin0 -> 59967 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/b2bi/2022-06-23/endpoint-rule-set-1.json.gzbin0 -> 1299 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/b2bi/2022-06-23/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/b2bi/2022-06-23/service-2.json.gzbin0 -> 15113 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/backup-gateway/2021-01-01/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/backup-gateway/2021-01-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/backup-gateway/2021-01-01/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/backup-gateway/2021-01-01/service-2.json.gzbin0 -> 7373 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/backup/2018-11-15/endpoint-rule-set-1.json.gzbin0 -> 1149 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/backup/2018-11-15/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/backup/2018-11-15/paginators-1.json112
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/backup/2018-11-15/service-2.json.gzbin0 -> 50552 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/backupsearch/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 903 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/backupsearch/2018-05-10/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/backupsearch/2018-05-10/service-2.json.gzbin0 -> 7507 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/backupsearch/2018-05-10/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/batch/2016-08-10/endpoint-rule-set-1.json.gzbin0 -> 1268 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/batch/2016-08-10/examples-1.json711
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/batch/2016-08-10/paginators-1.json46
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/batch/2016-08-10/service-2.json.gzbin0 -> 55859 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bcm-data-exports/2023-11-26/endpoint-rule-set-1.json.gzbin0 -> 1288 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bcm-data-exports/2023-11-26/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bcm-data-exports/2023-11-26/service-2.json.gzbin0 -> 5122 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bcm-pricing-calculator/2024-06-19/endpoint-rule-set-1.json.gzbin0 -> 910 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bcm-pricing-calculator/2024-06-19/paginators-1.json64
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bcm-pricing-calculator/2024-06-19/service-2.json.gzbin0 -> 12946 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bcm-pricing-calculator/2024-06-19/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent-runtime/2023-07-26/endpoint-rule-set-1.json.gzbin0 -> 1311 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent-runtime/2023-07-26/paginators-1.json38
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent-runtime/2023-07-26/paginators-1.sdk-extras.json12
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent-runtime/2023-07-26/service-2.json.gzbin0 -> 41960 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent/2023-06-05/endpoint-rule-set-1.json.gzbin0 -> 1305 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent/2023-06-05/paginators-1.json88
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent/2023-06-05/service-2.json.gzbin0 -> 53542 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation-runtime/2024-06-13/endpoint-rule-set-1.json.gzbin0 -> 1319 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation-runtime/2024-06-13/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation-runtime/2024-06-13/service-2.json.gzbin0 -> 2678 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation/2023-07-26/endpoint-rule-set-1.json.gzbin0 -> 1312 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation/2023-07-26/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation/2023-07-26/service-2.json.gzbin0 -> 4763 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bedrock-runtime/2023-09-30/endpoint-rule-set-1.json.gzbin0 -> 1306 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bedrock-runtime/2023-09-30/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bedrock-runtime/2023-09-30/service-2.json.gzbin0 -> 17828 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bedrock-runtime/2023-09-30/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bedrock/2023-04-20/endpoint-rule-set-1.json.gzbin0 -> 1300 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bedrock/2023-04-20/paginators-1.json76
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bedrock/2023-04-20/service-2.json.gzbin0 -> 43466 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/bedrock/2023-04-20/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/billing/2023-09-07/endpoint-rule-set-1.json.gzbin0 -> 900 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/billing/2023-09-07/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/billing/2023-09-07/service-2.json.gzbin0 -> 4087 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/billing/2023-09-07/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/billingconductor/2021-07-30/endpoint-rule-set-1.json.gzbin0 -> 1313 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/billingconductor/2021-07-30/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/billingconductor/2021-07-30/paginators-1.json80
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/billingconductor/2021-07-30/service-2.json.gzbin0 -> 15064 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/billingconductor/2021-07-30/waiters-2.json4
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/braket/2019-09-01/endpoint-rule-set-1.json.gzbin0 -> 1149 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/braket/2019-09-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/braket/2019-09-01/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/braket/2019-09-01/service-2.json.gzbin0 -> 8100 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/budgets/2016-10-20/endpoint-rule-set-1.json.gzbin0 -> 1582 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/budgets/2016-10-20/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/budgets/2016-10-20/paginators-1.json52
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/budgets/2016-10-20/service-2.json.gzbin0 -> 12425 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ce/2017-10-25/endpoint-rule-set-1.json.gzbin0 -> 1591 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ce/2017-10-25/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ce/2017-10-25/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ce/2017-10-25/service-2.json.gzbin0 -> 41153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chatbot/2017-10-11/endpoint-rule-set-1.json.gzbin0 -> 1298 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chatbot/2017-10-11/paginators-1.json58
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chatbot/2017-10-11/service-2.json.gzbin0 -> 10732 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-identity/2021-04-20/endpoint-rule-set-1.json.gzbin0 -> 1152 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-identity/2021-04-20/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-identity/2021-04-20/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-identity/2021-04-20/service-2.json.gzbin0 -> 8111 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-media-pipelines/2021-07-15/endpoint-rule-set-1.json.gzbin0 -> 1159 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-media-pipelines/2021-07-15/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-media-pipelines/2021-07-15/service-2.json.gzbin0 -> 18799 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-meetings/2021-07-15/endpoint-rule-set-1.json.gzbin0 -> 1155 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-meetings/2021-07-15/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-meetings/2021-07-15/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-meetings/2021-07-15/service-2.json.gzbin0 -> 11217 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-messaging/2021-05-15/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-messaging/2021-05-15/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-messaging/2021-05-15/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-messaging/2021-05-15/service-2.json.gzbin0 -> 16213 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-voice/2022-08-03/endpoint-rule-set-1.json.gzbin0 -> 1303 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-voice/2022-08-03/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-voice/2022-08-03/service-2.json.gzbin0 -> 23567 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime/2018-05-01/endpoint-rule-set-1.json.gzbin0 -> 1306 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime/2018-05-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime/2018-05-01/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/chime/2018-05-01/service-2.json.gzbin0 -> 15347 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cleanrooms/2022-02-17/endpoint-rule-set-1.json.gzbin0 -> 1301 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cleanrooms/2022-02-17/paginators-1.json118
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cleanrooms/2022-02-17/service-2.json.gzbin0 -> 37268 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cleanrooms/2022-02-17/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cleanroomsml/2023-09-06/endpoint-rule-set-1.json.gzbin0 -> 1304 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cleanroomsml/2023-09-06/paginators-1.json94
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cleanroomsml/2023-09-06/service-2.json.gzbin0 -> 23199 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cleanroomsml/2023-09-06/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloud9/2017-09-23/endpoint-rule-set-1.json.gzbin0 -> 1150 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloud9/2017-09-23/examples-1.json315
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloud9/2017-09-23/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloud9/2017-09-23/service-2.json.gzbin0 -> 6088 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/endpoint-rule-set-1.json.gzbin0 -> 1156 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/paginators-1.sdk-extras.json12
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/service-2.json.gzbin0 -> 6492 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/waiters-2.json27
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2016-05-10/endpoint-rule-set-1.json.gzbin0 -> 1398 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2016-05-10/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2016-05-10/paginators-1.json100
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2016-05-10/service-2.json.gzbin0 -> 22958 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2017-01-11/endpoint-rule-set-1.json.gzbin0 -> 1241 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2017-01-11/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2017-01-11/paginators-1.json118
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2017-01-11/service-2.json.gzbin0 -> 23901 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudformation/2010-05-15/endpoint-rule-set-1.json.gzbin0 -> 1239 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudformation/2010-05-15/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudformation/2010-05-15/paginators-1.json136
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudformation/2010-05-15/service-2.json.gzbin0 -> 78471 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudformation/2010-05-15/waiters-2.json404
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront-keyvaluestore/2022-07-26/endpoint-rule-set-1.json.gzbin0 -> 2213 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront-keyvaluestore/2022-07-26/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront-keyvaluestore/2022-07-26/service-2.json.gzbin0 -> 2220 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-05-31/endpoint-rule-set-1.json.gzbin0 -> 1839 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-05-31/paginators-1.json32
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-05-31/service-2.json.gzbin0 -> 15298 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-05-31/waiters-2.json47
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-10-21/endpoint-rule-set-1.json.gzbin0 -> 1839 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-10-21/paginators-1.json32
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-10-21/service-2.json.gzbin0 -> 15887 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-10-21/waiters-2.json47
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-11-06/endpoint-rule-set-1.json.gzbin0 -> 1839 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-11-06/paginators-1.json32
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-11-06/service-2.json.gzbin0 -> 15959 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-11-06/waiters-2.json47
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-04-17/endpoint-rule-set-1.json.gzbin0 -> 1839 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-04-17/paginators-1.json32
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-04-17/service-2.json.gzbin0 -> 16213 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-04-17/waiters-2.json47
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-07-27/endpoint-rule-set-1.json.gzbin0 -> 1839 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-07-27/paginators-1.json32
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-07-27/service-2.json.gzbin0 -> 16702 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-07-27/waiters-2.json47
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-09-17/endpoint-rule-set-1.json.gzbin0 -> 1839 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-09-17/paginators-1.json32
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-09-17/service-2.json.gzbin0 -> 15890 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-09-17/waiters-2.json47
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-13/endpoint-rule-set-1.json.gzbin0 -> 1839 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-13/paginators-1.json32
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-13/service-2.json.gzbin0 -> 16358 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-13/waiters-2.json47
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-28/endpoint-rule-set-1.json.gzbin0 -> 1574 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-28/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-28/paginators-1.json32
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-28/service-2.json.gzbin0 -> 16279 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-28/waiters-2.json47
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-01/endpoint-rule-set-1.json.gzbin0 -> 1574 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-01/paginators-1.json32
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-01/service-2.json.gzbin0 -> 17725 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-01/waiters-2.json47
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-20/endpoint-rule-set-1.json.gzbin0 -> 1574 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-20/paginators-1.json32
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-20/service-2.json.gzbin0 -> 18123 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-20/waiters-2.json47
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-07/endpoint-rule-set-1.json.gzbin0 -> 1574 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-07/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-07/paginators-1.json32
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-07/service-2.json.gzbin0 -> 18444 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-07/waiters-2.json47
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-29/endpoint-rule-set-1.json.gzbin0 -> 1574 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-29/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-29/paginators-1.json32
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-29/service-2.json.gzbin0 -> 27522 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-29/waiters-2.json47
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-11-25/endpoint-rule-set-1.json.gzbin0 -> 1574 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-11-25/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-11-25/paginators-1.json32
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-11-25/service-2.json.gzbin0 -> 27955 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-11-25/waiters-2.json47
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-03-25/endpoint-rule-set-1.json.gzbin0 -> 1574 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-03-25/paginators-1.json32
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-03-25/service-2.json.gzbin0 -> 29088 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-03-25/waiters-2.json47
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-10-30/endpoint-rule-set-1.json.gzbin0 -> 1574 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-10-30/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-10-30/paginators-1.json32
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-10-30/service-2.json.gzbin0 -> 34767 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-10-30/waiters-2.json47
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-06-18/endpoint-rule-set-1.json.gzbin0 -> 1574 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-06-18/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-06-18/paginators-1.json32
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-06-18/service-2.json.gzbin0 -> 35482 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-06-18/waiters-2.json47
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-11-05/endpoint-rule-set-1.json.gzbin0 -> 1574 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-11-05/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-11-05/paginators-1.json32
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-11-05/service-2.json.gzbin0 -> 36144 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-11-05/waiters-2.json47
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2019-03-26/endpoint-rule-set-1.json.gzbin0 -> 1574 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2019-03-26/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2019-03-26/paginators-1.json32
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2019-03-26/service-2.json.gzbin0 -> 37652 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2019-03-26/waiters-2.json47
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2020-05-31/endpoint-rule-set-1.json.gzbin0 -> 1408 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2020-05-31/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2020-05-31/paginators-1.json44
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2020-05-31/service-2.json.gzbin0 -> 73899 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2020-05-31/waiters-2.json41
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudhsm/2014-05-30/endpoint-rule-set-1.json.gzbin0 -> 1148 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudhsm/2014-05-30/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudhsm/2014-05-30/paginators-1.json19
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudhsm/2014-05-30/service-2.json.gzbin0 -> 5556 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudhsmv2/2017-04-28/endpoint-rule-set-1.json.gzbin0 -> 1244 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudhsmv2/2017-04-28/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudhsmv2/2017-04-28/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudhsmv2/2017-04-28/service-2.json.gzbin0 -> 8056 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2011-02-01/endpoint-rule-set-1.json.gzbin0 -> 1149 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2011-02-01/service-2.json.gzbin0 -> 9599 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2013-01-01/endpoint-rule-set-1.json.gzbin0 -> 1150 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2013-01-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2013-01-01/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2013-01-01/service-2.json.gzbin0 -> 12084 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudsearchdomain/2013-01-01/endpoint-rule-set-1.json.gzbin0 -> 1154 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudsearchdomain/2013-01-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudsearchdomain/2013-01-01/service-2.json.gzbin0 -> 9099 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudtrail-data/2021-08-11/endpoint-rule-set-1.json.gzbin0 -> 1295 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudtrail-data/2021-08-11/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudtrail-data/2021-08-11/service-2.json.gzbin0 -> 2165 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudtrail/2013-11-01/endpoint-rule-set-1.json.gzbin0 -> 1235 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudtrail/2013-11-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudtrail/2013-11-01/paginators-1.json37
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudtrail/2013-11-01/service-2.json.gzbin0 -> 42225 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudwatch/2010-08-01/endpoint-rule-set-1.json.gzbin0 -> 1237 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudwatch/2010-08-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudwatch/2010-08-01/paginators-1.json47
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudwatch/2010-08-01/service-2.json.gzbin0 -> 40155 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cloudwatch/2010-08-01/waiters-2.json31
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codeartifact/2018-09-22/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codeartifact/2018-09-22/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codeartifact/2018-09-22/paginators-1.json64
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codeartifact/2018-09-22/paginators-1.sdk-extras.json24
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codeartifact/2018-09-22/service-2.json.gzbin0 -> 23319 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codebuild/2016-10-06/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codebuild/2016-10-06/examples-1.json281
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codebuild/2016-10-06/paginators-1.json73
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codebuild/2016-10-06/service-2.json.gzbin0 -> 44523 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codecatalyst/2022-09-28/endpoint-rule-set-1.json.gzbin0 -> 851 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codecatalyst/2022-09-28/paginators-1.json63
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codecatalyst/2022-09-28/service-2.json.gzbin0 -> 13989 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codecatalyst/2022-09-28/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codecommit/2015-04-13/endpoint-rule-set-1.json.gzbin0 -> 1152 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codecommit/2015-04-13/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codecommit/2015-04-13/paginators-1.json44
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codecommit/2015-04-13/service-2.json.gzbin0 -> 40956 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codeconnections/2023-12-01/endpoint-rule-set-1.json.gzbin0 -> 1304 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codeconnections/2023-12-01/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codeconnections/2023-12-01/service-2.json.gzbin0 -> 10010 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codedeploy/2014-10-06/endpoint-rule-set-1.json.gzbin0 -> 1152 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codedeploy/2014-10-06/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codedeploy/2014-10-06/paginators-1.json49
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codedeploy/2014-10-06/service-2.json.gzbin0 -> 31904 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codedeploy/2014-10-06/waiters-2.json30
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codeguru-reviewer/2019-09-19/endpoint-rule-set-1.json.gzbin0 -> 1156 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codeguru-reviewer/2019-09-19/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codeguru-reviewer/2019-09-19/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codeguru-reviewer/2019-09-19/service-2.json.gzbin0 -> 11762 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codeguru-reviewer/2019-09-19/waiters-2.json58
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codeguru-security/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1308 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codeguru-security/2018-05-10/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codeguru-security/2018-05-10/service-2.json.gzbin0 -> 7914 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codeguruprofiler/2019-07-18/endpoint-rule-set-1.json.gzbin0 -> 1157 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codeguruprofiler/2019-07-18/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codeguruprofiler/2019-07-18/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codeguruprofiler/2019-07-18/service-2.json.gzbin0 -> 14592 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codepipeline/2015-07-09/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codepipeline/2015-07-09/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codepipeline/2015-07-09/paginators-1.json45
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codepipeline/2015-07-09/service-2.json.gzbin0 -> 35979 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codestar-connections/2019-12-01/endpoint-rule-set-1.json.gzbin0 -> 1156 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codestar-connections/2019-12-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codestar-connections/2019-12-01/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codestar-connections/2019-12-01/service-2.json.gzbin0 -> 9877 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codestar-notifications/2019-10-15/endpoint-rule-set-1.json.gzbin0 -> 1156 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codestar-notifications/2019-10-15/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codestar-notifications/2019-10-15/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/codestar-notifications/2019-10-15/service-2.json.gzbin0 -> 5528 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cognito-identity/2014-06-30/endpoint-rule-set-1.json.gzbin0 -> 1351 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cognito-identity/2014-06-30/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cognito-identity/2014-06-30/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cognito-identity/2014-06-30/service-2.json.gzbin0 -> 10267 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cognito-idp/2016-04-18/endpoint-rule-set-1.json.gzbin0 -> 1347 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cognito-idp/2016-04-18/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cognito-idp/2016-04-18/paginators-1.json58
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cognito-idp/2016-04-18/service-2.json.gzbin0 -> 110052 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cognito-sync/2014-06-30/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cognito-sync/2014-06-30/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cognito-sync/2014-06-30/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cognito-sync/2014-06-30/service-2.json.gzbin0 -> 7316 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/comprehend/2017-11-27/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/comprehend/2017-11-27/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/comprehend/2017-11-27/paginators-1.json64
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/comprehend/2017-11-27/service-2.json.gzbin0 -> 43031 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/comprehendmedical/2018-10-30/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/comprehendmedical/2018-10-30/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/comprehendmedical/2018-10-30/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/comprehendmedical/2018-10-30/service-2.json.gzbin0 -> 10270 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/compute-optimizer/2019-11-01/endpoint-rule-set-1.json.gzbin0 -> 1157 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/compute-optimizer/2019-11-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/compute-optimizer/2019-11-01/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/compute-optimizer/2019-11-01/service-2.json.gzbin0 -> 40447 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/config/2014-11-12/endpoint-rule-set-1.json.gzbin0 -> 1233 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/config/2014-11-12/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/config/2014-11-12/paginators-1.json198
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/config/2014-11-12/service-2.json.gzbin0 -> 64403 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/connect-contact-lens/2020-08-21/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/connect-contact-lens/2020-08-21/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/connect-contact-lens/2020-08-21/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/connect-contact-lens/2020-08-21/service-2.json.gzbin0 -> 3170 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/connect/2017-08-08/endpoint-rule-set-1.json.gzbin0 -> 1233 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/connect/2017-08-08/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/connect/2017-08-08/paginators-1.json440
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/connect/2017-08-08/service-2.json.gzbin0 -> 137274 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/connectcampaigns/2021-01-30/endpoint-rule-set-1.json.gzbin0 -> 1158 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/connectcampaigns/2021-01-30/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/connectcampaigns/2021-01-30/service-2.json.gzbin0 -> 5276 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/connectcampaignsv2/2024-04-23/endpoint-rule-set-1.json.gzbin0 -> 1307 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/connectcampaignsv2/2024-04-23/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/connectcampaignsv2/2024-04-23/service-2.json.gzbin0 -> 8575 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/connectcases/2022-10-03/endpoint-rule-set-1.json.gzbin0 -> 1296 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/connectcases/2022-10-03/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/connectcases/2022-10-03/service-2.json.gzbin0 -> 14961 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/connectparticipant/2018-09-07/endpoint-rule-set-1.json.gzbin0 -> 1240 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/connectparticipant/2018-09-07/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/connectparticipant/2018-09-07/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/connectparticipant/2018-09-07/service-2.json.gzbin0 -> 7495 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/controlcatalog/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1304 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/controlcatalog/2018-05-10/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/controlcatalog/2018-05-10/service-2.json.gzbin0 -> 5471 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/controlcatalog/2018-05-10/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/controltower/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/controltower/2018-05-10/paginators-1.json40
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/controltower/2018-05-10/service-2.json.gzbin0 -> 12344 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cost-optimization-hub/2022-07-26/endpoint-rule-set-1.json.gzbin0 -> 1311 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cost-optimization-hub/2022-07-26/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cost-optimization-hub/2022-07-26/paginators-1.sdk-extras.json20
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cost-optimization-hub/2022-07-26/service-2.json.gzbin0 -> 8154 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cost-optimization-hub/2022-07-26/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cur/2017-01-06/endpoint-rule-set-1.json.gzbin0 -> 1147 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cur/2017-01-06/examples-1.json102
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cur/2017-01-06/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/cur/2017-01-06/service-2.json.gzbin0 -> 3835 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/customer-profiles/2020-08-15/endpoint-rule-set-1.json.gzbin0 -> 1150 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/customer-profiles/2020-08-15/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/customer-profiles/2020-08-15/paginators-1.json40
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/customer-profiles/2020-08-15/paginators-1.sdk-extras.json15
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/customer-profiles/2020-08-15/service-2.json.gzbin0 -> 39956 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/databrew/2017-07-25/endpoint-rule-set-1.json.gzbin0 -> 1210 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/databrew/2017-07-25/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/databrew/2017-07-25/paginators-1.json52
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/databrew/2017-07-25/service-2.json.gzbin0 -> 20270 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dataexchange/2017-07-25/endpoint-rule-set-1.json.gzbin0 -> 1154 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dataexchange/2017-07-25/paginators-1.json46
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dataexchange/2017-07-25/service-2.json.gzbin0 -> 17221 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dataexchange/2017-07-25/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/datapipeline/2012-10-29/endpoint-rule-set-1.json.gzbin0 -> 1150 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/datapipeline/2012-10-29/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/datapipeline/2012-10-29/paginators-1.json23
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/datapipeline/2012-10-29/service-2.json.gzbin0 -> 9587 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/datasync/2018-11-09/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/datasync/2018-11-09/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/datasync/2018-11-09/paginators-1.json52
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/datasync/2018-11-09/service-2.json.gzbin0 -> 45008 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/datazone/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1127 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/datazone/2018-05-10/paginators-1.json214
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/datazone/2018-05-10/paginators-1.sdk-extras.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/datazone/2018-05-10/service-2.json.gzbin0 -> 67638 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dax/2017-04-19/endpoint-rule-set-1.json.gzbin0 -> 1144 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dax/2017-04-19/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dax/2017-04-19/paginators-1.json45
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dax/2017-04-19/service-2.json.gzbin0 -> 9746 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/deadline/2023-10-12/endpoint-rule-set-1.json.gzbin0 -> 1298 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/deadline/2023-10-12/paginators-1.json178
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/deadline/2023-10-12/paginators-1.sdk-extras.json13
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/deadline/2023-10-12/service-2.json.gzbin0 -> 44086 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/deadline/2023-10-12/waiters-2.json143
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/detective/2018-10-26/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/detective/2018-10-26/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/detective/2018-10-26/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/detective/2018-10-26/service-2.json.gzbin0 -> 13190 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/devicefarm/2015-06-23/endpoint-rule-set-1.json.gzbin0 -> 1152 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/devicefarm/2015-06-23/examples-1.json1242
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/devicefarm/2015-06-23/paginators-1.json110
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/devicefarm/2015-06-23/service-2.json.gzbin0 -> 30990 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/devops-guru/2020-12-01/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/devops-guru/2020-12-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/devops-guru/2020-12-01/paginators-1.json125
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/devops-guru/2020-12-01/service-2.json.gzbin0 -> 25040 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/directconnect/2012-10-25/endpoint-rule-set-1.json.gzbin0 -> 1155 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/directconnect/2012-10-25/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/directconnect/2012-10-25/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/directconnect/2012-10-25/service-2.json.gzbin0 -> 20370 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/discovery/2015-11-01/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/discovery/2015-11-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/discovery/2015-11-01/paginators-1.json46
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/discovery/2015-11-01/service-2.json.gzbin0 -> 19017 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dlm/2018-01-12/endpoint-rule-set-1.json.gzbin0 -> 1232 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dlm/2018-01-12/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dlm/2018-01-12/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dlm/2018-01-12/service-2.json.gzbin0 -> 12223 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dms/2016-01-01/endpoint-rule-set-1.json.gzbin0 -> 1302 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dms/2016-01-01/examples-1.json1074
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dms/2016-01-01/paginators-1.json88
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dms/2016-01-01/service-2.json.gzbin0 -> 82037 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dms/2016-01-01/waiters-2.json330
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/docdb-elastic/2022-11-28/endpoint-rule-set-1.json.gzbin0 -> 1304 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/docdb-elastic/2022-11-28/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/docdb-elastic/2022-11-28/service-2.json.gzbin0 -> 7623 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/endpoint-rule-set-1.json.gzbin0 -> 1232 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/paginators-1.json82
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/service-2.json.gzbin0 -> 33423 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/service-2.sdk-extras.json23
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/waiters-2.json90
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/drs/2020-02-26/endpoint-rule-set-1.json.gzbin0 -> 1146 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/drs/2020-02-26/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/drs/2020-02-26/paginators-1.json70
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/drs/2020-02-26/service-2.json.gzbin0 -> 21053 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ds-data/2023-05-31/endpoint-rule-set-1.json.gzbin0 -> 1298 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ds-data/2023-05-31/paginators-1.json40
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ds-data/2023-05-31/paginators-1.sdk-extras.json46
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ds-data/2023-05-31/service-2.json.gzbin0 -> 7825 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ds/2015-04-16/endpoint-rule-set-1.json.gzbin0 -> 1146 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ds/2015-04-16/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ds/2015-04-16/paginators-1.json86
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ds/2015-04-16/service-2.json.gzbin0 -> 25917 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dsql/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 832 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dsql/2018-05-10/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dsql/2018-05-10/service-2.json.gzbin0 -> 4240 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dsql/2018-05-10/waiters-2.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2011-12-05/endpoint-rule-set-1.json.gzbin0 -> 1343 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2011-12-05/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2012-08-10/endpoint-rule-set-1.json.gzbin0 -> 2629 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2012-08-10/examples-1.json631
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2012-08-10/paginators-1.json47
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2012-08-10/service-2.json.gzbin0 -> 80435 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2012-08-10/waiters-2.json35
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dynamodbstreams/2012-08-10/endpoint-rule-set-1.json.gzbin0 -> 1671 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dynamodbstreams/2012-08-10/examples-1.json212
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dynamodbstreams/2012-08-10/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/dynamodbstreams/2012-08-10/service-2.json.gzbin0 -> 6799 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ebs/2019-11-02/endpoint-rule-set-1.json.gzbin0 -> 1144 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ebs/2019-11-02/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ebs/2019-11-02/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ebs/2019-11-02/service-2.json.gzbin0 -> 6371 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2-instance-connect/2018-04-02/endpoint-rule-set-1.json.gzbin0 -> 1162 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2-instance-connect/2018-04-02/examples-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2-instance-connect/2018-04-02/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2-instance-connect/2018-04-02/service-2.json.gzbin0 -> 2282 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-09-01/endpoint-rule-set-1.json.gzbin0 -> 1237 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-09-01/paginators-1.json45
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-09-01/service-2.json.gzbin0 -> 71841 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-09-01/waiters-2.json341
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-10-01/endpoint-rule-set-1.json.gzbin0 -> 1237 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-10-01/paginators-1.json51
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-10-01/service-2.json.gzbin0 -> 75362 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-10-01/waiters-2.json436
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-03-01/endpoint-rule-set-1.json.gzbin0 -> 1237 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-03-01/paginators-1.json51
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-03-01/service-2.json.gzbin0 -> 77885 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-03-01/waiters-2.json436
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-04-15/endpoint-rule-set-1.json.gzbin0 -> 1237 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-04-15/paginators-1.json51
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-04-15/service-2.json.gzbin0 -> 90171 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-04-15/waiters-2.json458
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-10-01/endpoint-rule-set-1.json.gzbin0 -> 1391 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-10-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-10-01/paginators-1.json63
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-10-01/service-2.json.gzbin0 -> 107913 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-10-01/waiters-2.json589
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-04-01/endpoint-rule-set-1.json.gzbin0 -> 1391 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-04-01/examples-1.json3729
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-04-01/paginators-1.json63
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-04-01/service-2.json.gzbin0 -> 112481 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-04-01/waiters-2.json607
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-09-15/endpoint-rule-set-1.json.gzbin0 -> 1391 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-09-15/examples-1.json3740
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-09-15/paginators-1.json63
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-09-15/service-2.json.gzbin0 -> 114400 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-09-15/waiters-2.json593
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/endpoint-rule-set-1.json.gzbin0 -> 1233 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/examples-1.json5048
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/paginators-1.json888
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/paginators-1.sdk-extras.json13
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/service-2.json.gzbin0 -> 413479 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/waiters-2.json726
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ecr-public/2020-10-30/endpoint-rule-set-1.json.gzbin0 -> 1155 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ecr-public/2020-10-30/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ecr-public/2020-10-30/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ecr-public/2020-10-30/service-2.json.gzbin0 -> 10719 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ecr/2015-09-21/endpoint-rule-set-1.json.gzbin0 -> 1262 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ecr/2015-09-21/examples-1.json195
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ecr/2015-09-21/paginators-1.json66
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ecr/2015-09-21/service-2.json.gzbin0 -> 24401 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ecr/2015-09-21/waiters-2.json45
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ecs/2014-11-13/endpoint-rule-set-1.json.gzbin0 -> 1146 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ecs/2014-11-13/examples-1.json1137
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ecs/2014-11-13/paginators-1.json58
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ecs/2014-11-13/service-2.json.gzbin0 -> 103657 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ecs/2014-11-13/waiters-2.json93
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/efs/2015-02-01/endpoint-rule-set-1.json.gzbin0 -> 1157 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/efs/2015-02-01/examples-1.json294
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/efs/2015-02-01/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/efs/2015-02-01/service-2.json.gzbin0 -> 23375 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/eks-auth/2023-11-26/endpoint-rule-set-1.json.gzbin0 -> 1127 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/eks-auth/2023-11-26/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/eks-auth/2023-11-26/service-2.json.gzbin0 -> 2343 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/eks-auth/2023-11-26/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/endpoint-rule-set-1.json.gzbin0 -> 1267 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/examples-1.json135
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/paginators-1.json92
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/service-2.json.gzbin0 -> 45479 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/service-2.sdk-extras.json8
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/waiters-2.json177
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elasticache/2014-09-30/endpoint-rule-set-1.json.gzbin0 -> 1241 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elasticache/2014-09-30/paginators-1.json76
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elasticache/2014-09-30/service-2.json.gzbin0 -> 22920 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elasticache/2014-09-30/waiters-2.json139
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elasticache/2015-02-02/endpoint-rule-set-1.json.gzbin0 -> 1238 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elasticache/2015-02-02/examples-1.json3149
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elasticache/2015-02-02/paginators-1.json118
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elasticache/2015-02-02/service-2.json.gzbin0 -> 56450 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elasticache/2015-02-02/waiters-2.json143
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elasticbeanstalk/2010-12-01/endpoint-rule-set-1.json.gzbin0 -> 1242 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elasticbeanstalk/2010-12-01/examples-1.json1109
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elasticbeanstalk/2010-12-01/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elasticbeanstalk/2010-12-01/service-2.json.gzbin0 -> 27770 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elasticbeanstalk/2010-12-01/waiters-2.json63
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elastictranscoder/2012-09-25/endpoint-rule-set-1.json.gzbin0 -> 1157 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elastictranscoder/2012-09-25/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elastictranscoder/2012-09-25/paginators-1.json24
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elastictranscoder/2012-09-25/service-2.json.gzbin0 -> 35481 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elastictranscoder/2012-09-25/waiters-2.json30
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elb/2012-06-01/endpoint-rule-set-1.json.gzbin0 -> 1244 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elb/2012-06-01/examples-1.json1036
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elb/2012-06-01/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elb/2012-06-01/service-2.json.gzbin0 -> 13226 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elb/2012-06-01/waiters-2.json54
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elbv2/2015-12-01/endpoint-rule-set-1.json.gzbin0 -> 1244 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elbv2/2015-12-01/examples-1.json1384
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elbv2/2015-12-01/paginators-1.json46
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elbv2/2015-12-01/service-2.json.gzbin0 -> 30897 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/elbv2/2015-12-01/waiters-2.json100
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/emr-containers/2020-10-01/endpoint-rule-set-1.json.gzbin0 -> 1239 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/emr-containers/2020-10-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/emr-containers/2020-10-01/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/emr-containers/2020-10-01/service-2.json.gzbin0 -> 11185 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/emr-serverless/2021-07-13/endpoint-rule-set-1.json.gzbin0 -> 1154 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/emr-serverless/2021-07-13/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/emr-serverless/2021-07-13/service-2.json.gzbin0 -> 11455 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/emr/2009-03-31/endpoint-rule-set-1.json.gzbin0 -> 1241 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/emr/2009-03-31/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/emr/2009-03-31/paginators-1.json54
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/emr/2009-03-31/service-2.json.gzbin0 -> 45567 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/emr/2009-03-31/waiters-2.json86
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/endpoints.json37672
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/entityresolution/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1305 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/entityresolution/2018-05-10/paginators-1.json46
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/entityresolution/2018-05-10/service-2.json.gzbin0 -> 15108 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/es/2015-01-01/endpoint-rule-set-1.json.gzbin0 -> 1313 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/es/2015-01-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/es/2015-01-01/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/es/2015-01-01/service-2.json.gzbin0 -> 29501 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/events/2014-02-03/endpoint-rule-set-1.json.gzbin0 -> 1856 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/events/2014-02-03/service-2.json.gzbin0 -> 5254 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/events/2015-10-07/endpoint-rule-set-1.json.gzbin0 -> 1741 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/events/2015-10-07/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/events/2015-10-07/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/events/2015-10-07/service-2.json.gzbin0 -> 36012 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/evidently/2021-02-01/endpoint-rule-set-1.json.gzbin0 -> 1148 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/evidently/2021-02-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/evidently/2021-02-01/paginators-1.json40
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/evidently/2021-02-01/service-2.json.gzbin0 -> 20415 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/finspace-data/2020-07-13/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/finspace-data/2020-07-13/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/finspace-data/2020-07-13/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/finspace-data/2020-07-13/service-2.json.gzbin0 -> 14476 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/finspace/2021-03-12/endpoint-rule-set-1.json.gzbin0 -> 1150 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/finspace/2021-03-12/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/finspace/2021-03-12/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/finspace/2021-03-12/service-2.json.gzbin0 -> 30465 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/firehose/2015-08-04/endpoint-rule-set-1.json.gzbin0 -> 1150 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/firehose/2015-08-04/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/firehose/2015-08-04/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/firehose/2015-08-04/service-2.json.gzbin0 -> 36317 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/fis/2020-12-01/endpoint-rule-set-1.json.gzbin0 -> 1232 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/fis/2020-12-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/fis/2020-12-01/paginators-1.json40
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/fis/2020-12-01/service-2.json.gzbin0 -> 10129 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/fms/2018-01-01/endpoint-rule-set-1.json.gzbin0 -> 1147 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/fms/2018-01-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/fms/2018-01-01/paginators-1.json52
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/fms/2018-01-01/service-2.json.gzbin0 -> 34804 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/forecast/2018-06-26/endpoint-rule-set-1.json.gzbin0 -> 1147 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/forecast/2018-06-26/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/forecast/2018-06-26/paginators-1.json88
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/forecast/2018-06-26/service-2.json.gzbin0 -> 40055 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/forecastquery/2018-06-26/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/forecastquery/2018-06-26/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/forecastquery/2018-06-26/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/forecastquery/2018-06-26/service-2.json.gzbin0 -> 2160 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/frauddetector/2019-11-15/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/frauddetector/2019-11-15/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/frauddetector/2019-11-15/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/frauddetector/2019-11-15/service-2.json.gzbin0 -> 24330 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/freetier/2023-09-07/endpoint-rule-set-1.json.gzbin0 -> 1422 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/freetier/2023-09-07/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/freetier/2023-09-07/service-2.json.gzbin0 -> 2803 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/fsx/2018-03-01/endpoint-rule-set-1.json.gzbin0 -> 1147 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/fsx/2018-03-01/examples-1.json438
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/fsx/2018-03-01/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/fsx/2018-03-01/service-2.json.gzbin0 -> 74919 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/gamelift/2015-10-01/endpoint-rule-set-1.json.gzbin0 -> 1150 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/gamelift/2015-10-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/gamelift/2015-10-01/paginators-1.json160
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/gamelift/2015-10-01/service-2.json.gzbin0 -> 113393 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/gameliftstreams/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 840 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/gameliftstreams/2018-05-10/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/gameliftstreams/2018-05-10/service-2.json.gzbin0 -> 19784 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/gameliftstreams/2018-05-10/waiters-2.json88
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/geo-maps/2020-11-19/endpoint-rule-set-1.json.gzbin0 -> 1642 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/geo-maps/2020-11-19/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/geo-maps/2020-11-19/service-2.json.gzbin0 -> 6586 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/geo-places/2020-11-19/endpoint-rule-set-1.json.gzbin0 -> 1648 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/geo-places/2020-11-19/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/geo-places/2020-11-19/service-2.json.gzbin0 -> 12379 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/geo-routes/2020-11-19/endpoint-rule-set-1.json.gzbin0 -> 1647 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/geo-routes/2020-11-19/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/geo-routes/2020-11-19/service-2.json.gzbin0 -> 33478 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/glacier/2012-06-01/endpoint-rule-set-1.json.gzbin0 -> 1393 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/glacier/2012-06-01/examples-1.json806
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/glacier/2012-06-01/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/glacier/2012-06-01/service-2.json.gzbin0 -> 20913 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/glacier/2012-06-01/waiters-2.json39
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/globalaccelerator/2018-08-08/endpoint-rule-set-1.json.gzbin0 -> 1156 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/globalaccelerator/2018-08-08/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/globalaccelerator/2018-08-08/paginators-1.json70
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/globalaccelerator/2018-08-08/service-2.json.gzbin0 -> 21919 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/glue/2017-03-31/endpoint-rule-set-1.json.gzbin0 -> 1147 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/glue/2017-03-31/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/glue/2017-03-31/paginators-1.json175
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/glue/2017-03-31/paginators-1.sdk-extras.json14
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/glue/2017-03-31/service-2.json.gzbin0 -> 154990 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/grafana/2020-08-18/endpoint-rule-set-1.json.gzbin0 -> 1150 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/grafana/2020-08-18/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/grafana/2020-08-18/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/grafana/2020-08-18/paginators-1.sdk-extras.json18
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/grafana/2020-08-18/service-2.json.gzbin0 -> 15023 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/greengrass/2017-06-07/endpoint-rule-set-1.json.gzbin0 -> 1356 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/greengrass/2017-06-07/paginators-1.json118
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/greengrass/2017-06-07/service-2.json.gzbin0 -> 17141 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/greengrassv2/2020-11-30/endpoint-rule-set-1.json.gzbin0 -> 1364 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/greengrassv2/2020-11-30/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/greengrassv2/2020-11-30/paginators-1.json46
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/greengrassv2/2020-11-30/service-2.json.gzbin0 -> 20273 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/groundstation/2019-05-23/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/groundstation/2019-05-23/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/groundstation/2019-05-23/paginators-1.json46
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/groundstation/2019-05-23/service-2.json.gzbin0 -> 13952 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/groundstation/2019-05-23/waiters-2.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/guardduty/2017-11-28/endpoint-rule-set-1.json.gzbin0 -> 1237 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/guardduty/2017-11-28/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/guardduty/2017-11-28/paginators-1.json64
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/guardduty/2017-11-28/service-2.json.gzbin0 -> 52280 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/health/2016-08-04/endpoint-rule-set-1.json.gzbin0 -> 1306 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/health/2016-08-04/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/health/2016-08-04/paginators-1.json52
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/health/2016-08-04/service-2.json.gzbin0 -> 10240 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/healthlake/2017-07-01/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/healthlake/2017-07-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/healthlake/2017-07-01/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/healthlake/2017-07-01/service-2.json.gzbin0 -> 6454 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iam/2010-05-08/endpoint-rule-set-1.json.gzbin0 -> 1720 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iam/2010-05-08/examples-1.json1577
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iam/2010-05-08/paginators-1.json254
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iam/2010-05-08/service-2.json.gzbin0 -> 72301 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iam/2010-05-08/waiters-2.json73
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/identitystore/2020-06-15/endpoint-rule-set-1.json.gzbin0 -> 1242 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/identitystore/2020-06-15/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/identitystore/2020-06-15/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/identitystore/2020-06-15/service-2.json.gzbin0 -> 7351 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/imagebuilder/2019-12-02/endpoint-rule-set-1.json.gzbin0 -> 1239 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/imagebuilder/2019-12-02/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/imagebuilder/2019-12-02/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/imagebuilder/2019-12-02/service-2.json.gzbin0 -> 41253 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/importexport/2010-06-01/endpoint-rule-set-1.json.gzbin0 -> 1599 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/importexport/2010-06-01/paginators-1.json11
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/importexport/2010-06-01/service-2.json.gzbin0 -> 4733 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/inspector-scan/2023-08-08/endpoint-rule-set-1.json.gzbin0 -> 1305 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/inspector-scan/2023-08-08/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/inspector-scan/2023-08-08/service-2.json.gzbin0 -> 1460 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/inspector/2015-08-18/endpoint-rule-set-1.json.gzbin0 -> 1147 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/inspector/2015-08-18/service-2.json.gzbin0 -> 8021 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/inspector/2016-02-16/endpoint-rule-set-1.json.gzbin0 -> 1148 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/inspector/2016-02-16/examples-1.json1148
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/inspector/2016-02-16/paginators-1.json58
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/inspector/2016-02-16/service-2.json.gzbin0 -> 14137 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/inspector2/2020-06-08/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/inspector2/2020-06-08/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/inspector2/2020-06-08/paginators-1.json92
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/inspector2/2020-06-08/paginators-1.sdk-extras.json17
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/inspector2/2020-06-08/service-2.json.gzbin0 -> 36798 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/internetmonitor/2021-06-03/endpoint-rule-set-1.json.gzbin0 -> 1157 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/internetmonitor/2021-06-03/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/internetmonitor/2021-06-03/service-2.json.gzbin0 -> 13894 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/internetmonitor/2021-06-03/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/invoicing/2024-12-01/endpoint-rule-set-1.json.gzbin0 -> 901 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/invoicing/2024-12-01/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/invoicing/2024-12-01/service-2.json.gzbin0 -> 4479 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/invoicing/2024-12-01/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iot-data/2015-05-28/endpoint-rule-set-1.json.gzbin0 -> 1484 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iot-data/2015-05-28/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iot-data/2015-05-28/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iot-data/2015-05-28/service-2.json.gzbin0 -> 4293 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iot-jobs-data/2017-09-29/endpoint-rule-set-1.json.gzbin0 -> 1155 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iot-jobs-data/2017-09-29/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iot-jobs-data/2017-09-29/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iot-jobs-data/2017-09-29/service-2.json.gzbin0 -> 5041 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iot-managed-integrations/2025-03-03/endpoint-rule-set-1.json.gzbin0 -> 845 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iot-managed-integrations/2025-03-03/paginators-1.json70
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iot-managed-integrations/2025-03-03/service-2.json.gzbin0 -> 18046 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iot/2015-05-28/endpoint-rule-set-1.json.gzbin0 -> 1268 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iot/2015-05-28/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iot/2015-05-28/paginators-1.json390
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iot/2015-05-28/service-2.json.gzbin0 -> 122460 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotanalytics/2017-11-27/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotanalytics/2017-11-27/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotanalytics/2017-11-27/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotanalytics/2017-11-27/service-2.json.gzbin0 -> 18162 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotdeviceadvisor/2020-09-18/endpoint-rule-set-1.json.gzbin0 -> 1159 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotdeviceadvisor/2020-09-18/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotdeviceadvisor/2020-09-18/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotdeviceadvisor/2020-09-18/service-2.json.gzbin0 -> 5325 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotevents-data/2018-10-23/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotevents-data/2018-10-23/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotevents-data/2018-10-23/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotevents-data/2018-10-23/service-2.json.gzbin0 -> 6392 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotevents/2018-07-27/endpoint-rule-set-1.json.gzbin0 -> 1150 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotevents/2018-07-27/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotevents/2018-07-27/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotevents/2018-07-27/service-2.json.gzbin0 -> 16090 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotfleethub/2020-11-03/endpoint-rule-set-1.json.gzbin0 -> 1156 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotfleethub/2020-11-03/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotfleethub/2020-11-03/paginators-1.json9
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotfleethub/2020-11-03/service-2.json.gzbin0 -> 2835 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotfleetwise/2021-06-17/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotfleetwise/2021-06-17/paginators-1.json88
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotfleetwise/2021-06-17/service-2.json.gzbin0 -> 30093 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotfleetwise/2021-06-17/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotsecuretunneling/2018-10-05/endpoint-rule-set-1.json.gzbin0 -> 1403 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotsecuretunneling/2018-10-05/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotsecuretunneling/2018-10-05/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotsecuretunneling/2018-10-05/service-2.json.gzbin0 -> 3431 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/endpoint-rule-set-1.json.gzbin0 -> 1152 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/paginators-1.json136
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/paginators-1.sdk-extras.json12
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/service-2.json.gzbin0 -> 52387 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/waiters-2.json92
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotthingsgraph/2018-09-06/endpoint-rule-set-1.json.gzbin0 -> 1218 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotthingsgraph/2018-09-06/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotthingsgraph/2018-09-06/paginators-1.json64
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotthingsgraph/2018-09-06/service-2.json.gzbin0 -> 10349 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iottwinmaker/2021-11-29/endpoint-rule-set-1.json.gzbin0 -> 1154 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iottwinmaker/2021-11-29/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iottwinmaker/2021-11-29/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iottwinmaker/2021-11-29/service-2.json.gzbin0 -> 16782 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iottwinmaker/2021-11-29/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotwireless/2020-11-22/endpoint-rule-set-1.json.gzbin0 -> 1155 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotwireless/2020-11-22/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotwireless/2020-11-22/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/iotwireless/2020-11-22/service-2.json.gzbin0 -> 36654 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ivs-realtime/2020-07-14/endpoint-rule-set-1.json.gzbin0 -> 1302 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ivs-realtime/2020-07-14/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ivs-realtime/2020-07-14/service-2.json.gzbin0 -> 17012 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ivs-realtime/2020-07-14/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ivs/2020-07-14/endpoint-rule-set-1.json.gzbin0 -> 1147 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ivs/2020-07-14/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ivs/2020-07-14/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ivs/2020-07-14/service-2.json.gzbin0 -> 17154 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ivschat/2020-07-14/endpoint-rule-set-1.json.gzbin0 -> 1150 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ivschat/2020-07-14/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ivschat/2020-07-14/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ivschat/2020-07-14/service-2.json.gzbin0 -> 8309 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ivschat/2020-07-14/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kafka/2018-11-14/endpoint-rule-set-1.json.gzbin0 -> 1234 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kafka/2018-11-14/paginators-1.json76
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kafka/2018-11-14/service-2.json.gzbin0 -> 21054 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kafkaconnect/2021-09-14/endpoint-rule-set-1.json.gzbin0 -> 1154 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kafkaconnect/2021-09-14/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kafkaconnect/2021-09-14/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kafkaconnect/2021-09-14/service-2.json.gzbin0 -> 7897 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kafkaconnect/2021-09-14/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kendra-ranking/2022-10-19/endpoint-rule-set-1.json.gzbin0 -> 1148 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kendra-ranking/2022-10-19/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kendra-ranking/2022-10-19/service-2.json.gzbin0 -> 4362 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kendra/2019-02-03/endpoint-rule-set-1.json.gzbin0 -> 1149 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kendra/2019-02-03/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kendra/2019-02-03/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kendra/2019-02-03/service-2.json.gzbin0 -> 71289 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/keyspaces/2022-02-10/endpoint-rule-set-1.json.gzbin0 -> 1237 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/keyspaces/2022-02-10/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/keyspaces/2022-02-10/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/keyspaces/2022-02-10/service-2.json.gzbin0 -> 13954 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/keyspaces/2022-02-10/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-archived-media/2017-09-30/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-archived-media/2017-09-30/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-archived-media/2017-09-30/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-archived-media/2017-09-30/service-2.json.gzbin0 -> 13517 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-media/2017-09-30/endpoint-rule-set-1.json.gzbin0 -> 1150 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-media/2017-09-30/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-media/2017-09-30/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-media/2017-09-30/service-2.json.gzbin0 -> 3434 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-signaling/2019-12-04/endpoint-rule-set-1.json.gzbin0 -> 1150 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-signaling/2019-12-04/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-signaling/2019-12-04/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-signaling/2019-12-04/service-2.json.gzbin0 -> 2439 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-webrtc-storage/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1303 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-webrtc-storage/2018-05-10/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-webrtc-storage/2018-05-10/service-2.json.gzbin0 -> 2094 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesis/2013-12-02/endpoint-rule-set-1.json.gzbin0 -> 5445 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesis/2013-12-02/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesis/2013-12-02/paginators-1.json43
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesis/2013-12-02/service-2.json.gzbin0 -> 23972 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesis/2013-12-02/waiters-2.json30
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesisanalytics/2015-08-14/endpoint-rule-set-1.json.gzbin0 -> 1156 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesisanalytics/2015-08-14/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesisanalytics/2015-08-14/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesisanalytics/2015-08-14/service-2.json.gzbin0 -> 14039 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesisanalyticsv2/2018-05-23/endpoint-rule-set-1.json.gzbin0 -> 1159 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesisanalyticsv2/2018-05-23/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesisanalyticsv2/2018-05-23/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesisanalyticsv2/2018-05-23/service-2.json.gzbin0 -> 25186 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesisvideo/2017-09-30/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesisvideo/2017-09-30/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesisvideo/2017-09-30/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kinesisvideo/2017-09-30/service-2.json.gzbin0 -> 14715 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kms/2014-11-01/endpoint-rule-set-1.json.gzbin0 -> 1147 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kms/2014-11-01/examples-1.json1750
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kms/2014-11-01/paginators-1.json60
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/kms/2014-11-01/service-2.json.gzbin0 -> 69574 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lakeformation/2017-03-31/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lakeformation/2017-03-31/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lakeformation/2017-03-31/paginators-1.json40
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lakeformation/2017-03-31/paginators-1.sdk-extras.json12
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lakeformation/2017-03-31/service-2.json.gzbin0 -> 23926 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lambda/2014-11-11/endpoint-rule-set-1.json.gzbin0 -> 1288 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lambda/2014-11-11/service-2.json.gzbin0 -> 5528 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lambda/2015-03-31/endpoint-rule-set-1.json.gzbin0 -> 1149 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lambda/2015-03-31/examples-1.json1513
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lambda/2015-03-31/paginators-1.json70
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lambda/2015-03-31/service-2.json.gzbin0 -> 48982 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lambda/2015-03-31/waiters-2.json152
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/launch-wizard/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1304 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/launch-wizard/2018-05-10/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/launch-wizard/2018-05-10/service-2.json.gzbin0 -> 4452 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lex-models/2017-04-19/endpoint-rule-set-1.json.gzbin0 -> 1337 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lex-models/2017-04-19/examples-1.json758
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lex-models/2017-04-19/paginators-1.json64
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lex-models/2017-04-19/service-2.json.gzbin0 -> 29495 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lex-runtime/2016-11-28/endpoint-rule-set-1.json.gzbin0 -> 1268 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lex-runtime/2016-11-28/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lex-runtime/2016-11-28/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lex-runtime/2016-11-28/service-2.json.gzbin0 -> 11790 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lexv2-models/2020-08-07/endpoint-rule-set-1.json.gzbin0 -> 1155 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lexv2-models/2020-08-07/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lexv2-models/2020-08-07/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lexv2-models/2020-08-07/service-2.json.gzbin0 -> 75468 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lexv2-models/2020-08-07/waiters-2.json255
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lexv2-runtime/2020-08-07/endpoint-rule-set-1.json.gzbin0 -> 1156 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lexv2-runtime/2020-08-07/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lexv2-runtime/2020-08-07/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lexv2-runtime/2020-08-07/service-2.json.gzbin0 -> 12882 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/license-manager-linux-subscriptions/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1320 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/license-manager-linux-subscriptions/2018-05-10/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/license-manager-linux-subscriptions/2018-05-10/service-2.json.gzbin0 -> 4790 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/license-manager-user-subscriptions/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1173 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/license-manager-user-subscriptions/2018-05-10/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/license-manager-user-subscriptions/2018-05-10/service-2.json.gzbin0 -> 6480 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/license-manager/2018-08-01/endpoint-rule-set-1.json.gzbin0 -> 1156 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/license-manager/2018-08-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/license-manager/2018-08-01/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/license-manager/2018-08-01/service-2.json.gzbin0 -> 16546 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lightsail/2016-11-28/endpoint-rule-set-1.json.gzbin0 -> 1152 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lightsail/2016-11-28/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lightsail/2016-11-28/paginators-1.json104
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lightsail/2016-11-28/service-2.json.gzbin0 -> 86411 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/location/2020-11-19/endpoint-rule-set-1.json.gzbin0 -> 1146 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/location/2020-11-19/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/location/2020-11-19/paginators-1.json70
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/location/2020-11-19/paginators-1.sdk-extras.json13
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/location/2020-11-19/service-2.json.gzbin0 -> 40254 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/logs/2014-03-28/endpoint-rule-set-1.json.gzbin0 -> 1232 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/logs/2014-03-28/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/logs/2014-03-28/paginators-1.json103
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/logs/2014-03-28/service-2.json.gzbin0 -> 61478 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lookoutequipment/2020-12-15/endpoint-rule-set-1.json.gzbin0 -> 1158 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lookoutequipment/2020-12-15/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lookoutequipment/2020-12-15/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lookoutequipment/2020-12-15/service-2.json.gzbin0 -> 23211 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lookoutmetrics/2017-07-25/endpoint-rule-set-1.json.gzbin0 -> 1152 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lookoutmetrics/2017-07-25/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lookoutmetrics/2017-07-25/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lookoutmetrics/2017-07-25/service-2.json.gzbin0 -> 12970 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lookoutvision/2020-11-20/endpoint-rule-set-1.json.gzbin0 -> 1152 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lookoutvision/2020-11-20/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lookoutvision/2020-11-20/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/lookoutvision/2020-11-20/service-2.json.gzbin0 -> 13268 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/m2/2021-04-28/endpoint-rule-set-1.json.gzbin0 -> 1147 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/m2/2021-04-28/paginators-1.json58
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/m2/2021-04-28/service-2.json.gzbin0 -> 15948 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/machinelearning/2014-12-12/endpoint-rule-set-1.json.gzbin0 -> 1156 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/machinelearning/2014-12-12/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/machinelearning/2014-12-12/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/machinelearning/2014-12-12/service-2.json.gzbin0 -> 21283 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/machinelearning/2014-12-12/waiters-2.json81
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/macie2/2020-01-01/endpoint-rule-set-1.json.gzbin0 -> 1149 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/macie2/2020-01-01/paginators-1.json106
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/macie2/2020-01-01/service-2.json.gzbin0 -> 59306 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/macie2/2020-01-01/waiters-2.json25
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mailmanager/2023-10-17/endpoint-rule-set-1.json.gzbin0 -> 1303 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mailmanager/2023-10-17/paginators-1.json76
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mailmanager/2023-10-17/service-2.json.gzbin0 -> 20935 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/managedblockchain-query/2023-05-04/endpoint-rule-set-1.json.gzbin0 -> 1313 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/managedblockchain-query/2023-05-04/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/managedblockchain-query/2023-05-04/service-2.json.gzbin0 -> 7186 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/managedblockchain-query/2023-05-04/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/managedblockchain/2018-09-24/endpoint-rule-set-1.json.gzbin0 -> 1160 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/managedblockchain/2018-09-24/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/managedblockchain/2018-09-24/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/managedblockchain/2018-09-24/service-2.json.gzbin0 -> 13864 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplace-agreement/2020-03-01/endpoint-rule-set-1.json.gzbin0 -> 1311 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplace-agreement/2020-03-01/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplace-agreement/2020-03-01/service-2.json.gzbin0 -> 8181 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplace-catalog/2018-09-17/endpoint-rule-set-1.json.gzbin0 -> 1159 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplace-catalog/2018-09-17/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplace-catalog/2018-09-17/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplace-catalog/2018-09-17/service-2.json.gzbin0 -> 12227 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplace-deployment/2023-01-25/endpoint-rule-set-1.json.gzbin0 -> 1312 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplace-deployment/2023-01-25/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplace-deployment/2023-01-25/service-2.json.gzbin0 -> 2553 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplace-entitlement/2017-01-11/endpoint-rule-set-1.json.gzbin0 -> 1274 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplace-entitlement/2017-01-11/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplace-entitlement/2017-01-11/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplace-entitlement/2017-01-11/service-2.json.gzbin0 -> 2104 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplace-reporting/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1310 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplace-reporting/2018-05-10/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplace-reporting/2018-05-10/service-2.json.gzbin0 -> 2451 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplace-reporting/2018-05-10/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplacecommerceanalytics/2015-07-01/endpoint-rule-set-1.json.gzbin0 -> 1167 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplacecommerceanalytics/2015-07-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplacecommerceanalytics/2015-07-01/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/marketplacecommerceanalytics/2015-07-01/service-2.json.gzbin0 -> 3248 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediaconnect/2018-11-14/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediaconnect/2018-11-14/paginators-1.json46
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediaconnect/2018-11-14/service-2.json.gzbin0 -> 29712 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediaconnect/2018-11-14/waiters-2.json104
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediaconvert/2017-08-29/endpoint-rule-set-1.json.gzbin0 -> 1301 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediaconvert/2017-08-29/paginators-1.json46
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediaconvert/2017-08-29/paginators-1.sdk-extras.json13
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediaconvert/2017-08-29/service-2.json.gzbin0 -> 157044 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/medialive/2017-10-14/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/medialive/2017-10-14/paginators-1.json118
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/medialive/2017-10-14/service-2.json.gzbin0 -> 120304 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/medialive/2017-10-14/waiters-2.json624
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediapackage-vod/2018-11-07/endpoint-rule-set-1.json.gzbin0 -> 1156 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediapackage-vod/2018-11-07/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediapackage-vod/2018-11-07/service-2.json.gzbin0 -> 7182 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediapackage/2017-10-12/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediapackage/2017-10-12/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediapackage/2017-10-12/service-2.json.gzbin0 -> 9854 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediapackagev2/2022-12-25/endpoint-rule-set-1.json.gzbin0 -> 1306 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediapackagev2/2022-12-25/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediapackagev2/2022-12-25/service-2.json.gzbin0 -> 20221 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediapackagev2/2022-12-25/waiters-2.json36
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediastore-data/2017-09-01/endpoint-rule-set-1.json.gzbin0 -> 1152 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediastore-data/2017-09-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediastore-data/2017-09-01/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediastore-data/2017-09-01/service-2.json.gzbin0 -> 3757 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediastore/2017-09-01/endpoint-rule-set-1.json.gzbin0 -> 1148 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediastore/2017-09-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediastore/2017-09-01/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediastore/2017-09-01/service-2.json.gzbin0 -> 7045 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediatailor/2018-04-23/endpoint-rule-set-1.json.gzbin0 -> 1155 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediatailor/2018-04-23/paginators-1.json52
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mediatailor/2018-04-23/service-2.json.gzbin0 -> 21861 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/medical-imaging/2023-07-19/endpoint-rule-set-1.json.gzbin0 -> 1306 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/medical-imaging/2023-07-19/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/medical-imaging/2023-07-19/paginators-1.sdk-extras.json12
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/medical-imaging/2023-07-19/service-2.json.gzbin0 -> 9518 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/medical-imaging/2023-07-19/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/memorydb/2021-01-01/endpoint-rule-set-1.json.gzbin0 -> 1266 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/memorydb/2021-01-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/memorydb/2021-01-01/paginators-1.json82
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/memorydb/2021-01-01/service-2.json.gzbin0 -> 17522 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/meteringmarketplace/2016-01-14/endpoint-rule-set-1.json.gzbin0 -> 1243 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/meteringmarketplace/2016-01-14/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/meteringmarketplace/2016-01-14/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/meteringmarketplace/2016-01-14/service-2.json.gzbin0 -> 6179 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mgh/2017-05-31/endpoint-rule-set-1.json.gzbin0 -> 1147 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mgh/2017-05-31/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mgh/2017-05-31/paginators-1.json46
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mgh/2017-05-31/service-2.json.gzbin0 -> 8366 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mgn/2020-02-26/endpoint-rule-set-1.json.gzbin0 -> 1147 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mgn/2020-02-26/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mgn/2020-02-26/paginators-1.json100
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mgn/2020-02-26/service-2.json.gzbin0 -> 19748 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/migration-hub-refactor-spaces/2021-10-26/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/migration-hub-refactor-spaces/2021-10-26/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/migration-hub-refactor-spaces/2021-10-26/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/migration-hub-refactor-spaces/2021-10-26/service-2.json.gzbin0 -> 12478 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/migrationhub-config/2019-06-30/endpoint-rule-set-1.json.gzbin0 -> 1158 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/migrationhub-config/2019-06-30/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/migrationhub-config/2019-06-30/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/migrationhub-config/2019-06-30/service-2.json.gzbin0 -> 2714 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/migrationhuborchestrator/2021-08-28/endpoint-rule-set-1.json.gzbin0 -> 1310 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/migrationhuborchestrator/2021-08-28/paginators-1.json46
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/migrationhuborchestrator/2021-08-28/service-2.json.gzbin0 -> 8432 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/migrationhuborchestrator/2021-08-28/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/migrationhubstrategy/2020-02-19/endpoint-rule-set-1.json.gzbin0 -> 1158 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/migrationhubstrategy/2020-02-19/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/migrationhubstrategy/2020-02-19/paginators-1.json40
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/migrationhubstrategy/2020-02-19/paginators-1.sdk-extras.json12
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/migrationhubstrategy/2020-02-19/service-2.json.gzbin0 -> 13363 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mq/2017-11-27/endpoint-rule-set-1.json.gzbin0 -> 1146 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mq/2017-11-27/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mq/2017-11-27/service-2.json.gzbin0 -> 14441 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mturk/2017-01-17/endpoint-rule-set-1.json.gzbin0 -> 1214 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mturk/2017-01-17/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mturk/2017-01-17/paginators-1.json58
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mturk/2017-01-17/service-2.json.gzbin0 -> 19736 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mwaa/2020-07-01/endpoint-rule-set-1.json.gzbin0 -> 1150 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mwaa/2020-07-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mwaa/2020-07-01/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/mwaa/2020-07-01/service-2.json.gzbin0 -> 11624 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/neptune-graph/2023-11-29/endpoint-rule-set-1.json.gzbin0 -> 1410 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/neptune-graph/2023-11-29/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/neptune-graph/2023-11-29/service-2.json.gzbin0 -> 14852 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/neptune-graph/2023-11-29/waiters-2.json212
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/endpoint-rule-set-1.json.gzbin0 -> 1232 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/paginators-1.json100
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/service-2.json.gzbin0 -> 43595 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/service-2.sdk-extras.json23
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/waiters-2.json90
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/neptunedata/2023-08-01/endpoint-rule-set-1.json.gzbin0 -> 1300 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/neptunedata/2023-08-01/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/neptunedata/2023-08-01/service-2.json.gzbin0 -> 23510 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/network-firewall/2020-11-12/endpoint-rule-set-1.json.gzbin0 -> 1156 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/network-firewall/2020-11-12/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/network-firewall/2020-11-12/paginators-1.json58
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/network-firewall/2020-11-12/paginators-1.sdk-extras.json26
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/network-firewall/2020-11-12/service-2.json.gzbin0 -> 38176 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/networkflowmonitor/2023-04-19/endpoint-rule-set-1.json.gzbin0 -> 842 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/networkflowmonitor/2023-04-19/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/networkflowmonitor/2023-04-19/paginators-1.sdk-extras.json17
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/networkflowmonitor/2023-04-19/service-2.json.gzbin0 -> 8938 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/networkflowmonitor/2023-04-19/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/networkmanager/2019-07-05/endpoint-rule-set-1.json.gzbin0 -> 1371 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/networkmanager/2019-07-05/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/networkmanager/2019-07-05/paginators-1.json130
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/networkmanager/2019-07-05/service-2.json.gzbin0 -> 23986 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/networkmonitor/2023-08-01/endpoint-rule-set-1.json.gzbin0 -> 1305 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/networkmonitor/2023-08-01/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/networkmonitor/2023-08-01/service-2.json.gzbin0 -> 5147 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/networkmonitor/2023-08-01/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/notifications/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 837 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/notifications/2018-05-10/paginators-1.json58
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/notifications/2018-05-10/service-2.json.gzbin0 -> 15017 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/notifications/2018-05-10/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/notificationscontacts/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 909 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/notificationscontacts/2018-05-10/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/notificationscontacts/2018-05-10/service-2.json.gzbin0 -> 3777 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/notificationscontacts/2018-05-10/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/oam/2022-06-10/endpoint-rule-set-1.json.gzbin0 -> 1297 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/oam/2022-06-10/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/oam/2022-06-10/service-2.json.gzbin0 -> 6699 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/observabilityadmin/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1308 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/observabilityadmin/2018-05-10/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/observabilityadmin/2018-05-10/service-2.json.gzbin0 -> 3058 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/observabilityadmin/2018-05-10/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/omics/2022-11-28/endpoint-rule-set-1.json.gzbin0 -> 1298 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/omics/2022-11-28/paginators-1.json130
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/omics/2022-11-28/service-2.json.gzbin0 -> 31202 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/omics/2022-11-28/waiters-2.json546
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/opensearch/2021-01-01/endpoint-rule-set-1.json.gzbin0 -> 1313 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/opensearch/2021-01-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/opensearch/2021-01-01/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/opensearch/2021-01-01/service-2.json.gzbin0 -> 46562 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/opensearchserverless/2021-11-01/endpoint-rule-set-1.json.gzbin0 -> 1297 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/opensearchserverless/2021-11-01/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/opensearchserverless/2021-11-01/service-2.json.gzbin0 -> 10940 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/opensearchserverless/2021-11-01/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/opsworks/2013-02-18/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/opsworks/2013-02-18/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/opsworks/2013-02-18/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/opsworks/2013-02-18/service-2.json.gzbin0 -> 37925 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/opsworks/2013-02-18/waiters-2.json289
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/opsworkscm/2016-11-01/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/opsworkscm/2016-11-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/opsworkscm/2016-11-01/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/opsworkscm/2016-11-01/service-2.json.gzbin0 -> 13908 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/opsworkscm/2016-11-01/waiters-2.json25
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/organizations/2016-11-28/endpoint-rule-set-1.json.gzbin0 -> 1653 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/organizations/2016-11-28/examples-1.json1409
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/organizations/2016-11-28/paginators-1.json99
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/organizations/2016-11-28/service-2.json.gzbin0 -> 35784 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/osis/2022-01-01/endpoint-rule-set-1.json.gzbin0 -> 1297 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/osis/2022-01-01/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/osis/2022-01-01/service-2.json.gzbin0 -> 6216 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/outposts/2019-12-03/endpoint-rule-set-1.json.gzbin0 -> 1236 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/outposts/2019-12-03/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/outposts/2019-12-03/paginators-1.json64
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/outposts/2019-12-03/paginators-1.sdk-extras.json13
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/outposts/2019-12-03/service-2.json.gzbin0 -> 13719 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/panorama/2019-07-24/endpoint-rule-set-1.json.gzbin0 -> 1148 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/panorama/2019-07-24/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/panorama/2019-07-24/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/panorama/2019-07-24/service-2.json.gzbin0 -> 11986 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/partitions.json239
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/partnercentral-selling/2022-07-26/endpoint-rule-set-1.json.gzbin0 -> 845 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/partnercentral-selling/2022-07-26/paginators-1.json64
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/partnercentral-selling/2022-07-26/service-2.json.gzbin0 -> 47465 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography-data/2022-02-03/endpoint-rule-set-1.json.gzbin0 -> 1319 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography-data/2022-02-03/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography-data/2022-02-03/service-2.json.gzbin0 -> 16505 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography-data/2022-02-03/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography/2021-09-14/endpoint-rule-set-1.json.gzbin0 -> 1319 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography/2021-09-14/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography/2021-09-14/service-2.json.gzbin0 -> 15171 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography/2021-09-14/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pca-connector-ad/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1306 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pca-connector-ad/2018-05-10/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pca-connector-ad/2018-05-10/service-2.json.gzbin0 -> 13292 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pca-connector-scep/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1308 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pca-connector-scep/2018-05-10/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pca-connector-scep/2018-05-10/service-2.json.gzbin0 -> 5804 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pca-connector-scep/2018-05-10/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pcs/2023-02-10/endpoint-rule-set-1.json.gzbin0 -> 1296 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pcs/2023-02-10/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pcs/2023-02-10/service-2.json.gzbin0 -> 10366 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pcs/2023-02-10/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/personalize-events/2018-03-22/endpoint-rule-set-1.json.gzbin0 -> 1159 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/personalize-events/2018-03-22/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/personalize-events/2018-03-22/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/personalize-events/2018-03-22/service-2.json.gzbin0 -> 3870 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/personalize-runtime/2018-05-22/endpoint-rule-set-1.json.gzbin0 -> 1160 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/personalize-runtime/2018-05-22/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/personalize-runtime/2018-05-22/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/personalize-runtime/2018-05-22/service-2.json.gzbin0 -> 3827 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/personalize/2018-05-22/endpoint-rule-set-1.json.gzbin0 -> 1154 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/personalize/2018-05-22/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/personalize/2018-05-22/paginators-1.json100
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/personalize/2018-05-22/service-2.json.gzbin0 -> 29857 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pi/2018-02-27/endpoint-rule-set-1.json.gzbin0 -> 1146 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pi/2018-02-27/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pi/2018-02-27/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pi/2018-02-27/service-2.json.gzbin0 -> 12024 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pinpoint-email/2018-07-26/endpoint-rule-set-1.json.gzbin0 -> 1145 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pinpoint-email/2018-07-26/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pinpoint-email/2018-07-26/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pinpoint-email/2018-07-26/service-2.json.gzbin0 -> 23610 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/endpoint-rule-set-1.json.gzbin0 -> 1152 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/paginators-1.json136
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/paginators-1.sdk-extras.json61
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/service-2.json.gzbin0 -> 37334 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice/2018-09-05/endpoint-rule-set-1.json.gzbin0 -> 1112 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice/2018-09-05/service-2.json.gzbin0 -> 2998 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pinpoint/2016-12-01/endpoint-rule-set-1.json.gzbin0 -> 1315 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pinpoint/2016-12-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pinpoint/2016-12-01/service-2.json.gzbin0 -> 70366 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pipes/2015-10-07/endpoint-rule-set-1.json.gzbin0 -> 1296 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pipes/2015-10-07/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pipes/2015-10-07/service-2.json.gzbin0 -> 23040 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pipes/2015-10-07/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/polly/2016-06-10/endpoint-rule-set-1.json.gzbin0 -> 1149 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/polly/2016-06-10/examples-1.json171
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/polly/2016-06-10/paginators-1.json20
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/polly/2016-06-10/service-2.json.gzbin0 -> 8176 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pricing/2017-10-15/endpoint-rule-set-1.json.gzbin0 -> 1219 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pricing/2017-10-15/examples-1.json104
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pricing/2017-10-15/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pricing/2017-10-15/service-2.json.gzbin0 -> 4326 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/pricing/2017-10-15/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/privatenetworks/2021-12-03/endpoint-rule-set-1.json.gzbin0 -> 1156 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/privatenetworks/2021-12-03/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/privatenetworks/2021-12-03/service-2.json.gzbin0 -> 8927 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/proton/2020-07-20/endpoint-rule-set-1.json.gzbin0 -> 1146 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/proton/2020-07-20/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/proton/2020-07-20/paginators-1.json121
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/proton/2020-07-20/service-2.json.gzbin0 -> 28066 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/proton/2020-07-20/waiters-2.json208
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/qapps/2023-11-27/endpoint-rule-set-1.json.gzbin0 -> 1301 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/qapps/2023-11-27/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/qapps/2023-11-27/service-2.json.gzbin0 -> 13866 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/qapps/2023-11-27/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/qbusiness/2023-11-27/endpoint-rule-set-1.json.gzbin0 -> 1128 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/qbusiness/2023-11-27/paginators-1.json118
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/qbusiness/2023-11-27/paginators-1.sdk-extras.json15
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/qbusiness/2023-11-27/service-2.json.gzbin0 -> 46008 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/qbusiness/2023-11-27/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/qconnect/2020-10-19/endpoint-rule-set-1.json.gzbin0 -> 1299 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/qconnect/2020-10-19/paginators-1.json130
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/qconnect/2020-10-19/service-2.json.gzbin0 -> 46558 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/qldb-session/2019-07-11/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/qldb-session/2019-07-11/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/qldb-session/2019-07-11/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/qldb-session/2019-07-11/service-2.json.gzbin0 -> 3035 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/qldb/2019-01-02/endpoint-rule-set-1.json.gzbin0 -> 1148 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/qldb/2019-01-02/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/qldb/2019-01-02/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/qldb/2019-01-02/service-2.json.gzbin0 -> 11016 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/quicksight/2018-04-01/endpoint-rule-set-1.json.gzbin0 -> 1153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/quicksight/2018-04-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/quicksight/2018-04-01/paginators-1.json214
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/quicksight/2018-04-01/paginators-1.sdk-extras.json215
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/quicksight/2018-04-01/service-2.json.gzbin0 -> 179745 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ram/2018-01-04/endpoint-rule-set-1.json.gzbin0 -> 1234 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ram/2018-01-04/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ram/2018-01-04/paginators-1.json40
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ram/2018-01-04/service-2.json.gzbin0 -> 17997 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rbin/2021-06-15/endpoint-rule-set-1.json.gzbin0 -> 1147 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rbin/2021-06-15/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rbin/2021-06-15/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rbin/2021-06-15/service-2.json.gzbin0 -> 4900 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rds-data/2018-08-01/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rds-data/2018-08-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rds-data/2018-08-01/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rds-data/2018-08-01/service-2.json.gzbin0 -> 6569 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rds/2014-09-01/endpoint-rule-set-1.json.gzbin0 -> 1234 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rds/2014-09-01/paginators-1.json107
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rds/2014-09-01/service-2.json.gzbin0 -> 37839 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rds/2014-09-01/waiters-2.json97
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/endpoint-rule-set-1.json.gzbin0 -> 1232 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/examples-1.json1951
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/paginators-1.json245
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/paginators-1.sdk-extras.json12
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/service-2.json.gzbin0 -> 158876 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/service-2.sdk-extras.json47
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/waiters-2.json412
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/redshift-data/2019-12-20/endpoint-rule-set-1.json.gzbin0 -> 1154 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/redshift-data/2019-12-20/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/redshift-data/2019-12-20/paginators-1.json44
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/redshift-data/2019-12-20/paginators-1.sdk-extras.json25
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/redshift-data/2019-12-20/service-2.json.gzbin0 -> 7988 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/redshift-serverless/2021-04-21/endpoint-rule-set-1.json.gzbin0 -> 1158 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/redshift-serverless/2021-04-21/paginators-1.json76
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/redshift-serverless/2021-04-21/service-2.json.gzbin0 -> 19330 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/redshift/2012-12-01/endpoint-rule-set-1.json.gzbin0 -> 1236 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/redshift/2012-12-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/redshift/2012-12-01/paginators-1.json226
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/redshift/2012-12-01/service-2.json.gzbin0 -> 75361 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/redshift/2012-12-01/waiters-2.json97
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rekognition/2016-06-27/endpoint-rule-set-1.json.gzbin0 -> 1152 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rekognition/2016-06-27/examples-1.json651
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rekognition/2016-06-27/paginators-1.json64
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rekognition/2016-06-27/service-2.json.gzbin0 -> 70528 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rekognition/2016-06-27/waiters-2.json45
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/repostspace/2022-05-13/endpoint-rule-set-1.json.gzbin0 -> 1302 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/repostspace/2022-05-13/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/repostspace/2022-05-13/service-2.json.gzbin0 -> 4923 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/resiliencehub/2020-04-30/endpoint-rule-set-1.json.gzbin0 -> 1154 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/resiliencehub/2020-04-30/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/resiliencehub/2020-04-30/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/resiliencehub/2020-04-30/service-2.json.gzbin0 -> 29858 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/resource-explorer-2/2022-07-28/endpoint-rule-set-1.json.gzbin0 -> 1159 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/resource-explorer-2/2022-07-28/paginators-1.json46
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/resource-explorer-2/2022-07-28/paginators-1.sdk-extras.json18
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/resource-explorer-2/2022-07-28/service-2.json.gzbin0 -> 12841 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/resource-groups/2017-11-27/endpoint-rule-set-1.json.gzbin0 -> 1241 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/resource-groups/2017-11-27/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/resource-groups/2017-11-27/paginators-1.json40
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/resource-groups/2017-11-27/paginators-1.sdk-extras.json12
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/resource-groups/2017-11-27/service-2.json.gzbin0 -> 14043 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/resourcegroupstaggingapi/2017-01-26/endpoint-rule-set-1.json.gzbin0 -> 1147 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/resourcegroupstaggingapi/2017-01-26/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/resourcegroupstaggingapi/2017-01-26/paginators-1.json26
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/resourcegroupstaggingapi/2017-01-26/service-2.json.gzbin0 -> 7721 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/robomaker/2018-06-29/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/robomaker/2018-06-29/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/robomaker/2018-06-29/paginators-1.json70
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/robomaker/2018-06-29/service-2.json.gzbin0 -> 25122 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rolesanywhere/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1154 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rolesanywhere/2018-05-10/paginators-1.json24
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rolesanywhere/2018-05-10/service-2.json.gzbin0 -> 7193 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-cluster/2019-12-02/endpoint-rule-set-1.json.gzbin0 -> 1169 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-cluster/2019-12-02/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-cluster/2019-12-02/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-cluster/2019-12-02/service-2.json.gzbin0 -> 4022 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-control-config/2020-11-02/endpoint-rule-set-1.json.gzbin0 -> 1565 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-control-config/2020-11-02/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-control-config/2020-11-02/service-2.json.gzbin0 -> 8486 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-control-config/2020-11-02/waiters-2.json152
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-readiness/2019-12-02/endpoint-rule-set-1.json.gzbin0 -> 1166 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-readiness/2019-12-02/paginators-1.json77
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-readiness/2019-12-02/service-2.json.gzbin0 -> 7313 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53/2013-04-01/endpoint-rule-set-1.json.gzbin0 -> 1705 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53/2013-04-01/examples-1.json762
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53/2013-04-01/paginators-1.json67
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53/2013-04-01/service-2.json.gzbin0 -> 63340 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53/2013-04-01/waiters-2.json18
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53domains/2014-05-15/endpoint-rule-set-1.json.gzbin0 -> 1157 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53domains/2014-05-15/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53domains/2014-05-15/paginators-1.json29
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53domains/2014-05-15/service-2.json.gzbin0 -> 21347 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53profiles/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1308 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53profiles/2018-05-10/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53profiles/2018-05-10/service-2.json.gzbin0 -> 4822 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53resolver/2018-04-01/endpoint-rule-set-1.json.gzbin0 -> 1242 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53resolver/2018-04-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53resolver/2018-04-01/paginators-1.json100
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53resolver/2018-04-01/paginators-1.sdk-extras.json39
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/route53resolver/2018-04-01/service-2.json.gzbin0 -> 32109 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rum/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1147 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rum/2018-05-10/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rum/2018-05-10/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/rum/2018-05-10/service-2.json.gzbin0 -> 15044 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/endpoint-rule-set-1.json.gzbin0 -> 18305 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/examples-1.json1843
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/paginators-1.json76
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/paginators-1.sdk-extras.json46
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/service-2.json.gzbin0 -> 156873 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/service-2.sdk-extras.json8
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/waiters-2.json73
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/s3control/2018-08-20/endpoint-rule-set-1.json.gzbin0 -> 7594 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/s3control/2018-08-20/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/s3control/2018-08-20/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/s3control/2018-08-20/service-2.json.gzbin0 -> 61299 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/s3outposts/2017-07-25/endpoint-rule-set-1.json.gzbin0 -> 1154 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/s3outposts/2017-07-25/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/s3outposts/2017-07-25/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/s3outposts/2017-07-25/service-2.json.gzbin0 -> 3453 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/s3tables/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1300 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/s3tables/2018-05-10/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/s3tables/2018-05-10/service-2.json.gzbin0 -> 6354 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/s3tables/2018-05-10/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-a2i-runtime/2019-11-07/endpoint-rule-set-1.json.gzbin0 -> 1160 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-a2i-runtime/2019-11-07/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-a2i-runtime/2019-11-07/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-a2i-runtime/2019-11-07/service-2.json.gzbin0 -> 3777 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-edge/2020-09-23/endpoint-rule-set-1.json.gzbin0 -> 1152 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-edge/2020-09-23/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-edge/2020-09-23/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-edge/2020-09-23/service-2.json.gzbin0 -> 2219 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-featurestore-runtime/2020-07-01/endpoint-rule-set-1.json.gzbin0 -> 1170 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-featurestore-runtime/2020-07-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-featurestore-runtime/2020-07-01/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-featurestore-runtime/2020-07-01/service-2.json.gzbin0 -> 4127 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-geospatial/2020-05-27/endpoint-rule-set-1.json.gzbin0 -> 1299 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-geospatial/2020-05-27/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-geospatial/2020-05-27/service-2.json.gzbin0 -> 11920 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-metrics/2022-09-30/endpoint-rule-set-1.json.gzbin0 -> 1307 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-metrics/2022-09-30/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-metrics/2022-09-30/service-2.json.gzbin0 -> 2024 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-runtime/2017-05-13/endpoint-rule-set-1.json.gzbin0 -> 1274 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-runtime/2017-05-13/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-runtime/2017-05-13/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker-runtime/2017-05-13/service-2.json.gzbin0 -> 5704 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker/2017-07-24/endpoint-rule-set-1.json.gzbin0 -> 1271 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker/2017-07-24/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker/2017-07-24/paginators-1.json472
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker/2017-07-24/service-2.json.gzbin0 -> 308643 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sagemaker/2017-07-24/waiters-2.json311
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/savingsplans/2019-06-28/endpoint-rule-set-1.json.gzbin0 -> 1308 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/savingsplans/2019-06-28/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/savingsplans/2019-06-28/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/savingsplans/2019-06-28/service-2.json.gzbin0 -> 4275 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/scheduler/2021-06-30/endpoint-rule-set-1.json.gzbin0 -> 1290 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/scheduler/2021-06-30/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/scheduler/2021-06-30/service-2.json.gzbin0 -> 9349 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/schemas/2019-12-02/endpoint-rule-set-1.json.gzbin0 -> 1147 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/schemas/2019-12-02/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/schemas/2019-12-02/service-2.json.gzbin0 -> 5698 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/schemas/2019-12-02/waiters-2.json36
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sdb/2009-04-15/endpoint-rule-set-1.json.gzbin0 -> 1198 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sdb/2009-04-15/paginators-1.json15
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sdb/2009-04-15/service-2.json.gzbin0 -> 6036 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sdk-default-configuration.json55
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/secretsmanager/2017-10-17/endpoint-rule-set-1.json.gzbin0 -> 1354 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/secretsmanager/2017-10-17/examples-1.json596
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/secretsmanager/2017-10-17/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/secretsmanager/2017-10-17/service-2.json.gzbin0 -> 21257 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/secretsmanager/2017-10-17/service-2.sdk-extras.json8
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/security-ir/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 837 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/security-ir/2018-05-10/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/security-ir/2018-05-10/paginators-1.sdk-extras.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/security-ir/2018-05-10/service-2.json.gzbin0 -> 8067 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/security-ir/2018-05-10/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/securityhub/2018-10-26/endpoint-rule-set-1.json.gzbin0 -> 1152 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/securityhub/2018-10-26/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/securityhub/2018-10-26/paginators-1.json106
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/securityhub/2018-10-26/service-2.json.gzbin0 -> 152287 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/securitylake/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1303 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/securitylake/2018-05-10/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/securitylake/2018-05-10/paginators-1.sdk-extras.json12
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/securitylake/2018-05-10/service-2.json.gzbin0 -> 14449 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/serverlessrepo/2017-09-08/endpoint-rule-set-1.json.gzbin0 -> 1242 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/serverlessrepo/2017-09-08/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/serverlessrepo/2017-09-08/service-2.json.gzbin0 -> 9555 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/service-quotas/2019-06-24/endpoint-rule-set-1.json.gzbin0 -> 1242 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/service-quotas/2019-06-24/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/service-quotas/2019-06-24/paginators-1.json40
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/service-quotas/2019-06-24/service-2.json.gzbin0 -> 6411 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/servicecatalog-appregistry/2020-06-24/endpoint-rule-set-1.json.gzbin0 -> 1248 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/servicecatalog-appregistry/2020-06-24/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/servicecatalog-appregistry/2020-06-24/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/servicecatalog-appregistry/2020-06-24/service-2.json.gzbin0 -> 7841 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/servicecatalog/2015-12-10/endpoint-rule-set-1.json.gzbin0 -> 1154 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/servicecatalog/2015-12-10/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/servicecatalog/2015-12-10/paginators-1.json100
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/servicecatalog/2015-12-10/service-2.json.gzbin0 -> 37370 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/servicediscovery/2017-03-14/endpoint-rule-set-1.json.gzbin0 -> 1308 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/servicediscovery/2017-03-14/examples-1.json672
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/servicediscovery/2017-03-14/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/servicediscovery/2017-03-14/service-2.json.gzbin0 -> 19578 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ses/2010-12-01/endpoint-rule-set-1.json.gzbin0 -> 1148 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ses/2010-12-01/examples-1.json1021
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ses/2010-12-01/paginators-1.json33
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ses/2010-12-01/service-2.json.gzbin0 -> 36446 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ses/2010-12-01/waiters-2.json18
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sesv2/2019-09-27/endpoint-rule-set-1.json.gzbin0 -> 1643 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sesv2/2019-09-27/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sesv2/2019-09-27/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sesv2/2019-09-27/service-2.json.gzbin0 -> 57095 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/shield/2016-06-02/endpoint-rule-set-1.json.gzbin0 -> 1347 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/shield/2016-06-02/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/shield/2016-06-02/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/shield/2016-06-02/service-2.json.gzbin0 -> 15250 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/signer/2017-08-25/endpoint-rule-set-1.json.gzbin0 -> 1148 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/signer/2017-08-25/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/signer/2017-08-25/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/signer/2017-08-25/service-2.json.gzbin0 -> 10289 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/signer/2017-08-25/waiters-2.json29
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/simspaceweaver/2022-10-28/endpoint-rule-set-1.json.gzbin0 -> 1294 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/simspaceweaver/2022-10-28/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/simspaceweaver/2022-10-28/service-2.json.gzbin0 -> 6915 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sms-voice/2018-09-05/endpoint-rule-set-1.json.gzbin0 -> 1112 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sms-voice/2018-09-05/service-2.json.gzbin0 -> 3324 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sms/2016-10-24/endpoint-rule-set-1.json.gzbin0 -> 1286 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sms/2016-10-24/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sms/2016-10-24/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sms/2016-10-24/service-2.json.gzbin0 -> 9676 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/snow-device-management/2021-08-04/endpoint-rule-set-1.json.gzbin0 -> 1161 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/snow-device-management/2021-08-04/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/snow-device-management/2021-08-04/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/snow-device-management/2021-08-04/service-2.json.gzbin0 -> 5955 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/snowball/2016-06-30/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/snowball/2016-06-30/examples-1.json442
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/snowball/2016-06-30/paginators-1.json40
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/snowball/2016-06-30/service-2.json.gzbin0 -> 17017 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sns/2010-03-31/endpoint-rule-set-1.json.gzbin0 -> 1230 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sns/2010-03-31/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sns/2010-03-31/paginators-1.json46
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sns/2010-03-31/service-2.json.gzbin0 -> 25501 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/socialmessaging/2024-01-01/endpoint-rule-set-1.json.gzbin0 -> 1307 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/socialmessaging/2024-01-01/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/socialmessaging/2024-01-01/service-2.json.gzbin0 -> 7072 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sqs/2012-11-05/endpoint-rule-set-1.json.gzbin0 -> 1232 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sqs/2012-11-05/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sqs/2012-11-05/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sqs/2012-11-05/service-2.json.gzbin0 -> 24064 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ssm-contacts/2021-05-03/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ssm-contacts/2021-05-03/examples-1.json714
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ssm-contacts/2021-05-03/paginators-1.json69
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ssm-contacts/2021-05-03/service-2.json.gzbin0 -> 12756 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ssm-incidents/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1156 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ssm-incidents/2018-05-10/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ssm-incidents/2018-05-10/paginators-1.json46
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ssm-incidents/2018-05-10/service-2.json.gzbin0 -> 14417 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ssm-incidents/2018-05-10/waiters-2.json53
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ssm-quicksetup/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1305 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ssm-quicksetup/2018-05-10/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ssm-quicksetup/2018-05-10/service-2.json.gzbin0 -> 7343 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ssm-sap/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1300 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ssm-sap/2018-05-10/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ssm-sap/2018-05-10/service-2.json.gzbin0 -> 7901 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ssm/2014-11-06/endpoint-rule-set-1.json.gzbin0 -> 1232 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ssm/2014-11-06/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ssm/2014-11-06/paginators-1.json304
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ssm/2014-11-06/service-2.json.gzbin0 -> 130439 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/ssm/2014-11-06/waiters-2.json65
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sso-admin/2020-07-20/endpoint-rule-set-1.json.gzbin0 -> 1232 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sso-admin/2020-07-20/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sso-admin/2020-07-20/paginators-1.json121
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sso-admin/2020-07-20/service-2.json.gzbin0 -> 19790 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sso-oidc/2019-06-10/endpoint-rule-set-1.json.gzbin0 -> 1233 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sso-oidc/2019-06-10/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sso-oidc/2019-06-10/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sso-oidc/2019-06-10/service-2.json.gzbin0 -> 5482 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sso/2019-06-10/endpoint-rule-set-1.json.gzbin0 -> 1239 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sso/2019-06-10/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sso/2019-06-10/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sso/2019-06-10/service-2.json.gzbin0 -> 2913 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/stepfunctions/2016-11-23/endpoint-rule-set-1.json.gzbin0 -> 1210 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/stepfunctions/2016-11-23/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/stepfunctions/2016-11-23/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/stepfunctions/2016-11-23/service-2.json.gzbin0 -> 30707 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/storagegateway/2013-06-30/endpoint-rule-set-1.json.gzbin0 -> 1155 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/storagegateway/2013-06-30/examples-1.json1381
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/storagegateway/2013-06-30/paginators-1.json79
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/storagegateway/2013-06-30/service-2.json.gzbin0 -> 56971 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sts/2011-06-15/endpoint-rule-set-1.json.gzbin0 -> 1778 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sts/2011-06-15/examples-1.json271
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sts/2011-06-15/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/sts/2011-06-15/service-2.json.gzbin0 -> 17892 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/supplychain/2024-01-01/endpoint-rule-set-1.json.gzbin0 -> 1296 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/supplychain/2024-01-01/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/supplychain/2024-01-01/service-2.json.gzbin0 -> 8784 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/support-app/2021-08-20/endpoint-rule-set-1.json.gzbin0 -> 1147 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/support-app/2021-08-20/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/support-app/2021-08-20/service-2.json.gzbin0 -> 4271 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/support/2013-04-15/endpoint-rule-set-1.json.gzbin0 -> 1557 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/support/2013-04-15/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/support/2013-04-15/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/support/2013-04-15/service-2.json.gzbin0 -> 11900 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/swf/2012-01-25/endpoint-rule-set-1.json.gzbin0 -> 1232 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/swf/2012-01-25/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/swf/2012-01-25/paginators-1.json53
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/swf/2012-01-25/service-2.json.gzbin0 -> 34463 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/synthetics/2017-10-11/endpoint-rule-set-1.json.gzbin0 -> 1152 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/synthetics/2017-10-11/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/synthetics/2017-10-11/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/synthetics/2017-10-11/service-2.json.gzbin0 -> 14359 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/taxsettings/2018-05-10/endpoint-rule-set-1.json.gzbin0 -> 1379 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/taxsettings/2018-05-10/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/taxsettings/2018-05-10/service-2.json.gzbin0 -> 13117 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/textract/2018-06-27/endpoint-rule-set-1.json.gzbin0 -> 1147 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/textract/2018-06-27/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/textract/2018-06-27/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/textract/2018-06-27/service-2.json.gzbin0 -> 21988 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/timestream-influxdb/2023-01-27/endpoint-rule-set-1.json.gzbin0 -> 1309 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/timestream-influxdb/2023-01-27/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/timestream-influxdb/2023-01-27/service-2.json.gzbin0 -> 10092 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/timestream-query/2018-11-01/endpoint-rule-set-1.json.gzbin0 -> 1157 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/timestream-query/2018-11-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/timestream-query/2018-11-01/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/timestream-query/2018-11-01/service-2.json.gzbin0 -> 14830 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/timestream-write/2018-11-01/endpoint-rule-set-1.json.gzbin0 -> 1246 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/timestream-write/2018-11-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/timestream-write/2018-11-01/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/timestream-write/2018-11-01/service-2.json.gzbin0 -> 12121 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/tnb/2008-10-21/endpoint-rule-set-1.json.gzbin0 -> 1296 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/tnb/2008-10-21/paginators-1.json34
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/tnb/2008-10-21/service-2.json.gzbin0 -> 10024 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/transcribe/2017-10-26/endpoint-rule-set-1.json.gzbin0 -> 1340 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/transcribe/2017-10-26/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/transcribe/2017-10-26/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/transcribe/2017-10-26/service-2.json.gzbin0 -> 34153 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/transfer/2018-11-05/endpoint-rule-set-1.json.gzbin0 -> 1150 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/transfer/2018-11-05/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/transfer/2018-11-05/paginators-1.json94
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/transfer/2018-11-05/service-2.json.gzbin0 -> 56662 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/transfer/2018-11-05/waiters-2.json37
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/translate/2017-07-01/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/translate/2017-07-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/translate/2017-07-01/paginators-1.json10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/translate/2017-07-01/service-2.json.gzbin0 -> 13002 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/trustedadvisor/2022-09-15/endpoint-rule-set-1.json.gzbin0 -> 1304 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/trustedadvisor/2022-09-15/paginators-1.json40
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/trustedadvisor/2022-09-15/service-2.json.gzbin0 -> 5193 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/verifiedpermissions/2021-12-01/endpoint-rule-set-1.json.gzbin0 -> 1308 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/verifiedpermissions/2021-12-01/paginators-1.json28
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/verifiedpermissions/2021-12-01/service-2.json.gzbin0 -> 23658 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/verifiedpermissions/2021-12-01/waiters-2.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/voice-id/2021-09-27/endpoint-rule-set-1.json.gzbin0 -> 1147 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/voice-id/2021-09-27/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/voice-id/2021-09-27/paginators-1.json40
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/voice-id/2021-09-27/service-2.json.gzbin0 -> 11875 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/vpc-lattice/2022-11-30/endpoint-rule-set-1.json.gzbin0 -> 1303 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/vpc-lattice/2022-11-30/paginators-1.json88
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/vpc-lattice/2022-11-30/service-2.json.gzbin0 -> 22960 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/waf-regional/2016-11-28/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/waf-regional/2016-11-28/examples-1.json1017
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/waf-regional/2016-11-28/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/waf-regional/2016-11-28/service-2.json.gzbin0 -> 42886 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/waf/2015-08-24/endpoint-rule-set-1.json.gzbin0 -> 1342 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/waf/2015-08-24/examples-1.json1017
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/waf/2015-08-24/paginators-1.json99
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/waf/2015-08-24/service-2.json.gzbin0 -> 41724 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/wafv2/2019-07-29/endpoint-rule-set-1.json.gzbin0 -> 1150 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/wafv2/2019-07-29/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/wafv2/2019-07-29/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/wafv2/2019-07-29/service-2.json.gzbin0 -> 73721 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/wellarchitected/2020-03-31/endpoint-rule-set-1.json.gzbin0 -> 1156 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/wellarchitected/2020-03-31/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/wellarchitected/2020-03-31/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/wellarchitected/2020-03-31/service-2.json.gzbin0 -> 21125 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/wisdom/2020-10-19/endpoint-rule-set-1.json.gzbin0 -> 1149 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/wisdom/2020-10-19/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/wisdom/2020-10-19/paginators-1.json64
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/wisdom/2020-10-19/service-2.json.gzbin0 -> 17064 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workdocs/2016-05-01/endpoint-rule-set-1.json.gzbin0 -> 1148 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workdocs/2016-05-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workdocs/2016-05-01/paginators-1.json67
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workdocs/2016-05-01/service-2.json.gzbin0 -> 16223 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workmail/2017-10-01/endpoint-rule-set-1.json.gzbin0 -> 1151 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workmail/2017-10-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workmail/2017-10-01/paginators-1.json64
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workmail/2017-10-01/service-2.json.gzbin0 -> 27884 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workmailmessageflow/2019-05-01/endpoint-rule-set-1.json.gzbin0 -> 1157 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workmailmessageflow/2019-05-01/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workmailmessageflow/2019-05-01/paginators-1.json3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workmailmessageflow/2019-05-01/service-2.json.gzbin0 -> 2272 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workspaces-thin-client/2023-08-22/endpoint-rule-set-1.json.gzbin0 -> 1300 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workspaces-thin-client/2023-08-22/paginators-1.json22
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workspaces-thin-client/2023-08-22/service-2.json.gzbin0 -> 6445 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workspaces-web/2020-07-08/endpoint-rule-set-1.json.gzbin0 -> 1156 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workspaces-web/2020-07-08/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workspaces-web/2020-07-08/paginators-1.json16
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workspaces-web/2020-07-08/service-2.json.gzbin0 -> 16692 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workspaces/2015-04-08/endpoint-rule-set-1.json.gzbin0 -> 1152 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workspaces/2015-04-08/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workspaces/2015-04-08/paginators-1.json54
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/workspaces/2015-04-08/service-2.json.gzbin0 -> 39177 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/xray/2016-04-12/endpoint-rule-set-1.json.gzbin0 -> 1148 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/xray/2016-04-12/examples-1.json5
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/xray/2016-04-12/paginators-1.json69
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/data/xray/2016-04-12/service-2.json.gzbin0 -> 20935 bytes
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/discovery.py281
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/docs/__init__.py54
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/docs/bcdoc/__init__.py13
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/docs/bcdoc/docstringparser.py315
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/docs/bcdoc/restdoc.py285
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/docs/bcdoc/style.py447
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/docs/client.py453
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/docs/docstring.py97
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/docs/example.py236
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/docs/method.py328
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/docs/paginator.py241
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/docs/params.py303
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/docs/service.py133
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/docs/shape.py135
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/docs/sharedexample.py227
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/docs/translator.py62
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/docs/utils.py225
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/docs/waiter.py180
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/endpoint.py449
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/endpoint_provider.py723
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/errorfactory.py90
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/eventstream.py622
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/exceptions.py834
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/handlers.py1586
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/history.py55
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/hooks.py660
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/httpchecksum.py550
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/httpsession.py509
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/loaders.py525
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/model.py982
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/monitoring.py586
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/paginate.py724
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/parsers.py1479
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/regions.py856
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/response.py201
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/retries/__init__.py6
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/retries/adaptive.py132
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/retries/base.py26
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/retries/bucket.py115
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/retries/quota.py54
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/retries/special.py51
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/retries/standard.py532
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/retries/throttling.py55
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/retryhandler.py416
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/serialize.py1119
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/session.py1299
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/signers.py991
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/stub.py433
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/tokens.py330
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/translate.py78
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/useragent.py617
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/utils.py3635
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/validate.py384
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/vendored/__init__.py0
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/vendored/requests/__init__.py10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/vendored/requests/exceptions.py99
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/vendored/requests/packages/__init__.py3
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/vendored/requests/packages/urllib3/__init__.py10
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/vendored/requests/packages/urllib3/exceptions.py169
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/vendored/six.py998
-rw-r--r--.venv/lib/python3.12/site-packages/botocore/waiter.py396
1842 files changed, 163539 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/botocore/__init__.py b/.venv/lib/python3.12/site-packages/botocore/__init__.py
new file mode 100644
index 00000000..3be5364d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/__init__.py
@@ -0,0 +1,191 @@
+# Copyright (c) 2012-2013 Mitch Garnaat http://garnaat.org/
+# Copyright 2012-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+
+import logging
+import os
+import re
+
+__version__ = '1.37.18'
+
+
+class NullHandler(logging.Handler):
+ def emit(self, record):
+ pass
+
+
+# Configure default logger to do nothing
+log = logging.getLogger('botocore')
+log.addHandler(NullHandler())
+
+_INITIALIZERS = []
+
+_first_cap_regex = re.compile('(.)([A-Z][a-z]+)')
+_end_cap_regex = re.compile('([a-z0-9])([A-Z])')
+# The regex below handles the special case where some acronym
+# name is pluralized, e.g GatewayARNs, ListWebACLs, SomeCNAMEs.
+_special_case_transform = re.compile('[A-Z]{2,}s$')
+# Prepopulate the cache with special cases that don't match
+# our regular transformation.
+_xform_cache = {
+ ('CreateCachediSCSIVolume', '_'): 'create_cached_iscsi_volume',
+ ('CreateCachediSCSIVolume', '-'): 'create-cached-iscsi-volume',
+ ('DescribeCachediSCSIVolumes', '_'): 'describe_cached_iscsi_volumes',
+ ('DescribeCachediSCSIVolumes', '-'): 'describe-cached-iscsi-volumes',
+ ('DescribeStorediSCSIVolumes', '_'): 'describe_stored_iscsi_volumes',
+ ('DescribeStorediSCSIVolumes', '-'): 'describe-stored-iscsi-volumes',
+ ('CreateStorediSCSIVolume', '_'): 'create_stored_iscsi_volume',
+ ('CreateStorediSCSIVolume', '-'): 'create-stored-iscsi-volume',
+ ('ListHITsForQualificationType', '_'): 'list_hits_for_qualification_type',
+ ('ListHITsForQualificationType', '-'): 'list-hits-for-qualification-type',
+ ('ExecutePartiQLStatement', '_'): 'execute_partiql_statement',
+ ('ExecutePartiQLStatement', '-'): 'execute-partiql-statement',
+ ('ExecutePartiQLTransaction', '_'): 'execute_partiql_transaction',
+ ('ExecutePartiQLTransaction', '-'): 'execute-partiql-transaction',
+ ('ExecutePartiQLBatch', '_'): 'execute_partiql_batch',
+ ('ExecutePartiQLBatch', '-'): 'execute-partiql-batch',
+ (
+ 'AssociateWhatsAppBusinessAccount',
+ '_',
+ ): 'associate_whatsapp_business_account',
+ (
+ 'AssociateWhatsAppBusinessAccount',
+ '-',
+ ): 'associate-whatsapp-business-account',
+ ('DeleteWhatsAppMessageMedia', '_'): 'delete_whatsapp_media_message',
+ ('DeleteWhatsAppMessageMedia', '-'): 'delete-whatsapp-media-message',
+ (
+ 'DisassociateWhatsAppBusinessAccount',
+ '_',
+ ): 'disassociate_whatsapp_business_account',
+ (
+ 'DisassociateWhatsAppBusinessAccount',
+ '-',
+ ): 'disassociate-whatsapp-business-account',
+ (
+ 'GetLinkedWhatsAppBusinessAccount',
+ '_',
+ ): 'get_linked_whatsapp_business_account',
+ (
+ 'GetLinkedWhatsAppBusinessAccount',
+ '-',
+ ): 'get-linked-whatsapp-business-account',
+ (
+ 'GetLinkedWhatsAppBusinessAccountPhoneNumber',
+ '_',
+ ): 'get_linked_whatsapp_business_account_phone_number',
+ (
+ 'GetLinkedWhatsAppBusinessAccountPhoneNumber',
+ '-',
+ ): 'get-linked-whatsapp-business-account-phone-number',
+ ('GetWhatsAppMessageMedia', '_'): 'get_whatsapp_message_media',
+ ('GetWhatsAppMessageMedia', '-'): 'get-whatsapp-message-media',
+ (
+ 'ListLinkedWhatsAppBusinessAccounts',
+ '_',
+ ): 'list_linked_whatsapp_business_accounts',
+ (
+ 'ListLinkedWhatsAppBusinessAccounts',
+ '-',
+ ): 'list-linked-whatsapp-business-accounts',
+ ('PostWhatsAppMessageMedia', '_'): 'post_whatsapp_message_media',
+ ('PostWhatsAppMessageMedia', '-'): 'post-whatsapp-message-media',
+ (
+ 'PutWhatsAppBusinessAccountEventDestinations',
+ '_',
+ ): 'put_whatsapp_business_account_event_destinations',
+ (
+ 'PutWhatsAppBusinessAccountEventDestinations',
+ '-',
+ ): 'put-whatsapp-business-account-event-destinations',
+ ('SendWhatsAppMessage', '_'): 'send_whatsapp_message',
+ ('SendWhatsAppMessage', '-'): 'send-whatsapp-message',
+}
+ScalarTypes = ('string', 'integer', 'boolean', 'timestamp', 'float', 'double')
+
+BOTOCORE_ROOT = os.path.dirname(os.path.abspath(__file__))
+
+
+# Used to specify anonymous (unsigned) request signature
+class UNSIGNED:
+ def __copy__(self):
+ return self
+
+ def __deepcopy__(self, memodict):
+ return self
+
+
+UNSIGNED = UNSIGNED()
+
+
+def xform_name(name, sep='_', _xform_cache=_xform_cache):
+ """Convert camel case to a "pythonic" name.
+
+ If the name contains the ``sep`` character, then it is
+ returned unchanged.
+
+ """
+ if sep in name:
+ # If the sep is in the name, assume that it's already
+ # transformed and return the string unchanged.
+ return name
+ key = (name, sep)
+ if key not in _xform_cache:
+ if _special_case_transform.search(name) is not None:
+ is_special = _special_case_transform.search(name)
+ matched = is_special.group()
+ # Replace something like ARNs, ACLs with _arns, _acls.
+ name = f"{name[: -len(matched)]}{sep}{matched.lower()}"
+ s1 = _first_cap_regex.sub(r'\1' + sep + r'\2', name)
+ transformed = _end_cap_regex.sub(r'\1' + sep + r'\2', s1).lower()
+ _xform_cache[key] = transformed
+ return _xform_cache[key]
+
+
+def register_initializer(callback):
+ """Register an initializer function for session creation.
+
+ This initializer function will be invoked whenever a new
+ `botocore.session.Session` is instantiated.
+
+ :type callback: callable
+ :param callback: A callable that accepts a single argument
+ of type `botocore.session.Session`.
+
+ """
+ _INITIALIZERS.append(callback)
+
+
+def unregister_initializer(callback):
+ """Unregister an initializer function.
+
+ :type callback: callable
+ :param callback: A callable that was previously registered
+ with `botocore.register_initializer`.
+
+ :raises ValueError: If a callback is provided that is not currently
+ registered as an initializer.
+
+ """
+ _INITIALIZERS.remove(callback)
+
+
+def invoke_initializers(session):
+ """Invoke all initializers for a session.
+
+ :type session: botocore.session.Session
+ :param session: The session to initialize.
+
+ """
+ for initializer in _INITIALIZERS:
+ initializer(session)
diff --git a/.venv/lib/python3.12/site-packages/botocore/args.py b/.venv/lib/python3.12/site-packages/botocore/args.py
new file mode 100644
index 00000000..602abd09
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/args.py
@@ -0,0 +1,933 @@
+# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+"""Internal module to help with normalizing botocore client args.
+
+This module (and all function/classes within this module) should be
+considered internal, and *not* a public API.
+
+"""
+
+import copy
+import logging
+import socket
+
+import botocore.exceptions
+import botocore.parsers
+import botocore.serialize
+from botocore.config import Config
+from botocore.endpoint import EndpointCreator
+from botocore.regions import EndpointResolverBuiltins as EPRBuiltins
+from botocore.regions import EndpointRulesetResolver
+from botocore.signers import RequestSigner
+from botocore.useragent import UserAgentString, register_feature_id
+from botocore.utils import ensure_boolean, is_s3_accelerate_url
+
+logger = logging.getLogger(__name__)
+
+
+VALID_REGIONAL_ENDPOINTS_CONFIG = [
+ 'legacy',
+ 'regional',
+]
+LEGACY_GLOBAL_STS_REGIONS = [
+ 'ap-northeast-1',
+ 'ap-south-1',
+ 'ap-southeast-1',
+ 'ap-southeast-2',
+ 'aws-global',
+ 'ca-central-1',
+ 'eu-central-1',
+ 'eu-north-1',
+ 'eu-west-1',
+ 'eu-west-2',
+ 'eu-west-3',
+ 'sa-east-1',
+ 'us-east-1',
+ 'us-east-2',
+ 'us-west-1',
+ 'us-west-2',
+]
+# Maximum allowed length of the ``user_agent_appid`` config field. Longer
+# values result in a warning-level log message.
+USERAGENT_APPID_MAXLEN = 50
+
+VALID_REQUEST_CHECKSUM_CALCULATION_CONFIG = (
+ "when_supported",
+ "when_required",
+)
+VALID_RESPONSE_CHECKSUM_VALIDATION_CONFIG = (
+ "when_supported",
+ "when_required",
+)
+
+PRIORITY_ORDERED_SUPPORTED_PROTOCOLS = (
+ 'smithy-rpc-v2-cbor',
+ 'json',
+ 'rest-json',
+ 'rest-xml',
+ 'query',
+ 'ec2',
+)
+
+VALID_ACCOUNT_ID_ENDPOINT_MODE_CONFIG = (
+ 'preferred',
+ 'disabled',
+ 'required',
+)
+
+
+class ClientArgsCreator:
+ def __init__(
+ self,
+ event_emitter,
+ user_agent,
+ response_parser_factory,
+ loader,
+ exceptions_factory,
+ config_store,
+ user_agent_creator=None,
+ ):
+ self._event_emitter = event_emitter
+ self._response_parser_factory = response_parser_factory
+ self._loader = loader
+ self._exceptions_factory = exceptions_factory
+ self._config_store = config_store
+ if user_agent_creator is None:
+ self._session_ua_creator = UserAgentString.from_environment()
+ else:
+ self._session_ua_creator = user_agent_creator
+
+ def get_client_args(
+ self,
+ service_model,
+ region_name,
+ is_secure,
+ endpoint_url,
+ verify,
+ credentials,
+ scoped_config,
+ client_config,
+ endpoint_bridge,
+ auth_token=None,
+ endpoints_ruleset_data=None,
+ partition_data=None,
+ ):
+ final_args = self.compute_client_args(
+ service_model,
+ client_config,
+ endpoint_bridge,
+ region_name,
+ endpoint_url,
+ is_secure,
+ scoped_config,
+ )
+
+ service_name = final_args['service_name'] # noqa
+ parameter_validation = final_args['parameter_validation']
+ endpoint_config = final_args['endpoint_config']
+ protocol = final_args['protocol']
+ config_kwargs = final_args['config_kwargs']
+ s3_config = final_args['s3_config']
+ partition = endpoint_config['metadata'].get('partition', None)
+ socket_options = final_args['socket_options']
+ configured_endpoint_url = final_args['configured_endpoint_url']
+ signing_region = endpoint_config['signing_region']
+ endpoint_region_name = endpoint_config['region_name']
+ account_id_endpoint_mode = config_kwargs['account_id_endpoint_mode']
+
+ event_emitter = copy.copy(self._event_emitter)
+ signer = RequestSigner(
+ service_model.service_id,
+ signing_region,
+ endpoint_config['signing_name'],
+ endpoint_config['signature_version'],
+ credentials,
+ event_emitter,
+ auth_token,
+ )
+
+ config_kwargs['s3'] = s3_config
+ new_config = Config(**config_kwargs)
+ endpoint_creator = EndpointCreator(event_emitter)
+
+ endpoint = endpoint_creator.create_endpoint(
+ service_model,
+ region_name=endpoint_region_name,
+ endpoint_url=endpoint_config['endpoint_url'],
+ verify=verify,
+ response_parser_factory=self._response_parser_factory,
+ max_pool_connections=new_config.max_pool_connections,
+ proxies=new_config.proxies,
+ timeout=(new_config.connect_timeout, new_config.read_timeout),
+ socket_options=socket_options,
+ client_cert=new_config.client_cert,
+ proxies_config=new_config.proxies_config,
+ )
+
+ serializer = botocore.serialize.create_serializer(
+ protocol, parameter_validation
+ )
+ response_parser = botocore.parsers.create_parser(protocol)
+
+ ruleset_resolver = self._build_endpoint_resolver(
+ endpoints_ruleset_data,
+ partition_data,
+ client_config,
+ service_model,
+ endpoint_region_name,
+ region_name,
+ configured_endpoint_url,
+ endpoint,
+ is_secure,
+ endpoint_bridge,
+ event_emitter,
+ credentials,
+ account_id_endpoint_mode,
+ )
+
+ # Copy the session's user agent factory and adds client configuration.
+ client_ua_creator = self._session_ua_creator.with_client_config(
+ new_config
+ )
+ supplied_ua = client_config.user_agent if client_config else None
+ new_config._supplied_user_agent = supplied_ua
+
+ return {
+ 'serializer': serializer,
+ 'endpoint': endpoint,
+ 'response_parser': response_parser,
+ 'event_emitter': event_emitter,
+ 'request_signer': signer,
+ 'service_model': service_model,
+ 'loader': self._loader,
+ 'client_config': new_config,
+ 'partition': partition,
+ 'exceptions_factory': self._exceptions_factory,
+ 'endpoint_ruleset_resolver': ruleset_resolver,
+ 'user_agent_creator': client_ua_creator,
+ }
+
+ def compute_client_args(
+ self,
+ service_model,
+ client_config,
+ endpoint_bridge,
+ region_name,
+ endpoint_url,
+ is_secure,
+ scoped_config,
+ ):
+ service_name = service_model.endpoint_prefix
+ protocol = self._resolve_protocol(service_model)
+ parameter_validation = True
+ if client_config and not client_config.parameter_validation:
+ parameter_validation = False
+ elif scoped_config:
+ raw_value = scoped_config.get('parameter_validation')
+ if raw_value is not None:
+ parameter_validation = ensure_boolean(raw_value)
+
+ s3_config = self.compute_s3_config(client_config)
+
+ configured_endpoint_url = self._compute_configured_endpoint_url(
+ client_config=client_config,
+ endpoint_url=endpoint_url,
+ )
+ if configured_endpoint_url is not None:
+ register_feature_id('ENDPOINT_OVERRIDE')
+
+ endpoint_config = self._compute_endpoint_config(
+ service_name=service_name,
+ region_name=region_name,
+ endpoint_url=configured_endpoint_url,
+ is_secure=is_secure,
+ endpoint_bridge=endpoint_bridge,
+ s3_config=s3_config,
+ )
+ endpoint_variant_tags = endpoint_config['metadata'].get('tags', [])
+
+ # Some third-party libraries expect the final user-agent string in
+ # ``client.meta.config.user_agent``. To maintain backwards
+ # compatibility, the preliminary user-agent string (before any Config
+ # object modifications and without request-specific user-agent
+ # components) is stored in the new Config object's ``user_agent``
+ # property but not used by Botocore itself.
+ preliminary_ua_string = self._session_ua_creator.with_client_config(
+ client_config
+ ).to_string()
+ # Create a new client config to be passed to the client based
+ # on the final values. We do not want the user to be able
+ # to try to modify an existing client with a client config.
+ config_kwargs = dict(
+ region_name=endpoint_config['region_name'],
+ signature_version=endpoint_config['signature_version'],
+ user_agent=preliminary_ua_string,
+ )
+ if 'dualstack' in endpoint_variant_tags:
+ config_kwargs.update(use_dualstack_endpoint=True)
+ if 'fips' in endpoint_variant_tags:
+ config_kwargs.update(use_fips_endpoint=True)
+ if client_config is not None:
+ config_kwargs.update(
+ connect_timeout=client_config.connect_timeout,
+ read_timeout=client_config.read_timeout,
+ max_pool_connections=client_config.max_pool_connections,
+ proxies=client_config.proxies,
+ proxies_config=client_config.proxies_config,
+ retries=client_config.retries,
+ client_cert=client_config.client_cert,
+ inject_host_prefix=client_config.inject_host_prefix,
+ tcp_keepalive=client_config.tcp_keepalive,
+ user_agent_extra=client_config.user_agent_extra,
+ user_agent_appid=client_config.user_agent_appid,
+ request_min_compression_size_bytes=(
+ client_config.request_min_compression_size_bytes
+ ),
+ disable_request_compression=(
+ client_config.disable_request_compression
+ ),
+ client_context_params=client_config.client_context_params,
+ sigv4a_signing_region_set=(
+ client_config.sigv4a_signing_region_set
+ ),
+ request_checksum_calculation=(
+ client_config.request_checksum_calculation
+ ),
+ response_checksum_validation=(
+ client_config.response_checksum_validation
+ ),
+ account_id_endpoint_mode=client_config.account_id_endpoint_mode,
+ )
+ self._compute_retry_config(config_kwargs)
+ self._compute_connect_timeout(config_kwargs)
+ self._compute_user_agent_appid_config(config_kwargs)
+ self._compute_request_compression_config(config_kwargs)
+ self._compute_sigv4a_signing_region_set_config(config_kwargs)
+ self._compute_checksum_config(config_kwargs)
+ self._compute_account_id_endpoint_mode_config(config_kwargs)
+ self._compute_inject_host_prefix(client_config, config_kwargs)
+ s3_config = self.compute_s3_config(client_config)
+
+ is_s3_service = self._is_s3_service(service_name)
+
+ if is_s3_service and 'dualstack' in endpoint_variant_tags:
+ if s3_config is None:
+ s3_config = {}
+ s3_config['use_dualstack_endpoint'] = True
+
+ return {
+ 'service_name': service_name,
+ 'parameter_validation': parameter_validation,
+ 'configured_endpoint_url': configured_endpoint_url,
+ 'endpoint_config': endpoint_config,
+ 'protocol': protocol,
+ 'config_kwargs': config_kwargs,
+ 's3_config': s3_config,
+ 'socket_options': self._compute_socket_options(
+ scoped_config, client_config
+ ),
+ }
+
+ def _compute_inject_host_prefix(self, client_config, config_kwargs):
+ # In the cases that a Config object was not provided, or the private value
+ # remained UNSET, we should resolve the value from the config store.
+ if (
+ client_config is None
+ or client_config._inject_host_prefix == 'UNSET'
+ ):
+ configured_disable_host_prefix_injection = (
+ self._config_store.get_config_variable(
+ 'disable_host_prefix_injection'
+ )
+ )
+ if configured_disable_host_prefix_injection is not None:
+ config_kwargs[
+ 'inject_host_prefix'
+ ] = not configured_disable_host_prefix_injection
+ else:
+ config_kwargs['inject_host_prefix'] = True
+
+ def _compute_configured_endpoint_url(self, client_config, endpoint_url):
+ if endpoint_url is not None:
+ return endpoint_url
+
+ if self._ignore_configured_endpoint_urls(client_config):
+ logger.debug("Ignoring configured endpoint URLs.")
+ return endpoint_url
+
+ return self._config_store.get_config_variable('endpoint_url')
+
+ def _ignore_configured_endpoint_urls(self, client_config):
+ if (
+ client_config
+ and client_config.ignore_configured_endpoint_urls is not None
+ ):
+ return client_config.ignore_configured_endpoint_urls
+
+ return self._config_store.get_config_variable(
+ 'ignore_configured_endpoint_urls'
+ )
+
+ def compute_s3_config(self, client_config):
+ s3_configuration = self._config_store.get_config_variable('s3')
+
+ # Next specific client config values takes precedence over
+ # specific values in the scoped config.
+ if client_config is not None:
+ if client_config.s3 is not None:
+ if s3_configuration is None:
+ s3_configuration = client_config.s3
+ else:
+ # The current s3_configuration dictionary may be
+ # from a source that only should be read from so
+ # we want to be safe and just make a copy of it to modify
+ # before it actually gets updated.
+ s3_configuration = s3_configuration.copy()
+ s3_configuration.update(client_config.s3)
+
+ return s3_configuration
+
+ def _is_s3_service(self, service_name):
+ """Whether the service is S3 or S3 Control.
+
+ Note that throughout this class, service_name refers to the endpoint
+ prefix, not the folder name of the service in botocore/data. For
+ S3 Control, the folder name is 's3control' but the endpoint prefix is
+ 's3-control'.
+ """
+ return service_name in ['s3', 's3-control']
+
+ def _compute_endpoint_config(
+ self,
+ service_name,
+ region_name,
+ endpoint_url,
+ is_secure,
+ endpoint_bridge,
+ s3_config,
+ ):
+ resolve_endpoint_kwargs = {
+ 'service_name': service_name,
+ 'region_name': region_name,
+ 'endpoint_url': endpoint_url,
+ 'is_secure': is_secure,
+ 'endpoint_bridge': endpoint_bridge,
+ }
+ if service_name == 's3':
+ return self._compute_s3_endpoint_config(
+ s3_config=s3_config, **resolve_endpoint_kwargs
+ )
+ if service_name == 'sts':
+ return self._compute_sts_endpoint_config(**resolve_endpoint_kwargs)
+ return self._resolve_endpoint(**resolve_endpoint_kwargs)
+
+ def _compute_s3_endpoint_config(
+ self, s3_config, **resolve_endpoint_kwargs
+ ):
+ force_s3_global = self._should_force_s3_global(
+ resolve_endpoint_kwargs['region_name'], s3_config
+ )
+ if force_s3_global:
+ resolve_endpoint_kwargs['region_name'] = None
+ endpoint_config = self._resolve_endpoint(**resolve_endpoint_kwargs)
+ self._set_region_if_custom_s3_endpoint(
+ endpoint_config, resolve_endpoint_kwargs['endpoint_bridge']
+ )
+ # For backwards compatibility reasons, we want to make sure the
+ # client.meta.region_name will remain us-east-1 if we forced the
+ # endpoint to be the global region. Specifically, if this value
+ # changes to aws-global, it breaks logic where a user is checking
+ # for us-east-1 as the global endpoint such as in creating buckets.
+ if force_s3_global and endpoint_config['region_name'] == 'aws-global':
+ endpoint_config['region_name'] = 'us-east-1'
+ return endpoint_config
+
+ def _should_force_s3_global(self, region_name, s3_config):
+ s3_regional_config = 'legacy'
+ if s3_config and 'us_east_1_regional_endpoint' in s3_config:
+ s3_regional_config = s3_config['us_east_1_regional_endpoint']
+ self._validate_s3_regional_config(s3_regional_config)
+
+ is_global_region = region_name in ('us-east-1', None)
+ return s3_regional_config == 'legacy' and is_global_region
+
+ def _validate_s3_regional_config(self, config_val):
+ if config_val not in VALID_REGIONAL_ENDPOINTS_CONFIG:
+ raise botocore.exceptions.InvalidS3UsEast1RegionalEndpointConfigError(
+ s3_us_east_1_regional_endpoint_config=config_val
+ )
+
+ def _set_region_if_custom_s3_endpoint(
+ self, endpoint_config, endpoint_bridge
+ ):
+ # If a user is providing a custom URL, the endpoint resolver will
+ # refuse to infer a signing region. If we want to default to s3v4,
+ # we have to account for this.
+ if (
+ endpoint_config['signing_region'] is None
+ and endpoint_config['region_name'] is None
+ ):
+ endpoint = endpoint_bridge.resolve('s3')
+ endpoint_config['signing_region'] = endpoint['signing_region']
+ endpoint_config['region_name'] = endpoint['region_name']
+
+ def _compute_sts_endpoint_config(self, **resolve_endpoint_kwargs):
+ endpoint_config = self._resolve_endpoint(**resolve_endpoint_kwargs)
+ if self._should_set_global_sts_endpoint(
+ resolve_endpoint_kwargs['region_name'],
+ resolve_endpoint_kwargs['endpoint_url'],
+ endpoint_config,
+ ):
+ self._set_global_sts_endpoint(
+ endpoint_config, resolve_endpoint_kwargs['is_secure']
+ )
+ return endpoint_config
+
+ def _should_set_global_sts_endpoint(
+ self, region_name, endpoint_url, endpoint_config
+ ):
+ has_variant_tags = endpoint_config and endpoint_config.get(
+ 'metadata', {}
+ ).get('tags')
+ if endpoint_url or has_variant_tags:
+ return False
+ return (
+ self._get_sts_regional_endpoints_config() == 'legacy'
+ and region_name in LEGACY_GLOBAL_STS_REGIONS
+ )
+
+ def _get_sts_regional_endpoints_config(self):
+ sts_regional_endpoints_config = self._config_store.get_config_variable(
+ 'sts_regional_endpoints'
+ )
+ if not sts_regional_endpoints_config:
+ sts_regional_endpoints_config = 'legacy'
+ if (
+ sts_regional_endpoints_config
+ not in VALID_REGIONAL_ENDPOINTS_CONFIG
+ ):
+ raise botocore.exceptions.InvalidSTSRegionalEndpointsConfigError(
+ sts_regional_endpoints_config=sts_regional_endpoints_config
+ )
+ return sts_regional_endpoints_config
+
+ def _set_global_sts_endpoint(self, endpoint_config, is_secure):
+ scheme = 'https' if is_secure else 'http'
+ endpoint_config['endpoint_url'] = f'{scheme}://sts.amazonaws.com'
+ endpoint_config['signing_region'] = 'us-east-1'
+
+ def _resolve_endpoint(
+ self,
+ service_name,
+ region_name,
+ endpoint_url,
+ is_secure,
+ endpoint_bridge,
+ ):
+ return endpoint_bridge.resolve(
+ service_name, region_name, endpoint_url, is_secure
+ )
+
+ def _compute_socket_options(self, scoped_config, client_config=None):
+ # This disables Nagle's algorithm and is the default socket options
+ # in urllib3.
+ socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]
+ client_keepalive = client_config and client_config.tcp_keepalive
+ scoped_keepalive = scoped_config and self._ensure_boolean(
+ scoped_config.get("tcp_keepalive", False)
+ )
+ # Enables TCP Keepalive if specified in client config object or shared config file.
+ if client_keepalive or scoped_keepalive:
+ socket_options.append((socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1))
+ return socket_options
+
+ def _compute_retry_config(self, config_kwargs):
+ self._compute_retry_max_attempts(config_kwargs)
+ self._compute_retry_mode(config_kwargs)
+
+ def _compute_retry_max_attempts(self, config_kwargs):
+ # There's a pre-existing max_attempts client config value that actually
+ # means max *retry* attempts. There's also a `max_attempts` we pull
+ # from the config store that means *total attempts*, which includes the
+ # intitial request. We can't change what `max_attempts` means in
+ # client config so we try to normalize everything to a new
+ # "total_max_attempts" variable. We ensure that after this, the only
+ # configuration for "max attempts" is the 'total_max_attempts' key.
+ # An explicitly provided max_attempts in the client config
+ # overrides everything.
+ retries = config_kwargs.get('retries')
+ if retries is not None:
+ if 'total_max_attempts' in retries:
+ retries.pop('max_attempts', None)
+ return
+ if 'max_attempts' in retries:
+ value = retries.pop('max_attempts')
+ # client config max_attempts means total retries so we
+ # have to add one for 'total_max_attempts' to account
+ # for the initial request.
+ retries['total_max_attempts'] = value + 1
+ return
+ # Otherwise we'll check the config store which checks env vars,
+ # config files, etc. There is no default value for max_attempts
+ # so if this returns None and we don't set a default value here.
+ max_attempts = self._config_store.get_config_variable('max_attempts')
+ if max_attempts is not None:
+ if retries is None:
+ retries = {}
+ config_kwargs['retries'] = retries
+ retries['total_max_attempts'] = max_attempts
+
+ def _compute_retry_mode(self, config_kwargs):
+ retries = config_kwargs.get('retries')
+ if retries is None:
+ retries = {}
+ config_kwargs['retries'] = retries
+ elif 'mode' in retries:
+ # If there's a retry mode explicitly set in the client config
+ # that overrides everything.
+ return
+ retry_mode = self._config_store.get_config_variable('retry_mode')
+ if retry_mode is None:
+ retry_mode = 'legacy'
+ retries['mode'] = retry_mode
+
+ def _compute_connect_timeout(self, config_kwargs):
+ # Checking if connect_timeout is set on the client config.
+ # If it is not, we check the config_store in case a
+ # non legacy default mode has been configured.
+ connect_timeout = config_kwargs.get('connect_timeout')
+ if connect_timeout is not None:
+ return
+ connect_timeout = self._config_store.get_config_variable(
+ 'connect_timeout'
+ )
+ if connect_timeout:
+ config_kwargs['connect_timeout'] = connect_timeout
+
+ def _compute_request_compression_config(self, config_kwargs):
+ min_size = config_kwargs.get('request_min_compression_size_bytes')
+ disabled = config_kwargs.get('disable_request_compression')
+ if min_size is None:
+ min_size = self._config_store.get_config_variable(
+ 'request_min_compression_size_bytes'
+ )
+ # conversion func is skipped so input validation must be done here
+ # regardless if the value is coming from the config store or the
+ # config object
+ min_size = self._validate_min_compression_size(min_size)
+ config_kwargs['request_min_compression_size_bytes'] = min_size
+
+ if disabled is None:
+ disabled = self._config_store.get_config_variable(
+ 'disable_request_compression'
+ )
+ else:
+ # if the user provided a value we must check if it's a boolean
+ disabled = ensure_boolean(disabled)
+ config_kwargs['disable_request_compression'] = disabled
+
+ def _validate_min_compression_size(self, min_size):
+ min_allowed_min_size = 1
+ max_allowed_min_size = 1048576
+ error_msg_base = (
+ f'Invalid value "{min_size}" for '
+ 'request_min_compression_size_bytes.'
+ )
+ try:
+ min_size = int(min_size)
+ except (ValueError, TypeError):
+ msg = (
+ f'{error_msg_base} Value must be an integer. '
+ f'Received {type(min_size)} instead.'
+ )
+ raise botocore.exceptions.InvalidConfigError(error_msg=msg)
+ if not min_allowed_min_size <= min_size <= max_allowed_min_size:
+ msg = (
+ f'{error_msg_base} Value must be between '
+ f'{min_allowed_min_size} and {max_allowed_min_size}.'
+ )
+ raise botocore.exceptions.InvalidConfigError(error_msg=msg)
+
+ return min_size
+
+ def _ensure_boolean(self, val):
+ if isinstance(val, bool):
+ return val
+ else:
+ return val.lower() == 'true'
+
+ def _build_endpoint_resolver(
+ self,
+ endpoints_ruleset_data,
+ partition_data,
+ client_config,
+ service_model,
+ endpoint_region_name,
+ region_name,
+ endpoint_url,
+ endpoint,
+ is_secure,
+ endpoint_bridge,
+ event_emitter,
+ credentials,
+ account_id_endpoint_mode,
+ ):
+ if endpoints_ruleset_data is None:
+ return None
+
+ # The legacy EndpointResolver is global to the session, but
+ # EndpointRulesetResolver is service-specific. Builtins for
+ # EndpointRulesetResolver must not be derived from the legacy
+ # endpoint resolver's output, including final_args, s3_config,
+ # etc.
+ s3_config_raw = self.compute_s3_config(client_config) or {}
+ service_name_raw = service_model.endpoint_prefix
+ # Maintain complex logic for s3 and sts endpoints for backwards
+ # compatibility.
+ if service_name_raw in ['s3', 'sts'] or region_name is None:
+ eprv2_region_name = endpoint_region_name
+ else:
+ eprv2_region_name = region_name
+ resolver_builtins = self.compute_endpoint_resolver_builtin_defaults(
+ region_name=eprv2_region_name,
+ service_name=service_name_raw,
+ s3_config=s3_config_raw,
+ endpoint_bridge=endpoint_bridge,
+ client_endpoint_url=endpoint_url,
+ legacy_endpoint_url=endpoint.host,
+ credentials=credentials,
+ account_id_endpoint_mode=account_id_endpoint_mode,
+ )
+ # Client context params for s3 conflict with the available settings
+ # in the `s3` parameter on the `Config` object. If the same parameter
+ # is set in both places, the value in the `s3` parameter takes priority.
+ if client_config is not None:
+ client_context = client_config.client_context_params or {}
+ else:
+ client_context = {}
+ if self._is_s3_service(service_name_raw):
+ client_context.update(s3_config_raw)
+
+ sig_version = (
+ client_config.signature_version
+ if client_config is not None
+ else None
+ )
+ return EndpointRulesetResolver(
+ endpoint_ruleset_data=endpoints_ruleset_data,
+ partition_data=partition_data,
+ service_model=service_model,
+ builtins=resolver_builtins,
+ client_context=client_context,
+ event_emitter=event_emitter,
+ use_ssl=is_secure,
+ requested_auth_scheme=sig_version,
+ )
+
+ def compute_endpoint_resolver_builtin_defaults(
+ self,
+ region_name,
+ service_name,
+ s3_config,
+ endpoint_bridge,
+ client_endpoint_url,
+ legacy_endpoint_url,
+ credentials,
+ account_id_endpoint_mode,
+ ):
+ # EndpointRulesetResolver rulesets may accept an "SDK::Endpoint" as
+ # input. If the endpoint_url argument of create_client() is set, it
+ # always takes priority.
+ if client_endpoint_url:
+ given_endpoint = client_endpoint_url
+ # If an endpoints.json data file other than the one bundled within
+ # the botocore/data directory is used, the output of legacy
+ # endpoint resolution is provided to EndpointRulesetResolver.
+ elif not endpoint_bridge.resolver_uses_builtin_data():
+ given_endpoint = legacy_endpoint_url
+ else:
+ given_endpoint = None
+
+ # The endpoint rulesets differ from legacy botocore behavior in whether
+ # forcing path style addressing in incompatible situations raises an
+ # exception or silently ignores the config setting. The
+ # AWS_S3_FORCE_PATH_STYLE parameter is adjusted both here and for each
+ # operation so that the ruleset behavior is backwards compatible.
+ if s3_config.get('use_accelerate_endpoint', False):
+ force_path_style = False
+ elif client_endpoint_url is not None and not is_s3_accelerate_url(
+ client_endpoint_url
+ ):
+ force_path_style = s3_config.get('addressing_style') != 'virtual'
+ else:
+ force_path_style = s3_config.get('addressing_style') == 'path'
+
+ return {
+ EPRBuiltins.AWS_REGION: region_name,
+ EPRBuiltins.AWS_USE_FIPS: (
+ # SDK_ENDPOINT cannot be combined with AWS_USE_FIPS
+ given_endpoint is None
+ # use legacy resolver's _resolve_endpoint_variant_config_var()
+ # or default to False if it returns None
+ and endpoint_bridge._resolve_endpoint_variant_config_var(
+ 'use_fips_endpoint'
+ )
+ or False
+ ),
+ EPRBuiltins.AWS_USE_DUALSTACK: (
+ # SDK_ENDPOINT cannot be combined with AWS_USE_DUALSTACK
+ given_endpoint is None
+ # use legacy resolver's _resolve_use_dualstack_endpoint() and
+ # or default to False if it returns None
+ and endpoint_bridge._resolve_use_dualstack_endpoint(
+ service_name
+ )
+ or False
+ ),
+ EPRBuiltins.AWS_STS_USE_GLOBAL_ENDPOINT: (
+ self._should_set_global_sts_endpoint(
+ region_name=region_name,
+ endpoint_url=None,
+ endpoint_config=None,
+ )
+ ),
+ EPRBuiltins.AWS_S3_USE_GLOBAL_ENDPOINT: (
+ self._should_force_s3_global(region_name, s3_config)
+ ),
+ EPRBuiltins.AWS_S3_ACCELERATE: s3_config.get(
+ 'use_accelerate_endpoint', False
+ ),
+ EPRBuiltins.AWS_S3_FORCE_PATH_STYLE: force_path_style,
+ EPRBuiltins.AWS_S3_USE_ARN_REGION: s3_config.get(
+ 'use_arn_region', True
+ ),
+ EPRBuiltins.AWS_S3CONTROL_USE_ARN_REGION: s3_config.get(
+ 'use_arn_region', False
+ ),
+ EPRBuiltins.AWS_S3_DISABLE_MRAP: s3_config.get(
+ 's3_disable_multiregion_access_points', False
+ ),
+ EPRBuiltins.SDK_ENDPOINT: given_endpoint,
+ EPRBuiltins.ACCOUNT_ID: credentials.get_deferred_property(
+ 'account_id'
+ )
+ if credentials
+ else None,
+ EPRBuiltins.ACCOUNT_ID_ENDPOINT_MODE: account_id_endpoint_mode,
+ }
+
+ def _compute_user_agent_appid_config(self, config_kwargs):
+ user_agent_appid = config_kwargs.get('user_agent_appid')
+ if user_agent_appid is None:
+ user_agent_appid = self._config_store.get_config_variable(
+ 'user_agent_appid'
+ )
+ if (
+ user_agent_appid is not None
+ and len(user_agent_appid) > USERAGENT_APPID_MAXLEN
+ ):
+ logger.warning(
+ 'The configured value for user_agent_appid exceeds the '
+ f'maximum length of {USERAGENT_APPID_MAXLEN} characters.'
+ )
+ config_kwargs['user_agent_appid'] = user_agent_appid
+
+ def _compute_sigv4a_signing_region_set_config(self, config_kwargs):
+ sigv4a_signing_region_set = config_kwargs.get(
+ 'sigv4a_signing_region_set'
+ )
+ if sigv4a_signing_region_set is None:
+ sigv4a_signing_region_set = self._config_store.get_config_variable(
+ 'sigv4a_signing_region_set'
+ )
+ config_kwargs['sigv4a_signing_region_set'] = sigv4a_signing_region_set
+
+ def _compute_checksum_config(self, config_kwargs):
+ self._handle_checksum_config(
+ config_kwargs,
+ config_key="request_checksum_calculation",
+ valid_options=VALID_REQUEST_CHECKSUM_CALCULATION_CONFIG,
+ )
+ self._handle_checksum_config(
+ config_kwargs,
+ config_key="response_checksum_validation",
+ valid_options=VALID_RESPONSE_CHECKSUM_VALIDATION_CONFIG,
+ )
+
+ def _resolve_protocol(self, service_model):
+ # We need to ensure `protocols` exists in the metadata before attempting to
+ # access it directly since referencing service_model.protocols directly will
+ # raise an UndefinedModelAttributeError if protocols is not defined
+ if service_model.metadata.get('protocols'):
+ for protocol in PRIORITY_ORDERED_SUPPORTED_PROTOCOLS:
+ if protocol in service_model.protocols:
+ return protocol
+ raise botocore.exceptions.UnsupportedServiceProtocolsError(
+ botocore_supported_protocols=PRIORITY_ORDERED_SUPPORTED_PROTOCOLS,
+ service_supported_protocols=service_model.protocols,
+ service=service_model.service_name,
+ )
+ # If a service does not have a `protocols` trait, fall back to the legacy
+ # `protocol` trait
+ return service_model.protocol
+
+ def _handle_checksum_config(
+ self,
+ config_kwargs,
+ config_key,
+ valid_options,
+ ):
+ value = config_kwargs.get(config_key)
+ if value is None:
+ value = self._config_store.get_config_variable(config_key)
+
+ if isinstance(value, str):
+ value = value.lower()
+
+ if value not in valid_options:
+ raise botocore.exceptions.InvalidChecksumConfigError(
+ config_key=config_key,
+ config_value=value,
+ valid_options=valid_options,
+ )
+ config_kwargs[config_key] = value
+
+ def _compute_account_id_endpoint_mode_config(self, config_kwargs):
+ config_key = 'account_id_endpoint_mode'
+
+ # Disable account id based endpoint routing for unsigned requests
+ # since there are no credentials to resolve.
+ signature_version = config_kwargs.get('signature_version')
+ if signature_version is botocore.UNSIGNED:
+ config_kwargs[config_key] = 'disabled'
+ return
+
+ account_id_endpoint_mode = config_kwargs.get(config_key)
+ if account_id_endpoint_mode is None:
+ account_id_endpoint_mode = self._config_store.get_config_variable(
+ config_key
+ )
+
+ if isinstance(account_id_endpoint_mode, str):
+ account_id_endpoint_mode = account_id_endpoint_mode.lower()
+
+ if (
+ account_id_endpoint_mode
+ not in VALID_ACCOUNT_ID_ENDPOINT_MODE_CONFIG
+ ):
+ raise botocore.exceptions.InvalidConfigError(
+ error_msg=f"The configured value '{account_id_endpoint_mode}' for '{config_key}' is "
+ f"invalid. Valid values are: {VALID_ACCOUNT_ID_ENDPOINT_MODE_CONFIG}."
+ )
+
+ config_kwargs[config_key] = account_id_endpoint_mode
diff --git a/.venv/lib/python3.12/site-packages/botocore/auth.py b/.venv/lib/python3.12/site-packages/botocore/auth.py
new file mode 100644
index 00000000..bacbd39d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/auth.py
@@ -0,0 +1,1188 @@
+# Copyright (c) 2012-2013 Mitch Garnaat http://garnaat.org/
+# Copyright 2012-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import base64
+import calendar
+import datetime
+import functools
+import hmac
+import json
+import logging
+import time
+from collections.abc import Mapping
+from email.utils import formatdate
+from hashlib import sha1, sha256
+from operator import itemgetter
+
+from botocore.compat import (
+ HAS_CRT,
+ HTTPHeaders,
+ encodebytes,
+ ensure_unicode,
+ parse_qs,
+ quote,
+ unquote,
+ urlsplit,
+ urlunsplit,
+)
+from botocore.exceptions import (
+ NoAuthTokenError,
+ NoCredentialsError,
+ UnknownSignatureVersionError,
+ UnsupportedSignatureVersionError,
+)
+from botocore.utils import (
+ is_valid_ipv6_endpoint_url,
+ normalize_url_path,
+ percent_encode_sequence,
+)
+
+# Imports for backwards compatibility
+from botocore.compat import MD5_AVAILABLE # noqa
+
+
+logger = logging.getLogger(__name__)
+
+
+EMPTY_SHA256_HASH = (
+ 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
+)
+# This is the buffer size used when calculating sha256 checksums.
+# Experimenting with various buffer sizes showed that this value generally
+# gave the best result (in terms of performance).
+PAYLOAD_BUFFER = 1024 * 1024
+ISO8601 = '%Y-%m-%dT%H:%M:%SZ'
+SIGV4_TIMESTAMP = '%Y%m%dT%H%M%SZ'
+SIGNED_HEADERS_BLACKLIST = [
+ 'expect',
+ 'transfer-encoding',
+ 'user-agent',
+ 'x-amzn-trace-id',
+]
+UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'
+STREAMING_UNSIGNED_PAYLOAD_TRAILER = 'STREAMING-UNSIGNED-PAYLOAD-TRAILER'
+
+
+def _host_from_url(url):
+ # Given URL, derive value for host header. Ensure that value:
+ # 1) is lowercase
+ # 2) excludes port, if it was the default port
+ # 3) excludes userinfo
+ url_parts = urlsplit(url)
+ host = url_parts.hostname # urlsplit's hostname is always lowercase
+ if is_valid_ipv6_endpoint_url(url):
+ host = f'[{host}]'
+ default_ports = {
+ 'http': 80,
+ 'https': 443,
+ }
+ if url_parts.port is not None:
+ if url_parts.port != default_ports.get(url_parts.scheme):
+ host = '%s:%d' % (host, url_parts.port)
+ return host
+
+
+def _get_body_as_dict(request):
+ # For query services, request.data is form-encoded and is already a
+ # dict, but for other services such as rest-json it could be a json
+ # string or bytes. In those cases we attempt to load the data as a
+ # dict.
+ data = request.data
+ if isinstance(data, bytes):
+ data = json.loads(data.decode('utf-8'))
+ elif isinstance(data, str):
+ data = json.loads(data)
+ return data
+
+
+class BaseSigner:
+ REQUIRES_REGION = False
+ REQUIRES_TOKEN = False
+
+ def add_auth(self, request):
+ raise NotImplementedError("add_auth")
+
+
+class TokenSigner(BaseSigner):
+ REQUIRES_TOKEN = True
+ """
+ Signers that expect an authorization token to perform the authorization
+ """
+
+ def __init__(self, auth_token):
+ self.auth_token = auth_token
+
+
+class SigV2Auth(BaseSigner):
+ """
+ Sign a request with Signature V2.
+ """
+
+ def __init__(self, credentials):
+ self.credentials = credentials
+
+ def calc_signature(self, request, params):
+ logger.debug("Calculating signature using v2 auth.")
+ split = urlsplit(request.url)
+ path = split.path
+ if len(path) == 0:
+ path = '/'
+ string_to_sign = f"{request.method}\n{split.netloc}\n{path}\n"
+ lhmac = hmac.new(
+ self.credentials.secret_key.encode("utf-8"), digestmod=sha256
+ )
+ pairs = []
+ for key in sorted(params):
+ # Any previous signature should not be a part of this
+ # one, so we skip that particular key. This prevents
+ # issues during retries.
+ if key == 'Signature':
+ continue
+ value = str(params[key])
+ quoted_key = quote(key.encode('utf-8'), safe='')
+ quoted_value = quote(value.encode('utf-8'), safe='-_~')
+ pairs.append(f'{quoted_key}={quoted_value}')
+ qs = '&'.join(pairs)
+ string_to_sign += qs
+ logger.debug('String to sign: %s', string_to_sign)
+ lhmac.update(string_to_sign.encode('utf-8'))
+ b64 = base64.b64encode(lhmac.digest()).strip().decode('utf-8')
+ return (qs, b64)
+
+ def add_auth(self, request):
+ # The auth handler is the last thing called in the
+ # preparation phase of a prepared request.
+ # Because of this we have to parse the query params
+ # from the request body so we can update them with
+ # the sigv2 auth params.
+ if self.credentials is None:
+ raise NoCredentialsError()
+ if request.data:
+ # POST
+ params = request.data
+ else:
+ # GET
+ params = request.params
+ params['AWSAccessKeyId'] = self.credentials.access_key
+ params['SignatureVersion'] = '2'
+ params['SignatureMethod'] = 'HmacSHA256'
+ params['Timestamp'] = time.strftime(ISO8601, time.gmtime())
+ if self.credentials.token:
+ params['SecurityToken'] = self.credentials.token
+ qs, signature = self.calc_signature(request, params)
+ params['Signature'] = signature
+ return request
+
+
+class SigV3Auth(BaseSigner):
+ def __init__(self, credentials):
+ self.credentials = credentials
+
+ def add_auth(self, request):
+ if self.credentials is None:
+ raise NoCredentialsError()
+ if 'Date' in request.headers:
+ del request.headers['Date']
+ request.headers['Date'] = formatdate(usegmt=True)
+ if self.credentials.token:
+ if 'X-Amz-Security-Token' in request.headers:
+ del request.headers['X-Amz-Security-Token']
+ request.headers['X-Amz-Security-Token'] = self.credentials.token
+ new_hmac = hmac.new(
+ self.credentials.secret_key.encode('utf-8'), digestmod=sha256
+ )
+ new_hmac.update(request.headers['Date'].encode('utf-8'))
+ encoded_signature = encodebytes(new_hmac.digest()).strip()
+ signature = (
+ f"AWS3-HTTPS AWSAccessKeyId={self.credentials.access_key},"
+ f"Algorithm=HmacSHA256,Signature={encoded_signature.decode('utf-8')}"
+ )
+ if 'X-Amzn-Authorization' in request.headers:
+ del request.headers['X-Amzn-Authorization']
+ request.headers['X-Amzn-Authorization'] = signature
+
+
+class SigV4Auth(BaseSigner):
+ """
+ Sign a request with Signature V4.
+ """
+
+ REQUIRES_REGION = True
+
+ def __init__(self, credentials, service_name, region_name):
+ self.credentials = credentials
+ # We initialize these value here so the unit tests can have
+ # valid values. But these will get overriden in ``add_auth``
+ # later for real requests.
+ self._region_name = region_name
+ self._service_name = service_name
+
+ def _sign(self, key, msg, hex=False):
+ if hex:
+ sig = hmac.new(key, msg.encode('utf-8'), sha256).hexdigest()
+ else:
+ sig = hmac.new(key, msg.encode('utf-8'), sha256).digest()
+ return sig
+
+ def headers_to_sign(self, request):
+ """
+ Select the headers from the request that need to be included
+ in the StringToSign.
+ """
+ header_map = HTTPHeaders()
+ for name, value in request.headers.items():
+ lname = name.lower()
+ if lname not in SIGNED_HEADERS_BLACKLIST:
+ header_map[lname] = value
+ if 'host' not in header_map:
+ # TODO: We should set the host ourselves, instead of relying on our
+ # HTTP client to set it for us.
+ header_map['host'] = _host_from_url(request.url)
+ return header_map
+
+ def canonical_query_string(self, request):
+ # The query string can come from two parts. One is the
+ # params attribute of the request. The other is from the request
+ # url (in which case we have to re-split the url into its components
+ # and parse out the query string component).
+ if request.params:
+ return self._canonical_query_string_params(request.params)
+ else:
+ return self._canonical_query_string_url(urlsplit(request.url))
+
+ def _canonical_query_string_params(self, params):
+ # [(key, value), (key2, value2)]
+ key_val_pairs = []
+ if isinstance(params, Mapping):
+ params = params.items()
+ for key, value in params:
+ key_val_pairs.append(
+ (quote(key, safe='-_.~'), quote(str(value), safe='-_.~'))
+ )
+ sorted_key_vals = []
+ # Sort by the URI-encoded key names, and in the case of
+ # repeated keys, then sort by the value.
+ for key, value in sorted(key_val_pairs):
+ sorted_key_vals.append(f'{key}={value}')
+ canonical_query_string = '&'.join(sorted_key_vals)
+ return canonical_query_string
+
+ def _canonical_query_string_url(self, parts):
+ canonical_query_string = ''
+ if parts.query:
+ # [(key, value), (key2, value2)]
+ key_val_pairs = []
+ for pair in parts.query.split('&'):
+ key, _, value = pair.partition('=')
+ key_val_pairs.append((key, value))
+ sorted_key_vals = []
+ # Sort by the URI-encoded key names, and in the case of
+ # repeated keys, then sort by the value.
+ for key, value in sorted(key_val_pairs):
+ sorted_key_vals.append(f'{key}={value}')
+ canonical_query_string = '&'.join(sorted_key_vals)
+ return canonical_query_string
+
+ def canonical_headers(self, headers_to_sign):
+ """
+ Return the headers that need to be included in the StringToSign
+ in their canonical form by converting all header keys to lower
+ case, sorting them in alphabetical order and then joining
+ them into a string, separated by newlines.
+ """
+ headers = []
+ sorted_header_names = sorted(set(headers_to_sign))
+ for key in sorted_header_names:
+ value = ','.join(
+ self._header_value(v) for v in headers_to_sign.get_all(key)
+ )
+ headers.append(f'{key}:{ensure_unicode(value)}')
+ return '\n'.join(headers)
+
+ def _header_value(self, value):
+ # From the sigv4 docs:
+ # Lowercase(HeaderName) + ':' + Trimall(HeaderValue)
+ #
+ # The Trimall function removes excess white space before and after
+ # values, and converts sequential spaces to a single space.
+ return ' '.join(value.split())
+
+ def signed_headers(self, headers_to_sign):
+ headers = sorted(n.lower().strip() for n in set(headers_to_sign))
+ return ';'.join(headers)
+
+ def _is_streaming_checksum_payload(self, request):
+ checksum_context = request.context.get('checksum', {})
+ algorithm = checksum_context.get('request_algorithm')
+ return isinstance(algorithm, dict) and algorithm.get('in') == 'trailer'
+
+ def payload(self, request):
+ if self._is_streaming_checksum_payload(request):
+ return STREAMING_UNSIGNED_PAYLOAD_TRAILER
+ elif not self._should_sha256_sign_payload(request):
+ # When payload signing is disabled, we use this static string in
+ # place of the payload checksum.
+ return UNSIGNED_PAYLOAD
+ request_body = request.body
+ if request_body and hasattr(request_body, 'seek'):
+ position = request_body.tell()
+ read_chunksize = functools.partial(
+ request_body.read, PAYLOAD_BUFFER
+ )
+ checksum = sha256()
+ for chunk in iter(read_chunksize, b''):
+ checksum.update(chunk)
+ hex_checksum = checksum.hexdigest()
+ request_body.seek(position)
+ return hex_checksum
+ elif request_body:
+ # The request serialization has ensured that
+ # request.body is a bytes() type.
+ return sha256(request_body).hexdigest()
+ else:
+ return EMPTY_SHA256_HASH
+
+ def _should_sha256_sign_payload(self, request):
+ # Payloads will always be signed over insecure connections.
+ if not request.url.startswith('https'):
+ return True
+
+ # Certain operations may have payload signing disabled by default.
+ # Since we don't have access to the operation model, we pass in this
+ # bit of metadata through the request context.
+ return request.context.get('payload_signing_enabled', True)
+
+ def canonical_request(self, request):
+ cr = [request.method.upper()]
+ path = self._normalize_url_path(urlsplit(request.url).path)
+ cr.append(path)
+ cr.append(self.canonical_query_string(request))
+ headers_to_sign = self.headers_to_sign(request)
+ cr.append(self.canonical_headers(headers_to_sign) + '\n')
+ cr.append(self.signed_headers(headers_to_sign))
+ if 'X-Amz-Content-SHA256' in request.headers:
+ body_checksum = request.headers['X-Amz-Content-SHA256']
+ else:
+ body_checksum = self.payload(request)
+ cr.append(body_checksum)
+ return '\n'.join(cr)
+
+ def _normalize_url_path(self, path):
+ normalized_path = quote(normalize_url_path(path), safe='/~')
+ return normalized_path
+
+ def scope(self, request):
+ scope = [self.credentials.access_key]
+ scope.append(request.context['timestamp'][0:8])
+ scope.append(self._region_name)
+ scope.append(self._service_name)
+ scope.append('aws4_request')
+ return '/'.join(scope)
+
+ def credential_scope(self, request):
+ scope = []
+ scope.append(request.context['timestamp'][0:8])
+ scope.append(self._region_name)
+ scope.append(self._service_name)
+ scope.append('aws4_request')
+ return '/'.join(scope)
+
+ def string_to_sign(self, request, canonical_request):
+ """
+ Return the canonical StringToSign as well as a dict
+ containing the original version of all headers that
+ were included in the StringToSign.
+ """
+ sts = ['AWS4-HMAC-SHA256']
+ sts.append(request.context['timestamp'])
+ sts.append(self.credential_scope(request))
+ sts.append(sha256(canonical_request.encode('utf-8')).hexdigest())
+ return '\n'.join(sts)
+
+ def signature(self, string_to_sign, request):
+ key = self.credentials.secret_key
+ k_date = self._sign(
+ (f"AWS4{key}").encode(), request.context["timestamp"][0:8]
+ )
+ k_region = self._sign(k_date, self._region_name)
+ k_service = self._sign(k_region, self._service_name)
+ k_signing = self._sign(k_service, 'aws4_request')
+ return self._sign(k_signing, string_to_sign, hex=True)
+
+ def add_auth(self, request):
+ if self.credentials is None:
+ raise NoCredentialsError()
+ datetime_now = datetime.datetime.utcnow()
+ request.context['timestamp'] = datetime_now.strftime(SIGV4_TIMESTAMP)
+ # This could be a retry. Make sure the previous
+ # authorization header is removed first.
+ self._modify_request_before_signing(request)
+ canonical_request = self.canonical_request(request)
+ logger.debug("Calculating signature using v4 auth.")
+ logger.debug('CanonicalRequest:\n%s', canonical_request)
+ string_to_sign = self.string_to_sign(request, canonical_request)
+ logger.debug('StringToSign:\n%s', string_to_sign)
+ signature = self.signature(string_to_sign, request)
+ logger.debug('Signature:\n%s', signature)
+
+ self._inject_signature_to_request(request, signature)
+
+ def _inject_signature_to_request(self, request, signature):
+ auth_str = [f'AWS4-HMAC-SHA256 Credential={self.scope(request)}']
+ headers_to_sign = self.headers_to_sign(request)
+ auth_str.append(
+ f"SignedHeaders={self.signed_headers(headers_to_sign)}"
+ )
+ auth_str.append(f'Signature={signature}')
+ request.headers['Authorization'] = ', '.join(auth_str)
+ return request
+
+ def _modify_request_before_signing(self, request):
+ if 'Authorization' in request.headers:
+ del request.headers['Authorization']
+ self._set_necessary_date_headers(request)
+ if self.credentials.token:
+ if 'X-Amz-Security-Token' in request.headers:
+ del request.headers['X-Amz-Security-Token']
+ request.headers['X-Amz-Security-Token'] = self.credentials.token
+
+ if not request.context.get('payload_signing_enabled', True):
+ if 'X-Amz-Content-SHA256' in request.headers:
+ del request.headers['X-Amz-Content-SHA256']
+ request.headers['X-Amz-Content-SHA256'] = UNSIGNED_PAYLOAD
+
+ def _set_necessary_date_headers(self, request):
+ # The spec allows for either the Date _or_ the X-Amz-Date value to be
+ # used so we check both. If there's a Date header, we use the date
+ # header. Otherwise we use the X-Amz-Date header.
+ if 'Date' in request.headers:
+ del request.headers['Date']
+ datetime_timestamp = datetime.datetime.strptime(
+ request.context['timestamp'], SIGV4_TIMESTAMP
+ )
+ request.headers['Date'] = formatdate(
+ int(calendar.timegm(datetime_timestamp.timetuple()))
+ )
+ if 'X-Amz-Date' in request.headers:
+ del request.headers['X-Amz-Date']
+ else:
+ if 'X-Amz-Date' in request.headers:
+ del request.headers['X-Amz-Date']
+ request.headers['X-Amz-Date'] = request.context['timestamp']
+
+
+class S3SigV4Auth(SigV4Auth):
+ def _modify_request_before_signing(self, request):
+ super()._modify_request_before_signing(request)
+ if 'X-Amz-Content-SHA256' in request.headers:
+ del request.headers['X-Amz-Content-SHA256']
+
+ request.headers['X-Amz-Content-SHA256'] = self.payload(request)
+
+ def _should_sha256_sign_payload(self, request):
+ # S3 allows optional body signing, so to minimize the performance
+ # impact, we opt to not SHA256 sign the body on streaming uploads,
+ # provided that we're on https.
+ client_config = request.context.get('client_config')
+ s3_config = getattr(client_config, 's3', None)
+
+ # The config could be None if it isn't set, or if the customer sets it
+ # to None.
+ if s3_config is None:
+ s3_config = {}
+
+ # The explicit configuration takes precedence over any implicit
+ # configuration.
+ sign_payload = s3_config.get('payload_signing_enabled', None)
+ if sign_payload is not None:
+ return sign_payload
+
+ # We require that both a checksum be present and https be enabled
+ # to implicitly disable body signing. The combination of TLS and
+ # a checksum is sufficiently secure and durable for us to be
+ # confident in the request without body signing.
+ checksum_header = 'Content-MD5'
+ checksum_context = request.context.get('checksum', {})
+ algorithm = checksum_context.get('request_algorithm')
+ if isinstance(algorithm, dict) and algorithm.get('in') == 'header':
+ checksum_header = algorithm['name']
+ if (
+ not request.url.startswith("https")
+ or checksum_header not in request.headers
+ ):
+ return True
+
+ # If the input is streaming we disable body signing by default.
+ if request.context.get('has_streaming_input', False):
+ return False
+
+ # If the S3-specific checks had no results, delegate to the generic
+ # checks.
+ return super()._should_sha256_sign_payload(request)
+
+ def _normalize_url_path(self, path):
+ # For S3, we do not normalize the path.
+ return path
+
+
+class S3ExpressAuth(S3SigV4Auth):
+ REQUIRES_IDENTITY_CACHE = True
+
+ def __init__(
+ self, credentials, service_name, region_name, *, identity_cache
+ ):
+ super().__init__(credentials, service_name, region_name)
+ self._identity_cache = identity_cache
+
+ def add_auth(self, request):
+ super().add_auth(request)
+
+ def _modify_request_before_signing(self, request):
+ super()._modify_request_before_signing(request)
+ if 'x-amz-s3session-token' not in request.headers:
+ request.headers['x-amz-s3session-token'] = self.credentials.token
+ # S3Express does not support STS' X-Amz-Security-Token
+ if 'X-Amz-Security-Token' in request.headers:
+ del request.headers['X-Amz-Security-Token']
+
+
+class S3ExpressPostAuth(S3ExpressAuth):
+ REQUIRES_IDENTITY_CACHE = True
+
+ def add_auth(self, request):
+ datetime_now = datetime.datetime.utcnow()
+ request.context['timestamp'] = datetime_now.strftime(SIGV4_TIMESTAMP)
+
+ fields = {}
+ if request.context.get('s3-presign-post-fields', None) is not None:
+ fields = request.context['s3-presign-post-fields']
+
+ policy = {}
+ conditions = []
+ if request.context.get('s3-presign-post-policy', None) is not None:
+ policy = request.context['s3-presign-post-policy']
+ if policy.get('conditions', None) is not None:
+ conditions = policy['conditions']
+
+ policy['conditions'] = conditions
+
+ fields['x-amz-algorithm'] = 'AWS4-HMAC-SHA256'
+ fields['x-amz-credential'] = self.scope(request)
+ fields['x-amz-date'] = request.context['timestamp']
+
+ conditions.append({'x-amz-algorithm': 'AWS4-HMAC-SHA256'})
+ conditions.append({'x-amz-credential': self.scope(request)})
+ conditions.append({'x-amz-date': request.context['timestamp']})
+
+ if self.credentials.token is not None:
+ fields['X-Amz-S3session-Token'] = self.credentials.token
+ conditions.append(
+ {'X-Amz-S3session-Token': self.credentials.token}
+ )
+
+ # Dump the base64 encoded policy into the fields dictionary.
+ fields['policy'] = base64.b64encode(
+ json.dumps(policy).encode('utf-8')
+ ).decode('utf-8')
+
+ fields['x-amz-signature'] = self.signature(fields['policy'], request)
+
+ request.context['s3-presign-post-fields'] = fields
+ request.context['s3-presign-post-policy'] = policy
+
+
+class S3ExpressQueryAuth(S3ExpressAuth):
+ DEFAULT_EXPIRES = 300
+ REQUIRES_IDENTITY_CACHE = True
+
+ def __init__(
+ self,
+ credentials,
+ service_name,
+ region_name,
+ *,
+ identity_cache,
+ expires=DEFAULT_EXPIRES,
+ ):
+ super().__init__(
+ credentials,
+ service_name,
+ region_name,
+ identity_cache=identity_cache,
+ )
+ self._expires = expires
+
+ def _modify_request_before_signing(self, request):
+ # We automatically set this header, so if it's the auto-set value we
+ # want to get rid of it since it doesn't make sense for presigned urls.
+ content_type = request.headers.get('content-type')
+ blocklisted_content_type = (
+ 'application/x-www-form-urlencoded; charset=utf-8'
+ )
+ if content_type == blocklisted_content_type:
+ del request.headers['content-type']
+
+ # Note that we're not including X-Amz-Signature.
+ # From the docs: "The Canonical Query String must include all the query
+ # parameters from the preceding table except for X-Amz-Signature.
+ signed_headers = self.signed_headers(self.headers_to_sign(request))
+
+ auth_params = {
+ 'X-Amz-Algorithm': 'AWS4-HMAC-SHA256',
+ 'X-Amz-Credential': self.scope(request),
+ 'X-Amz-Date': request.context['timestamp'],
+ 'X-Amz-Expires': self._expires,
+ 'X-Amz-SignedHeaders': signed_headers,
+ }
+ if self.credentials.token is not None:
+ auth_params['X-Amz-S3session-Token'] = self.credentials.token
+ # Now parse the original query string to a dict, inject our new query
+ # params, and serialize back to a query string.
+ url_parts = urlsplit(request.url)
+ # parse_qs makes each value a list, but in our case we know we won't
+ # have repeated keys so we know we have single element lists which we
+ # can convert back to scalar values.
+ query_string_parts = parse_qs(url_parts.query, keep_blank_values=True)
+ query_dict = {k: v[0] for k, v in query_string_parts.items()}
+
+ if request.params:
+ query_dict.update(request.params)
+ request.params = {}
+ # The spec is particular about this. It *has* to be:
+ # https://<endpoint>?<operation params>&<auth params>
+ # You can't mix the two types of params together, i.e just keep doing
+ # new_query_params.update(op_params)
+ # new_query_params.update(auth_params)
+ # percent_encode_sequence(new_query_params)
+ operation_params = ''
+ if request.data:
+ # We also need to move the body params into the query string. To
+ # do this, we first have to convert it to a dict.
+ query_dict.update(_get_body_as_dict(request))
+ request.data = ''
+ if query_dict:
+ operation_params = percent_encode_sequence(query_dict) + '&'
+ new_query_string = (
+ f"{operation_params}{percent_encode_sequence(auth_params)}"
+ )
+ # url_parts is a tuple (and therefore immutable) so we need to create
+ # a new url_parts with the new query string.
+ # <part> - <index>
+ # scheme - 0
+ # netloc - 1
+ # path - 2
+ # query - 3 <-- we're replacing this.
+ # fragment - 4
+ p = url_parts
+ new_url_parts = (p[0], p[1], p[2], new_query_string, p[4])
+ request.url = urlunsplit(new_url_parts)
+
+ def _inject_signature_to_request(self, request, signature):
+ # Rather than calculating an "Authorization" header, for the query
+ # param quth, we just append an 'X-Amz-Signature' param to the end
+ # of the query string.
+ request.url += f'&X-Amz-Signature={signature}'
+
+ def _normalize_url_path(self, path):
+ # For S3, we do not normalize the path.
+ return path
+
+ def payload(self, request):
+ # From the doc link above:
+ # "You don't include a payload hash in the Canonical Request, because
+ # when you create a presigned URL, you don't know anything about the
+ # payload. Instead, you use a constant string "UNSIGNED-PAYLOAD".
+ return UNSIGNED_PAYLOAD
+
+
+class SigV4QueryAuth(SigV4Auth):
+ DEFAULT_EXPIRES = 3600
+
+ def __init__(
+ self, credentials, service_name, region_name, expires=DEFAULT_EXPIRES
+ ):
+ super().__init__(credentials, service_name, region_name)
+ self._expires = expires
+
+ def _modify_request_before_signing(self, request):
+ # We automatically set this header, so if it's the auto-set value we
+ # want to get rid of it since it doesn't make sense for presigned urls.
+ content_type = request.headers.get('content-type')
+ blacklisted_content_type = (
+ 'application/x-www-form-urlencoded; charset=utf-8'
+ )
+ if content_type == blacklisted_content_type:
+ del request.headers['content-type']
+
+ # Note that we're not including X-Amz-Signature.
+ # From the docs: "The Canonical Query String must include all the query
+ # parameters from the preceding table except for X-Amz-Signature.
+ signed_headers = self.signed_headers(self.headers_to_sign(request))
+
+ auth_params = {
+ 'X-Amz-Algorithm': 'AWS4-HMAC-SHA256',
+ 'X-Amz-Credential': self.scope(request),
+ 'X-Amz-Date': request.context['timestamp'],
+ 'X-Amz-Expires': self._expires,
+ 'X-Amz-SignedHeaders': signed_headers,
+ }
+ if self.credentials.token is not None:
+ auth_params['X-Amz-Security-Token'] = self.credentials.token
+ # Now parse the original query string to a dict, inject our new query
+ # params, and serialize back to a query string.
+ url_parts = urlsplit(request.url)
+ # parse_qs makes each value a list, but in our case we know we won't
+ # have repeated keys so we know we have single element lists which we
+ # can convert back to scalar values.
+ query_string_parts = parse_qs(url_parts.query, keep_blank_values=True)
+ query_dict = {k: v[0] for k, v in query_string_parts.items()}
+
+ if request.params:
+ query_dict.update(request.params)
+ request.params = {}
+ # The spec is particular about this. It *has* to be:
+ # https://<endpoint>?<operation params>&<auth params>
+ # You can't mix the two types of params together, i.e just keep doing
+ # new_query_params.update(op_params)
+ # new_query_params.update(auth_params)
+ # percent_encode_sequence(new_query_params)
+ operation_params = ''
+ if request.data:
+ # We also need to move the body params into the query string. To
+ # do this, we first have to convert it to a dict.
+ query_dict.update(_get_body_as_dict(request))
+ request.data = ''
+ if query_dict:
+ operation_params = percent_encode_sequence(query_dict) + '&'
+ new_query_string = (
+ f"{operation_params}{percent_encode_sequence(auth_params)}"
+ )
+ # url_parts is a tuple (and therefore immutable) so we need to create
+ # a new url_parts with the new query string.
+ # <part> - <index>
+ # scheme - 0
+ # netloc - 1
+ # path - 2
+ # query - 3 <-- we're replacing this.
+ # fragment - 4
+ p = url_parts
+ new_url_parts = (p[0], p[1], p[2], new_query_string, p[4])
+ request.url = urlunsplit(new_url_parts)
+
+ def _inject_signature_to_request(self, request, signature):
+ # Rather than calculating an "Authorization" header, for the query
+ # param quth, we just append an 'X-Amz-Signature' param to the end
+ # of the query string.
+ request.url += f'&X-Amz-Signature={signature}'
+
+
+class S3SigV4QueryAuth(SigV4QueryAuth):
+ """S3 SigV4 auth using query parameters.
+
+ This signer will sign a request using query parameters and signature
+ version 4, i.e a "presigned url" signer.
+
+ Based off of:
+
+ http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html
+
+ """
+
+ def _normalize_url_path(self, path):
+ # For S3, we do not normalize the path.
+ return path
+
+ def payload(self, request):
+ # From the doc link above:
+ # "You don't include a payload hash in the Canonical Request, because
+ # when you create a presigned URL, you don't know anything about the
+ # payload. Instead, you use a constant string "UNSIGNED-PAYLOAD".
+ return UNSIGNED_PAYLOAD
+
+
+class S3SigV4PostAuth(SigV4Auth):
+ """
+ Presigns a s3 post
+
+ Implementation doc here:
+ http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-UsingHTTPPOST.html
+ """
+
+ def add_auth(self, request):
+ datetime_now = datetime.datetime.utcnow()
+ request.context['timestamp'] = datetime_now.strftime(SIGV4_TIMESTAMP)
+
+ fields = {}
+ if request.context.get('s3-presign-post-fields', None) is not None:
+ fields = request.context['s3-presign-post-fields']
+
+ policy = {}
+ conditions = []
+ if request.context.get('s3-presign-post-policy', None) is not None:
+ policy = request.context['s3-presign-post-policy']
+ if policy.get('conditions', None) is not None:
+ conditions = policy['conditions']
+
+ policy['conditions'] = conditions
+
+ fields['x-amz-algorithm'] = 'AWS4-HMAC-SHA256'
+ fields['x-amz-credential'] = self.scope(request)
+ fields['x-amz-date'] = request.context['timestamp']
+
+ conditions.append({'x-amz-algorithm': 'AWS4-HMAC-SHA256'})
+ conditions.append({'x-amz-credential': self.scope(request)})
+ conditions.append({'x-amz-date': request.context['timestamp']})
+
+ if self.credentials.token is not None:
+ fields['x-amz-security-token'] = self.credentials.token
+ conditions.append({'x-amz-security-token': self.credentials.token})
+
+ # Dump the base64 encoded policy into the fields dictionary.
+ fields['policy'] = base64.b64encode(
+ json.dumps(policy).encode('utf-8')
+ ).decode('utf-8')
+
+ fields['x-amz-signature'] = self.signature(fields['policy'], request)
+
+ request.context['s3-presign-post-fields'] = fields
+ request.context['s3-presign-post-policy'] = policy
+
+
+class HmacV1Auth(BaseSigner):
+ # List of Query String Arguments of Interest
+ QSAOfInterest = [
+ 'accelerate',
+ 'acl',
+ 'cors',
+ 'defaultObjectAcl',
+ 'location',
+ 'logging',
+ 'partNumber',
+ 'policy',
+ 'requestPayment',
+ 'torrent',
+ 'versioning',
+ 'versionId',
+ 'versions',
+ 'website',
+ 'uploads',
+ 'uploadId',
+ 'response-content-type',
+ 'response-content-language',
+ 'response-expires',
+ 'response-cache-control',
+ 'response-content-disposition',
+ 'response-content-encoding',
+ 'delete',
+ 'lifecycle',
+ 'tagging',
+ 'restore',
+ 'storageClass',
+ 'notification',
+ 'replication',
+ 'requestPayment',
+ 'analytics',
+ 'metrics',
+ 'inventory',
+ 'select',
+ 'select-type',
+ 'object-lock',
+ ]
+
+ def __init__(self, credentials, service_name=None, region_name=None):
+ self.credentials = credentials
+
+ def sign_string(self, string_to_sign):
+ new_hmac = hmac.new(
+ self.credentials.secret_key.encode('utf-8'), digestmod=sha1
+ )
+ new_hmac.update(string_to_sign.encode('utf-8'))
+ return encodebytes(new_hmac.digest()).strip().decode('utf-8')
+
+ def canonical_standard_headers(self, headers):
+ interesting_headers = ['content-md5', 'content-type', 'date']
+ hoi = []
+ if 'Date' in headers:
+ del headers['Date']
+ headers['Date'] = self._get_date()
+ for ih in interesting_headers:
+ found = False
+ for key in headers:
+ lk = key.lower()
+ if headers[key] is not None and lk == ih:
+ hoi.append(headers[key].strip())
+ found = True
+ if not found:
+ hoi.append('')
+ return '\n'.join(hoi)
+
+ def canonical_custom_headers(self, headers):
+ hoi = []
+ custom_headers = {}
+ for key in headers:
+ lk = key.lower()
+ if headers[key] is not None:
+ if lk.startswith('x-amz-'):
+ custom_headers[lk] = ','.join(
+ v.strip() for v in headers.get_all(key)
+ )
+ sorted_header_keys = sorted(custom_headers.keys())
+ for key in sorted_header_keys:
+ hoi.append(f"{key}:{custom_headers[key]}")
+ return '\n'.join(hoi)
+
+ def unquote_v(self, nv):
+ """
+ TODO: Do we need this?
+ """
+ if len(nv) == 1:
+ return nv
+ else:
+ return (nv[0], unquote(nv[1]))
+
+ def canonical_resource(self, split, auth_path=None):
+ # don't include anything after the first ? in the resource...
+ # unless it is one of the QSA of interest, defined above
+ # NOTE:
+ # The path in the canonical resource should always be the
+ # full path including the bucket name, even for virtual-hosting
+ # style addressing. The ``auth_path`` keeps track of the full
+ # path for the canonical resource and would be passed in if
+ # the client was using virtual-hosting style.
+ if auth_path is not None:
+ buf = auth_path
+ else:
+ buf = split.path
+ if split.query:
+ qsa = split.query.split('&')
+ qsa = [a.split('=', 1) for a in qsa]
+ qsa = [
+ self.unquote_v(a) for a in qsa if a[0] in self.QSAOfInterest
+ ]
+ if len(qsa) > 0:
+ qsa.sort(key=itemgetter(0))
+ qsa = ['='.join(a) for a in qsa]
+ buf += '?'
+ buf += '&'.join(qsa)
+ return buf
+
+ def canonical_string(
+ self, method, split, headers, expires=None, auth_path=None
+ ):
+ cs = method.upper() + '\n'
+ cs += self.canonical_standard_headers(headers) + '\n'
+ custom_headers = self.canonical_custom_headers(headers)
+ if custom_headers:
+ cs += custom_headers + '\n'
+ cs += self.canonical_resource(split, auth_path=auth_path)
+ return cs
+
+ def get_signature(
+ self, method, split, headers, expires=None, auth_path=None
+ ):
+ if self.credentials.token:
+ del headers['x-amz-security-token']
+ headers['x-amz-security-token'] = self.credentials.token
+ string_to_sign = self.canonical_string(
+ method, split, headers, auth_path=auth_path
+ )
+ logger.debug(f'StringToSign:\n{string_to_sign}')
+ return self.sign_string(string_to_sign)
+
+ def add_auth(self, request):
+ if self.credentials is None:
+ raise NoCredentialsError
+ logger.debug("Calculating signature using hmacv1 auth.")
+ split = urlsplit(request.url)
+ logger.debug(f'HTTP request method: {request.method}')
+ signature = self.get_signature(
+ request.method, split, request.headers, auth_path=request.auth_path
+ )
+ self._inject_signature(request, signature)
+
+ def _get_date(self):
+ return formatdate(usegmt=True)
+
+ def _inject_signature(self, request, signature):
+ if 'Authorization' in request.headers:
+ # We have to do this because request.headers is not
+ # normal dictionary. It has the (unintuitive) behavior
+ # of aggregating repeated setattr calls for the same
+ # key value. For example:
+ # headers['foo'] = 'a'; headers['foo'] = 'b'
+ # list(headers) will print ['foo', 'foo'].
+ del request.headers['Authorization']
+
+ auth_header = f"AWS {self.credentials.access_key}:{signature}"
+ request.headers['Authorization'] = auth_header
+
+
+class HmacV1QueryAuth(HmacV1Auth):
+ """
+ Generates a presigned request for s3.
+
+ Spec from this document:
+
+ http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html
+ #RESTAuthenticationQueryStringAuth
+
+ """
+
+ DEFAULT_EXPIRES = 3600
+
+ def __init__(self, credentials, expires=DEFAULT_EXPIRES):
+ self.credentials = credentials
+ self._expires = expires
+
+ def _get_date(self):
+ return str(int(time.time() + int(self._expires)))
+
+ def _inject_signature(self, request, signature):
+ query_dict = {}
+ query_dict['AWSAccessKeyId'] = self.credentials.access_key
+ query_dict['Signature'] = signature
+
+ for header_key in request.headers:
+ lk = header_key.lower()
+ # For query string requests, Expires is used instead of the
+ # Date header.
+ if header_key == 'Date':
+ query_dict['Expires'] = request.headers['Date']
+ # We only want to include relevant headers in the query string.
+ # These can be anything that starts with x-amz, is Content-MD5,
+ # or is Content-Type.
+ elif lk.startswith('x-amz-') or lk in (
+ 'content-md5',
+ 'content-type',
+ ):
+ query_dict[lk] = request.headers[lk]
+ # Combine all of the identified headers into an encoded
+ # query string
+ new_query_string = percent_encode_sequence(query_dict)
+
+ # Create a new url with the presigned url.
+ p = urlsplit(request.url)
+ if p[3]:
+ # If there was a pre-existing query string, we should
+ # add that back before injecting the new query string.
+ new_query_string = f'{p[3]}&{new_query_string}'
+ new_url_parts = (p[0], p[1], p[2], new_query_string, p[4])
+ request.url = urlunsplit(new_url_parts)
+
+
+class HmacV1PostAuth(HmacV1Auth):
+ """
+ Generates a presigned post for s3.
+
+ Spec from this document:
+
+ http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingHTTPPOST.html
+ """
+
+ def add_auth(self, request):
+ fields = {}
+ if request.context.get('s3-presign-post-fields', None) is not None:
+ fields = request.context['s3-presign-post-fields']
+
+ policy = {}
+ conditions = []
+ if request.context.get('s3-presign-post-policy', None) is not None:
+ policy = request.context['s3-presign-post-policy']
+ if policy.get('conditions', None) is not None:
+ conditions = policy['conditions']
+
+ policy['conditions'] = conditions
+
+ fields['AWSAccessKeyId'] = self.credentials.access_key
+
+ if self.credentials.token is not None:
+ fields['x-amz-security-token'] = self.credentials.token
+ conditions.append({'x-amz-security-token': self.credentials.token})
+
+ # Dump the base64 encoded policy into the fields dictionary.
+ fields['policy'] = base64.b64encode(
+ json.dumps(policy).encode('utf-8')
+ ).decode('utf-8')
+
+ fields['signature'] = self.sign_string(fields['policy'])
+
+ request.context['s3-presign-post-fields'] = fields
+ request.context['s3-presign-post-policy'] = policy
+
+
+class BearerAuth(TokenSigner):
+ """
+ Performs bearer token authorization by placing the bearer token in the
+ Authorization header as specified by Section 2.1 of RFC 6750.
+
+ https://datatracker.ietf.org/doc/html/rfc6750#section-2.1
+ """
+
+ def add_auth(self, request):
+ if self.auth_token is None:
+ raise NoAuthTokenError()
+
+ auth_header = f'Bearer {self.auth_token.token}'
+ if 'Authorization' in request.headers:
+ del request.headers['Authorization']
+ request.headers['Authorization'] = auth_header
+
+
+def resolve_auth_type(auth_trait):
+ for auth_type in auth_trait:
+ if auth_type == 'smithy.api#noAuth':
+ return AUTH_TYPE_TO_SIGNATURE_VERSION[auth_type]
+ elif auth_type in AUTH_TYPE_TO_SIGNATURE_VERSION:
+ signature_version = AUTH_TYPE_TO_SIGNATURE_VERSION[auth_type]
+ if signature_version in AUTH_TYPE_MAPS:
+ return signature_version
+ else:
+ raise UnknownSignatureVersionError(signature_version=auth_type)
+ raise UnsupportedSignatureVersionError(signature_version=auth_trait)
+
+
+AUTH_TYPE_MAPS = {
+ 'v2': SigV2Auth,
+ 'v3': SigV3Auth,
+ 'v3https': SigV3Auth,
+ 's3': HmacV1Auth,
+ 's3-query': HmacV1QueryAuth,
+ 's3-presign-post': HmacV1PostAuth,
+ 's3v4-presign-post': S3SigV4PostAuth,
+ 'v4-s3express': S3ExpressAuth,
+ 'v4-s3express-query': S3ExpressQueryAuth,
+ 'v4-s3express-presign-post': S3ExpressPostAuth,
+ 'bearer': BearerAuth,
+}
+
+# Define v4 signers depending on if CRT is present
+if HAS_CRT:
+ from botocore.crt.auth import CRT_AUTH_TYPE_MAPS
+
+ AUTH_TYPE_MAPS.update(CRT_AUTH_TYPE_MAPS)
+else:
+ AUTH_TYPE_MAPS.update(
+ {
+ 'v4': SigV4Auth,
+ 'v4-query': SigV4QueryAuth,
+ 's3v4': S3SigV4Auth,
+ 's3v4-query': S3SigV4QueryAuth,
+ }
+ )
+
+AUTH_TYPE_TO_SIGNATURE_VERSION = {
+ 'aws.auth#sigv4': 'v4',
+ 'aws.auth#sigv4a': 'v4a',
+ 'smithy.api#httpBearerAuth': 'bearer',
+ 'smithy.api#noAuth': 'none',
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/awsrequest.py b/.venv/lib/python3.12/site-packages/botocore/awsrequest.py
new file mode 100644
index 00000000..49b4eee0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/awsrequest.py
@@ -0,0 +1,635 @@
+# Copyright (c) 2012-2013 Mitch Garnaat http://garnaat.org/
+# Copyright 2012-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import functools
+import logging
+from collections.abc import Mapping
+
+import urllib3.util
+from urllib3.connection import HTTPConnection, VerifiedHTTPSConnection
+from urllib3.connectionpool import HTTPConnectionPool, HTTPSConnectionPool
+
+import botocore.utils
+from botocore.compat import (
+ HTTPHeaders,
+ HTTPResponse,
+ MutableMapping,
+ urlencode,
+ urlparse,
+ urlsplit,
+ urlunsplit,
+)
+from botocore.exceptions import UnseekableStreamError
+
+logger = logging.getLogger(__name__)
+
+
+class AWSHTTPResponse(HTTPResponse):
+ # The *args, **kwargs is used because the args are slightly
+ # different in py2.6 than in py2.7/py3.
+ def __init__(self, *args, **kwargs):
+ self._status_tuple = kwargs.pop('status_tuple')
+ HTTPResponse.__init__(self, *args, **kwargs)
+
+ def _read_status(self):
+ if self._status_tuple is not None:
+ status_tuple = self._status_tuple
+ self._status_tuple = None
+ return status_tuple
+ else:
+ return HTTPResponse._read_status(self)
+
+
+class AWSConnection:
+ """Mixin for HTTPConnection that supports Expect 100-continue.
+
+ This when mixed with a subclass of httplib.HTTPConnection (though
+ technically we subclass from urllib3, which subclasses
+ httplib.HTTPConnection) and we only override this class to support Expect
+ 100-continue, which we need for S3. As far as I can tell, this is
+ general purpose enough to not be specific to S3, but I'm being
+ tentative and keeping it in botocore because I've only tested
+ this against AWS services.
+
+ """
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self._original_response_cls = self.response_class
+ # This variable is set when we receive an early response from the
+ # server. If this value is set to True, any calls to send() are noops.
+ # This value is reset to false every time _send_request is called.
+ # This is to workaround changes in urllib3 2.0 which uses separate
+ # send() calls in request() instead of delegating to endheaders(),
+ # which is where the body is sent in CPython's HTTPConnection.
+ self._response_received = False
+ self._expect_header_set = False
+ self._send_called = False
+
+ def close(self):
+ super().close()
+ # Reset all of our instance state we were tracking.
+ self._response_received = False
+ self._expect_header_set = False
+ self._send_called = False
+ self.response_class = self._original_response_cls
+
+ def request(self, method, url, body=None, headers=None, *args, **kwargs):
+ if headers is None:
+ headers = {}
+ self._response_received = False
+ if headers.get('Expect', b'') == b'100-continue':
+ self._expect_header_set = True
+ else:
+ self._expect_header_set = False
+ self.response_class = self._original_response_cls
+ rval = super().request(method, url, body, headers, *args, **kwargs)
+ self._expect_header_set = False
+ return rval
+
+ def _convert_to_bytes(self, mixed_buffer):
+ # Take a list of mixed str/bytes and convert it
+ # all into a single bytestring.
+ # Any str will be encoded as utf-8.
+ bytes_buffer = []
+ for chunk in mixed_buffer:
+ if isinstance(chunk, str):
+ bytes_buffer.append(chunk.encode('utf-8'))
+ else:
+ bytes_buffer.append(chunk)
+ msg = b"\r\n".join(bytes_buffer)
+ return msg
+
+ def _send_output(self, message_body=None, *args, **kwargs):
+ self._buffer.extend((b"", b""))
+ msg = self._convert_to_bytes(self._buffer)
+ del self._buffer[:]
+ # If msg and message_body are sent in a single send() call,
+ # it will avoid performance problems caused by the interaction
+ # between delayed ack and the Nagle algorithm.
+ if isinstance(message_body, bytes):
+ msg += message_body
+ message_body = None
+ self.send(msg)
+ if self._expect_header_set:
+ # This is our custom behavior. If the Expect header was
+ # set, it will trigger this custom behavior.
+ logger.debug("Waiting for 100 Continue response.")
+ # Wait for 1 second for the server to send a response.
+ if urllib3.util.wait_for_read(self.sock, 1):
+ self._handle_expect_response(message_body)
+ return
+ else:
+ # From the RFC:
+ # Because of the presence of older implementations, the
+ # protocol allows ambiguous situations in which a client may
+ # send "Expect: 100-continue" without receiving either a 417
+ # (Expectation Failed) status or a 100 (Continue) status.
+ # Therefore, when a client sends this header field to an origin
+ # server (possibly via a proxy) from which it has never seen a
+ # 100 (Continue) status, the client SHOULD NOT wait for an
+ # indefinite period before sending the request body.
+ logger.debug(
+ "No response seen from server, continuing to "
+ "send the response body."
+ )
+ if message_body is not None:
+ # message_body was not a string (i.e. it is a file), and
+ # we must run the risk of Nagle.
+ self.send(message_body)
+
+ def _consume_headers(self, fp):
+ # Most servers (including S3) will just return
+ # the CLRF after the 100 continue response. However,
+ # some servers (I've specifically seen this for squid when
+ # used as a straight HTTP proxy) will also inject a
+ # Connection: keep-alive header. To account for this
+ # we'll read until we read '\r\n', and ignore any headers
+ # that come immediately after the 100 continue response.
+ current = None
+ while current != b'\r\n':
+ current = fp.readline()
+
+ def _handle_expect_response(self, message_body):
+ # This is called when we sent the request headers containing
+ # an Expect: 100-continue header and received a response.
+ # We now need to figure out what to do.
+ fp = self.sock.makefile('rb', 0)
+ try:
+ maybe_status_line = fp.readline()
+ parts = maybe_status_line.split(None, 2)
+ if self._is_100_continue_status(maybe_status_line):
+ self._consume_headers(fp)
+ logger.debug(
+ "100 Continue response seen, now sending request body."
+ )
+ self._send_message_body(message_body)
+ elif len(parts) == 3 and parts[0].startswith(b'HTTP/'):
+ # From the RFC:
+ # Requirements for HTTP/1.1 origin servers:
+ #
+ # - Upon receiving a request which includes an Expect
+ # request-header field with the "100-continue"
+ # expectation, an origin server MUST either respond with
+ # 100 (Continue) status and continue to read from the
+ # input stream, or respond with a final status code.
+ #
+ # So if we don't get a 100 Continue response, then
+ # whatever the server has sent back is the final response
+ # and don't send the message_body.
+ logger.debug(
+ "Received a non 100 Continue response "
+ "from the server, NOT sending request body."
+ )
+ status_tuple = (
+ parts[0].decode('ascii'),
+ int(parts[1]),
+ parts[2].decode('ascii'),
+ )
+ response_class = functools.partial(
+ AWSHTTPResponse, status_tuple=status_tuple
+ )
+ self.response_class = response_class
+ self._response_received = True
+ finally:
+ fp.close()
+
+ def _send_message_body(self, message_body):
+ if message_body is not None:
+ self.send(message_body)
+
+ def send(self, str):
+ if self._response_received:
+ if not self._send_called:
+ # urllib3 2.0 chunks and calls send potentially
+ # thousands of times inside `request` unlike the
+ # standard library. Only log this once for sanity.
+ logger.debug(
+ "send() called, but response already received. "
+ "Not sending data."
+ )
+ self._send_called = True
+ return
+ return super().send(str)
+
+ def _is_100_continue_status(self, maybe_status_line):
+ parts = maybe_status_line.split(None, 2)
+ # Check for HTTP/<version> 100 Continue\r\n
+ return (
+ len(parts) >= 3
+ and parts[0].startswith(b'HTTP/')
+ and parts[1] == b'100'
+ )
+
+
+class AWSHTTPConnection(AWSConnection, HTTPConnection):
+ """An HTTPConnection that supports 100 Continue behavior."""
+
+
+class AWSHTTPSConnection(AWSConnection, VerifiedHTTPSConnection):
+ """An HTTPSConnection that supports 100 Continue behavior."""
+
+
+class AWSHTTPConnectionPool(HTTPConnectionPool):
+ ConnectionCls = AWSHTTPConnection
+
+
+class AWSHTTPSConnectionPool(HTTPSConnectionPool):
+ ConnectionCls = AWSHTTPSConnection
+
+
+def prepare_request_dict(
+ request_dict, endpoint_url, context=None, user_agent=None
+):
+ """
+ This method prepares a request dict to be created into an
+ AWSRequestObject. This prepares the request dict by adding the
+ url and the user agent to the request dict.
+
+ :type request_dict: dict
+ :param request_dict: The request dict (created from the
+ ``serialize`` module).
+
+ :type user_agent: string
+ :param user_agent: The user agent to use for this request.
+
+ :type endpoint_url: string
+ :param endpoint_url: The full endpoint url, which contains at least
+ the scheme, the hostname, and optionally any path components.
+ """
+ r = request_dict
+ if user_agent is not None:
+ headers = r['headers']
+ headers['User-Agent'] = user_agent
+ host_prefix = r.get('host_prefix')
+ url = _urljoin(endpoint_url, r['url_path'], host_prefix)
+ if r['query_string']:
+ # NOTE: This is to avoid circular import with utils. This is being
+ # done to avoid moving classes to different modules as to not cause
+ # breaking chainges.
+ percent_encode_sequence = botocore.utils.percent_encode_sequence
+ encoded_query_string = percent_encode_sequence(r['query_string'])
+ if '?' not in url:
+ url += f'?{encoded_query_string}'
+ else:
+ url += f'&{encoded_query_string}'
+ r['url'] = url
+ r['context'] = context
+ if context is None:
+ r['context'] = {}
+
+
+def create_request_object(request_dict):
+ """
+ This method takes a request dict and creates an AWSRequest object
+ from it.
+
+ :type request_dict: dict
+ :param request_dict: The request dict (created from the
+ ``prepare_request_dict`` method).
+
+ :rtype: ``botocore.awsrequest.AWSRequest``
+ :return: An AWSRequest object based on the request_dict.
+
+ """
+ r = request_dict
+ request_object = AWSRequest(
+ method=r['method'],
+ url=r['url'],
+ data=r['body'],
+ headers=r['headers'],
+ auth_path=r.get('auth_path'),
+ )
+ request_object.context = r['context']
+ return request_object
+
+
+def _urljoin(endpoint_url, url_path, host_prefix):
+ p = urlsplit(endpoint_url)
+ # <part> - <index>
+ # scheme - p[0]
+ # netloc - p[1]
+ # path - p[2]
+ # query - p[3]
+ # fragment - p[4]
+ if not url_path or url_path == '/':
+ # If there's no path component, ensure the URL ends with
+ # a '/' for backwards compatibility.
+ if not p[2]:
+ new_path = '/'
+ else:
+ new_path = p[2]
+ elif p[2].endswith('/') and url_path.startswith('/'):
+ new_path = p[2][:-1] + url_path
+ else:
+ new_path = p[2] + url_path
+
+ new_netloc = p[1]
+ if host_prefix is not None:
+ new_netloc = host_prefix + new_netloc
+
+ reconstructed = urlunsplit((p[0], new_netloc, new_path, p[3], p[4]))
+ return reconstructed
+
+
+class AWSRequestPreparer:
+ """
+ This class performs preparation on AWSRequest objects similar to that of
+ the PreparedRequest class does in the requests library. However, the logic
+ has been boiled down to meet the specific use cases in botocore. Of note
+ there are the following differences:
+ This class does not heavily prepare the URL. Requests performed many
+ validations and corrections to ensure the URL is properly formatted.
+ Botocore either performs these validations elsewhere or otherwise
+ consistently provides well formatted URLs.
+
+ This class does not heavily prepare the body. Body preperation is
+ simple and supports only the cases that we document: bytes and
+ file-like objects to determine the content-length. This will also
+ additionally prepare a body that is a dict to be url encoded params
+ string as some signers rely on this. Finally, this class does not
+ support multipart file uploads.
+
+ This class does not prepare the method, auth or cookies.
+ """
+
+ def prepare(self, original):
+ method = original.method
+ url = self._prepare_url(original)
+ body = self._prepare_body(original)
+ headers = self._prepare_headers(original, body)
+ stream_output = original.stream_output
+
+ return AWSPreparedRequest(method, url, headers, body, stream_output)
+
+ def _prepare_url(self, original):
+ url = original.url
+ if original.params:
+ url_parts = urlparse(url)
+ delim = '&' if url_parts.query else '?'
+ if isinstance(original.params, Mapping):
+ params_to_encode = list(original.params.items())
+ else:
+ params_to_encode = original.params
+ params = urlencode(params_to_encode, doseq=True)
+ url = delim.join((url, params))
+ return url
+
+ def _prepare_headers(self, original, prepared_body=None):
+ headers = HeadersDict(original.headers.items())
+
+ # If the transfer encoding or content length is already set, use that
+ if 'Transfer-Encoding' in headers or 'Content-Length' in headers:
+ return headers
+
+ # Ensure we set the content length when it is expected
+ if original.method not in ('GET', 'HEAD', 'OPTIONS'):
+ length = self._determine_content_length(prepared_body)
+ if length is not None:
+ headers['Content-Length'] = str(length)
+ else:
+ # Failed to determine content length, using chunked
+ # NOTE: This shouldn't ever happen in practice
+ body_type = type(prepared_body)
+ logger.debug('Failed to determine length of %s', body_type)
+ headers['Transfer-Encoding'] = 'chunked'
+
+ return headers
+
+ def _to_utf8(self, item):
+ key, value = item
+ if isinstance(key, str):
+ key = key.encode('utf-8')
+ if isinstance(value, str):
+ value = value.encode('utf-8')
+ return key, value
+
+ def _prepare_body(self, original):
+ """Prepares the given HTTP body data."""
+ body = original.data
+ if body == b'':
+ body = None
+
+ if isinstance(body, dict):
+ params = [self._to_utf8(item) for item in body.items()]
+ body = urlencode(params, doseq=True)
+
+ return body
+
+ def _determine_content_length(self, body):
+ return botocore.utils.determine_content_length(body)
+
+
+class AWSRequest:
+ """Represents the elements of an HTTP request.
+
+ This class was originally inspired by requests.models.Request, but has been
+ boiled down to meet the specific use cases in botocore. That being said this
+ class (even in requests) is effectively a named-tuple.
+ """
+
+ _REQUEST_PREPARER_CLS = AWSRequestPreparer
+
+ def __init__(
+ self,
+ method=None,
+ url=None,
+ headers=None,
+ data=None,
+ params=None,
+ auth_path=None,
+ stream_output=False,
+ ):
+ self._request_preparer = self._REQUEST_PREPARER_CLS()
+
+ # Default empty dicts for dict params.
+ params = {} if params is None else params
+
+ self.method = method
+ self.url = url
+ self.headers = HTTPHeaders()
+ self.data = data
+ self.params = params
+ self.auth_path = auth_path
+ self.stream_output = stream_output
+
+ if headers is not None:
+ for key, value in headers.items():
+ self.headers[key] = value
+
+ # This is a dictionary to hold information that is used when
+ # processing the request. What is inside of ``context`` is open-ended.
+ # For example, it may have a timestamp key that is used for holding
+ # what the timestamp is when signing the request. Note that none
+ # of the information that is inside of ``context`` is directly
+ # sent over the wire; the information is only used to assist in
+ # creating what is sent over the wire.
+ self.context = {}
+
+ def prepare(self):
+ """Constructs a :class:`AWSPreparedRequest <AWSPreparedRequest>`."""
+ return self._request_preparer.prepare(self)
+
+ @property
+ def body(self):
+ body = self.prepare().body
+ if isinstance(body, str):
+ body = body.encode('utf-8')
+ return body
+
+
+class AWSPreparedRequest:
+ """A data class representing a finalized request to be sent over the wire.
+
+ Requests at this stage should be treated as final, and the properties of
+ the request should not be modified.
+
+ :ivar method: The HTTP Method
+ :ivar url: The full url
+ :ivar headers: The HTTP headers to send.
+ :ivar body: The HTTP body.
+ :ivar stream_output: If the response for this request should be streamed.
+ """
+
+ def __init__(self, method, url, headers, body, stream_output):
+ self.method = method
+ self.url = url
+ self.headers = headers
+ self.body = body
+ self.stream_output = stream_output
+
+ def __repr__(self):
+ fmt = (
+ '<AWSPreparedRequest stream_output=%s, method=%s, url=%s, '
+ 'headers=%s>'
+ )
+ return fmt % (self.stream_output, self.method, self.url, self.headers)
+
+ def reset_stream(self):
+ """Resets the streaming body to it's initial position.
+
+ If the request contains a streaming body (a streamable file-like object)
+ seek to the object's initial position to ensure the entire contents of
+ the object is sent. This is a no-op for static bytes-like body types.
+ """
+ # Trying to reset a stream when there is a no stream will
+ # just immediately return. It's not an error, it will produce
+ # the same result as if we had actually reset the stream (we'll send
+ # the entire body contents again if we need to).
+ # Same case if the body is a string/bytes/bytearray type.
+
+ non_seekable_types = (bytes, str, bytearray)
+ if self.body is None or isinstance(self.body, non_seekable_types):
+ return
+ try:
+ logger.debug("Rewinding stream: %s", self.body)
+ self.body.seek(0)
+ except Exception as e:
+ logger.debug("Unable to rewind stream: %s", e)
+ raise UnseekableStreamError(stream_object=self.body)
+
+
+class AWSResponse:
+ """A data class representing an HTTP response.
+
+ This class was originally inspired by requests.models.Response, but has
+ been boiled down to meet the specific use cases in botocore. This has
+ effectively been reduced to a named tuple.
+
+ :ivar url: The full url.
+ :ivar status_code: The status code of the HTTP response.
+ :ivar headers: The HTTP headers received.
+ :ivar body: The HTTP response body.
+ """
+
+ def __init__(self, url, status_code, headers, raw):
+ self.url = url
+ self.status_code = status_code
+ self.headers = HeadersDict(headers)
+ self.raw = raw
+
+ self._content = None
+
+ @property
+ def content(self):
+ """Content of the response as bytes."""
+
+ if self._content is None:
+ # Read the contents.
+ # NOTE: requests would attempt to call stream and fall back
+ # to a custom generator that would call read in a loop, but
+ # we don't rely on this behavior
+ self._content = b''.join(self.raw.stream()) or b''
+
+ return self._content
+
+ @property
+ def text(self):
+ """Content of the response as a proper text type.
+
+ Uses the encoding type provided in the reponse headers to decode the
+ response content into a proper text type. If the encoding is not
+ present in the headers, UTF-8 is used as a default.
+ """
+ encoding = botocore.utils.get_encoding_from_headers(self.headers)
+ if encoding:
+ return self.content.decode(encoding)
+ else:
+ return self.content.decode('utf-8')
+
+
+class _HeaderKey:
+ def __init__(self, key):
+ self._key = key
+ self._lower = key.lower()
+
+ def __hash__(self):
+ return hash(self._lower)
+
+ def __eq__(self, other):
+ return isinstance(other, _HeaderKey) and self._lower == other._lower
+
+ def __str__(self):
+ return self._key
+
+ def __repr__(self):
+ return repr(self._key)
+
+
+class HeadersDict(MutableMapping):
+ """A case-insenseitive dictionary to represent HTTP headers."""
+
+ def __init__(self, *args, **kwargs):
+ self._dict = {}
+ self.update(*args, **kwargs)
+
+ def __setitem__(self, key, value):
+ self._dict[_HeaderKey(key)] = value
+
+ def __getitem__(self, key):
+ return self._dict[_HeaderKey(key)]
+
+ def __delitem__(self, key):
+ del self._dict[_HeaderKey(key)]
+
+ def __iter__(self):
+ return (str(key) for key in self._dict)
+
+ def __len__(self):
+ return len(self._dict)
+
+ def __repr__(self):
+ return repr(self._dict)
+
+ def copy(self):
+ return HeadersDict(self.items())
diff --git a/.venv/lib/python3.12/site-packages/botocore/cacert.pem b/.venv/lib/python3.12/site-packages/botocore/cacert.pem
new file mode 100644
index 00000000..919478ed
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/cacert.pem
@@ -0,0 +1,4361 @@
+
+# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
+# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
+# Label: "GlobalSign Root CA"
+# Serial: 4835703278459707669005204
+# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a
+# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c
+# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
+A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
+b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
+MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
+YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
+aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
+jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
+xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
+1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
+snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
+U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
+9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
+BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
+AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
+yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
+38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
+AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
+DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
+HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
+# Label: "GlobalSign Root CA - R2"
+# Serial: 4835703278459682885658125
+# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30
+# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe
+# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
+A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
+Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
+MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
+A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
+v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
+eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
+tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
+C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
+zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
+mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
+V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
+bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
+3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
+J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
+291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
+ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
+AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
+TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
+# Label: "Verisign Class 3 Public Primary Certification Authority - G3"
+# Serial: 206684696279472310254277870180966723415
+# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09
+# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6
+# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
+cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
+LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
+aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
+VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
+bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
+IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
+N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
+KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
+kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
+CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
+Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
+imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
+2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
+DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
+/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
+F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
+TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
+# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
+# Label: "Entrust.net Premium 2048 Secure Server CA"
+# Serial: 946069240
+# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90
+# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31
+# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
+RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
+bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
+IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3
+MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
+LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
+YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
+A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
+K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
+sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
+MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
+XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
+HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
+4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
+HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub
+j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo
+U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
+zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b
+u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+
+bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er
+fF6adulZkMV8gzURZVE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
+# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
+# Label: "Baltimore CyberTrust Root"
+# Serial: 33554617
+# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4
+# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74
+# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
+DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
+ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
+VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
+mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
+IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
+mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
+XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
+dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
+jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
+BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
+DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
+9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
+jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
+Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
+ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
+R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+
+# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
+# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
+# Label: "AddTrust External Root"
+# Serial: 1
+# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f
+# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68
+# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
+IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
+MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
+FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
+bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
+dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
+H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
+uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
+mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
+a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
+E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
+WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
+VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
+Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
+cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
+IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
+AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
+YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
+Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
+c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
+mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
+# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
+# Label: "Entrust Root Certification Authority"
+# Serial: 1164660820
+# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4
+# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9
+# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c
+-----BEGIN CERTIFICATE-----
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
+Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
+KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
+NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
+NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
+ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
+BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
+Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
+4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
+KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
+rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
+94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
+sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
+gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
+kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
+vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
+O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
+AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
+9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
+eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
+0vdXcDazv/wor3ElhVsT/h5/WrQ8
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc.
+# Subject: CN=GeoTrust Global CA O=GeoTrust Inc.
+# Label: "GeoTrust Global CA"
+# Serial: 144470
+# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5
+# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12
+# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
+MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
+YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
+R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
+9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
+fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
+iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
+1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
+MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
+ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
+uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
+Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
+tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
+PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
+hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
+5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc.
+# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc.
+# Label: "GeoTrust Universal CA"
+# Serial: 1
+# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48
+# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79
+# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12
+-----BEGIN CERTIFICATE-----
+MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy
+c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE
+BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0
+IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV
+VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8
+cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT
+QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh
+F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v
+c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w
+mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd
+VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX
+teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ
+f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe
+Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+
+nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB
+/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY
+MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG
+9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
+aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX
+IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn
+ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z
+uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN
+Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja
+QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW
+koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9
+ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt
+DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm
+bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
+# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
+# Label: "GeoTrust Universal CA 2"
+# Serial: 1
+# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7
+# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79
+# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy
+c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD
+VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1
+c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81
+WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG
+FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq
+XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL
+se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb
+KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd
+IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73
+y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt
+hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc
+QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4
+Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV
+HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ
+KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
+dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ
+L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr
+Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo
+ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY
+T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz
+GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m
+1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV
+OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH
+6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX
+QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
+-----END CERTIFICATE-----
+
+# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association
+# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association
+# Label: "Visa eCommerce Root"
+# Serial: 25952180776285836048024890241505565794
+# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02
+# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62
+# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22
+-----BEGIN CERTIFICATE-----
+MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr
+MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl
+cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
+bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw
+CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h
+dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l
+cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h
+2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E
+lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV
+ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq
+299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t
+vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL
+dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
+AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF
+AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR
+zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3
+LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd
+7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw
+++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
+398znM/jra6O1I7mT1GvFpLgXPYHDw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=AAA Certificate Services O=Comodo CA Limited
+# Subject: CN=AAA Certificate Services O=Comodo CA Limited
+# Label: "Comodo AAA Services root"
+# Serial: 1
+# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0
+# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49
+# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
+YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
+GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
+BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
+3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
+YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
+rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
+ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
+oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
+QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
+b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
+AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
+GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
+G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
+l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
+smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority
+# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority
+# Label: "QuoVadis Root CA"
+# Serial: 985026699
+# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24
+# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9
+# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73
+-----BEGIN CERTIFICATE-----
+MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC
+TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz
+MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw
+IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR
+dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp
+li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D
+rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ
+WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug
+F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU
+xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC
+Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv
+dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw
+ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl
+IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh
+c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy
+ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
+Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI
+KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T
+KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq
+y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p
+dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD
+VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL
+MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk
+fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8
+7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R
+cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y
+mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW
+xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK
+SnQ2+Q==
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 2"
+# Serial: 1289
+# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b
+# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7
+# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86
+-----BEGIN CERTIFICATE-----
+MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
+GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
+b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV
+BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
+YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa
+GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg
+Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J
+WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB
+rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp
++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1
+ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i
+Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz
+PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og
+/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH
+oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI
+yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud
+EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2
+A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL
+MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
+ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f
+BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn
+g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl
+fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K
+WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha
+B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc
+hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR
+TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD
+mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z
+ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y
+4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza
+8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 3"
+# Serial: 1478
+# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf
+# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85
+# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35
+-----BEGIN CERTIFICATE-----
+MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
+GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
+b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV
+BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
+YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM
+V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB
+4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr
+H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd
+8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv
+vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT
+mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe
+btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc
+T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt
+WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ
+c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A
+4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD
+VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG
+CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0
+aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
+aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu
+dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw
+czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G
+A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC
+TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg
+Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0
+7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem
+d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd
++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B
+4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN
+t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x
+DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57
+k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s
+zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j
+Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT
+mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK
+4SVhM7JZG+Ju1zdXtg2pEto=
+-----END CERTIFICATE-----
+
+# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1
+# Subject: O=SECOM Trust.net OU=Security Communication RootCA1
+# Label: "Security Communication Root CA"
+# Serial: 0
+# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a
+# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7
+# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c
+-----BEGIN CERTIFICATE-----
+MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY
+MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t
+dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5
+WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD
+VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8
+9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ
+DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9
+Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N
+QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ
+xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G
+A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T
+AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG
+kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr
+Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5
+Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU
+JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot
+RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Sonera Class2 CA O=Sonera
+# Subject: CN=Sonera Class2 CA O=Sonera
+# Label: "Sonera Class 2 Root CA"
+# Serial: 29
+# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb
+# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27
+# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP
+MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx
+MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV
+BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o
+Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt
+5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s
+3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej
+vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu
+8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw
+DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG
+MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil
+zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/
+3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD
+FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6
+Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2
+ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M
+-----END CERTIFICATE-----
+
+# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
+# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
+# Label: "XRamp Global CA Root"
+# Serial: 107108908803651509692980124233745014957
+# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1
+# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6
+# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
+gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
+MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY
+UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx
+NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3
+dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy
+dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6
+38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP
+KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q
+DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4
+qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa
+JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi
+PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P
+BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs
+jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0
+eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD
+ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR
+vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
+qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa
+IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
+i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
+O+7ETPTsJ3xCwnR8gooJybQDJbw=
+-----END CERTIFICATE-----
+
+# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
+# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
+# Label: "Go Daddy Class 2 CA"
+# Serial: 0
+# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67
+# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4
+# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4
+-----BEGIN CERTIFICATE-----
+MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
+MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
+YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
+MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
+ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
+MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
+ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
+PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
+wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
+EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
+avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
+sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
+/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
+IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
+ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
+OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
+TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
+HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
+dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
+ReYNnyicsbkqWletNw+vHX/bvZ8=
+-----END CERTIFICATE-----
+
+# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
+# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
+# Label: "Starfield Class 2 CA"
+# Serial: 0
+# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24
+# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a
+# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl
+MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp
+U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw
+NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE
+ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp
+ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3
+DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf
+8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN
++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0
+X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa
+K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA
+1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G
+A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR
+zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0
+YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
+bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w
+DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3
+L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D
+eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
+xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp
+VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY
+WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=
+-----END CERTIFICATE-----
+
+# Issuer: O=Government Root Certification Authority
+# Subject: O=Government Root Certification Authority
+# Label: "Taiwan GRCA"
+# Serial: 42023070807708724159991140556527066870
+# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e
+# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9
+# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3
+-----BEGIN CERTIFICATE-----
+MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/
+MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow
+PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
+AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR
+IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q
+gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy
+yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts
+F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2
+jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx
+ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC
+VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK
+YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH
+EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN
+Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud
+DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE
+MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK
+UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
+TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf
+qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK
+ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE
+JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7
+hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1
+EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm
+nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX
+udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz
+ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe
+LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl
+pYYsfPQS
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Assured ID Root CA"
+# Serial: 17154717934120587862167794914071425081
+# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72
+# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43
+# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c
+-----BEGIN CERTIFICATE-----
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
+b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
+cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
+JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
+mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
+VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
+AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
+AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
+BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
+pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
+dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
+fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
+NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
+H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Global Root CA"
+# Serial: 10944719598952040374951832963794454346
+# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e
+# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36
+# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
+QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
+CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
+nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
+43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
+T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
+gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
+BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
+TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
+DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
+hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
+06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
+PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
+YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert High Assurance EV Root CA"
+# Serial: 3553400076410547919724730734378100087
+# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a
+# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25
+# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
+ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
+LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
+RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
+PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
+xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
+Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
+hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
+EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
+FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
+nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
+eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
+hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
+Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
++OkuE6N36B9K
+-----END CERTIFICATE-----
+
+# Issuer: CN=Class 2 Primary CA O=Certplus
+# Subject: CN=Class 2 Primary CA O=Certplus
+# Label: "Certplus Class 2 Primary CA"
+# Serial: 177770208045934040241468760488327595043
+# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b
+# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb
+# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb
+-----BEGIN CERTIFICATE-----
+MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw
+PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz
+cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9
+MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz
+IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ
+ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR
+VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL
+kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd
+EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas
+H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0
+HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud
+DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4
+QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu
+Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/
+AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8
+yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR
+FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA
+ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB
+kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
+l7+ijrRU
+-----END CERTIFICATE-----
+
+# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co.
+# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co.
+# Label: "DST Root CA X3"
+# Serial: 91299735575339953335919266965803778155
+# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5
+# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13
+# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39
+-----BEGIN CERTIFICATE-----
+MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
+MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
+DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
+PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
+Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
+rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
+OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
+xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
+7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
+aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
+SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
+ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
+AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
+R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
+JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
+Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
+-----END CERTIFICATE-----
+
+# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG
+# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG
+# Label: "SwissSign Gold CA - G2"
+# Serial: 13492815561806991280
+# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93
+# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61
+# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95
+-----BEGIN CERTIFICATE-----
+MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
+BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln
+biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF
+MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT
+d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
+CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8
+76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+
+bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c
+6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE
+emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd
+MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt
+MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y
+MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y
+FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi
+aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM
+gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB
+qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7
+lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn
+8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
+L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6
+45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO
+UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5
+O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC
+bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv
+GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a
+77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC
+hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3
+92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp
+Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w
+ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt
+Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
+-----END CERTIFICATE-----
+
+# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG
+# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG
+# Label: "SwissSign Silver CA - G2"
+# Serial: 5700383053117599563
+# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13
+# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb
+# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5
+-----BEGIN CERTIFICATE-----
+MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE
+BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu
+IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow
+RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY
+U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv
+Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br
+YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF
+nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH
+6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt
+eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/
+c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ
+MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH
+HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf
+jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6
+5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB
+rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU
+F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c
+wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
+cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB
+AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp
+WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9
+xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ
+2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ
+IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8
+aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X
+em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR
+dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/
+OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+
+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy
+tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
+# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
+# Label: "GeoTrust Primary Certification Authority"
+# Serial: 32798226551256963324313806436981982369
+# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf
+# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96
+# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY
+MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
+R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
+MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
+Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9
+AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA
+ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0
+7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W
+kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI
+mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
+KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1
+6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
+4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K
+oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj
+UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU
+AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
+# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
+# Label: "thawte Primary Root CA"
+# Serial: 69529181992039203566298953787712940909
+# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12
+# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81
+# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
+qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
+BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
+NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
+LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
+A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
+W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
+3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
+6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
+Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
+NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
+r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
+DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
+YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
+xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
+/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
+LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
+jVaMaA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only
+# Label: "VeriSign Class 3 Public Primary Certification Authority - G5"
+# Serial: 33037644167568058970164719475676101450
+# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c
+# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5
+# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df
+-----BEGIN CERTIFICATE-----
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
+ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
+ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
+U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
+nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
+t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
+SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
+BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
+rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
+NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
+BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
+BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
+MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
+p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
+5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
+WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
+4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
+hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
+-----END CERTIFICATE-----
+
+# Issuer: CN=SecureTrust CA O=SecureTrust Corporation
+# Subject: CN=SecureTrust CA O=SecureTrust Corporation
+# Label: "SecureTrust CA"
+# Serial: 17199774589125277788362757014266862032
+# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1
+# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11
+# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73
+-----BEGIN CERTIFICATE-----
+MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI
+MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
+FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz
+MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv
+cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz
+Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO
+0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao
+wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj
+7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS
+8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT
+BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg
+JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC
+NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3
+6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/
+3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm
+D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS
+CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
+3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Secure Global CA O=SecureTrust Corporation
+# Subject: CN=Secure Global CA O=SecureTrust Corporation
+# Label: "Secure Global CA"
+# Serial: 9751836167731051554232119481456978597
+# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de
+# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b
+# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69
+-----BEGIN CERTIFICATE-----
+MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK
+MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
+GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx
+MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg
+Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ
+iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa
+/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ
+jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI
+HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7
+sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w
+gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw
+KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG
+AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L
+URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO
+H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm
+I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY
+iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
+f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
+-----END CERTIFICATE-----
+
+# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited
+# Subject: CN=COMODO Certification Authority O=COMODO CA Limited
+# Label: "COMODO Certification Authority"
+# Serial: 104350513648249232941998508985834464573
+# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75
+# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b
+# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66
+-----BEGIN CERTIFICATE-----
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
+gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
+BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
+MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
+YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
+RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
+UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
+2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
+Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
+nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
+/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
+PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
+QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
+SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
+IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
+zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
+BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
+ZQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
+# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
+# Label: "Network Solutions Certificate Authority"
+# Serial: 116697915152937497490437556386812487904
+# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e
+# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce
+# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi
+MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
+MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp
+dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV
+UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO
+ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz
+c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP
+OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl
+mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF
+BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4
+qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw
+gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu
+bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp
+dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8
+6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/
+h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH
+/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
+wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN
+pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
+-----END CERTIFICATE-----
+
+# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited
+# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited
+# Label: "COMODO ECC Certification Authority"
+# Serial: 41578283867086692638256921589707938090
+# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23
+# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11
+# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7
+-----BEGIN CERTIFICATE-----
+MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT
+IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw
+MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy
+ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N
+T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR
+FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J
+cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW
+BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm
+fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv
+GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
+-----END CERTIFICATE-----
+
+# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed
+# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed
+# Label: "OISTE WISeKey Global Root GA CA"
+# Serial: 86718877871133159090080555911823548314
+# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93
+# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9
+# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5
+-----BEGIN CERTIFICATE-----
+MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB
+ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly
+aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
+ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w
+NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G
+A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD
+VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX
+SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR
+VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2
+w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF
+mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg
+4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9
+4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw
+EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx
+SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2
+ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8
+vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
+hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi
+Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ
+/L7fCg0=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certigna O=Dhimyotis
+# Subject: CN=Certigna O=Dhimyotis
+# Label: "Certigna"
+# Serial: 18364802974209362175
+# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff
+# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97
+# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d
+-----BEGIN CERTIFICATE-----
+MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV
+BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X
+DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ
+BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4
+QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny
+gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw
+zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q
+130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2
+JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw
+ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT
+AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj
+AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG
+9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h
+bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc
+fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu
+HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w
+t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
+WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center
+# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center
+# Label: "Deutsche Telekom Root CA 2"
+# Serial: 38
+# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08
+# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf
+# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3
+-----BEGIN CERTIFICATE-----
+MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc
+MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj
+IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB
+IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE
+RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl
+U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290
+IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU
+ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC
+QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr
+rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S
+NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc
+QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH
+txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP
+BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC
+AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp
+tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa
+IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl
+6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+
+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
+Cm26OWMohpLzGITY+9HPBVZkVw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc
+# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc
+# Label: "Cybertrust Global Root"
+# Serial: 4835703278459682877484360
+# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1
+# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6
+# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3
+-----BEGIN CERTIFICATE-----
+MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG
+A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh
+bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE
+ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS
+b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5
+7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS
+J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y
+HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP
+t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz
+FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY
+XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/
+MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw
+hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js
+MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA
+A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj
+Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx
+XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o
+omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc
+A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
+WL1WMRJOEcgh4LMRkWXbtKaIOM5V
+-----END CERTIFICATE-----
+
+# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority
+# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority
+# Label: "ePKI Root Certification Authority"
+# Serial: 28956088682735189655030529057352760477
+# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3
+# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0
+# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5
+-----BEGIN CERTIFICATE-----
+MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe
+MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0
+ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
+Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw
+IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL
+SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH
+SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh
+ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X
+DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1
+TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ
+fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA
+sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU
+WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS
+nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH
+dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip
+NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC
+AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF
+MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
+ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB
+uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl
+PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP
+JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/
+gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2
+j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6
+5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB
+o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS
+/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z
+Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE
+W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D
+hNQ+IIX3Sj0rnP0qCglN6oH4EZw=
+-----END CERTIFICATE-----
+
+# Issuer: O=certSIGN OU=certSIGN ROOT CA
+# Subject: O=certSIGN OU=certSIGN ROOT CA
+# Label: "certSIGN ROOT CA"
+# Serial: 35210227249154
+# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17
+# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b
+# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb
+-----BEGIN CERTIFICATE-----
+MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT
+AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD
+QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP
+MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do
+0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ
+UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d
+RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ
+OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv
+JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C
+AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O
+BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ
+LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY
+MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ
+44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I
+Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw
+i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN
+9u6wWk5JRFRYX0KD
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
+# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
+# Label: "GeoTrust Primary Certification Authority - G3"
+# Serial: 28809105769928564313984085209975885599
+# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05
+# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd
+# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4
+-----BEGIN CERTIFICATE-----
+MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB
+mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT
+MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
+eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ
+BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
+MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0
+BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz
++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm
+hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn
+5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W
+JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL
+DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC
+huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
+HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB
+AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB
+zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN
+kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
+AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH
+SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G
+spki4cErx5z481+oghLrGREt
+-----END CERTIFICATE-----
+
+# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
+# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
+# Label: "thawte Primary Root CA - G2"
+# Serial: 71758320672825410020661621085256472406
+# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f
+# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12
+# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57
+-----BEGIN CERTIFICATE-----
+MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp
+IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi
+BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw
+MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
+d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig
+YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v
+dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/
+BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6
+papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K
+DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3
+KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox
+XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
+# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
+# Label: "thawte Primary Root CA - G3"
+# Serial: 127614157056681299805556476275995414779
+# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31
+# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2
+# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB
+rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV
+BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa
+Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl
+LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u
+MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl
+ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm
+gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8
+YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf
+b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9
+9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S
+zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk
+OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV
+HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA
+2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW
+oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
+t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c
+KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM
+m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu
+MdRAGmI0Nj81Aa6sY6A=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
+# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
+# Label: "GeoTrust Primary Certification Authority - G2"
+# Serial: 80682863203381065782177908751794619243
+# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a
+# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0
+# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66
+-----BEGIN CERTIFICATE-----
+MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL
+MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj
+KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2
+MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV
+BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw
+NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV
+BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
+MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL
+So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal
+tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG
+CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT
+qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz
+rD6ogRLQy7rQkgu2npaqBA+K
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
+# Label: "VeriSign Universal Root Certification Authority"
+# Serial: 85209574734084581917763752644031726877
+# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19
+# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54
+# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c
+-----BEGIN CERTIFICATE-----
+MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB
+vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W
+ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
+Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX
+MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0
+IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y
+IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh
+bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF
+9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH
+H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H
+LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN
+/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT
+rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw
+WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs
+exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
+DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4
+sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+
+seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz
+4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+
+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR
+lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3
+7M2CYfE45k+XmCpajQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only
+# Label: "VeriSign Class 3 Public Primary Certification Authority - G4"
+# Serial: 63143484348153506665311985501458640051
+# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41
+# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a
+# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79
+-----BEGIN CERTIFICATE-----
+MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
+ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
+U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp
+U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg
+SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln
+biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm
+GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve
+fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ
+aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj
+aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW
+kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC
+4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga
+FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services)
+# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services)
+# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny"
+# Serial: 80544274841616
+# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88
+# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91
+# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG
+EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3
+MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl
+cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR
+dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB
+pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM
+b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm
+aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz
+IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT
+lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz
+AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5
+VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG
+ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2
+BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG
+AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M
+U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh
+bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C
++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
+bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F
+uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2
+XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden
+# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden
+# Label: "Staat der Nederlanden Root CA - G2"
+# Serial: 10000012
+# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a
+# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16
+# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f
+-----BEGIN CERTIFICATE-----
+MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX
+DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl
+ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv
+b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291
+qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp
+uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU
+Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE
+pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp
+5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M
+UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN
+GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy
+5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv
+6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK
+eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6
+B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/
+BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov
+L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG
+SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS
+CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen
+5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897
+IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK
+gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL
++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL
+vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm
+bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk
+N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC
+Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z
+ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.
+# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.
+# Label: "SecureSign RootCA11"
+# Serial: 1
+# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26
+# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3
+# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12
+-----BEGIN CERTIFICATE-----
+MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr
+MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG
+A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0
+MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp
+Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD
+QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz
+i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8
+h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV
+MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9
+UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni
+8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC
+h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD
+VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB
+AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm
+KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ
+X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr
+QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5
+pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN
+QSdJQO7e5iNEOdyhIta6A/I=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.
+# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.
+# Label: "Microsec e-Szigno Root CA 2009"
+# Serial: 14014712776195784473
+# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1
+# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e
+# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78
+-----BEGIN CERTIFICATE-----
+MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD
+VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0
+ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G
+CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y
+OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx
+FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp
+Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
+dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP
+kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc
+cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U
+fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7
+N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC
+xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1
++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
+A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM
+Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG
+SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h
+mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk
+ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
+tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c
+2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t
+HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
+# Label: "GlobalSign Root CA - R3"
+# Serial: 4835703278459759426209954
+# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28
+# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad
+# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b
+-----BEGIN CERTIFICATE-----
+MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G
+A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp
+Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4
+MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG
+A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8
+RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT
+gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm
+KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd
+QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ
+XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw
+DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o
+LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU
+RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp
+jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK
+6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX
+mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs
+Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
+WD9f
+-----END CERTIFICATE-----
+
+# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
+# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
+# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068"
+# Serial: 6047274297262753887
+# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3
+# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa
+# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef
+-----BEGIN CERTIFICATE-----
+MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE
+BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h
+cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy
+MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg
+Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9
+thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM
+cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG
+L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i
+NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h
+X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b
+m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy
+Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja
+EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T
+KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF
+6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh
+OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD
+VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD
+VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
+cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv
+ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl
+AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF
+661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9
+am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1
+ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481
+PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS
+3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k
+SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF
+3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM
+ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g
+StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz
+Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB
+jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
+-----END CERTIFICATE-----
+
+# Issuer: CN=Izenpe.com O=IZENPE S.A.
+# Subject: CN=Izenpe.com O=IZENPE S.A.
+# Label: "Izenpe.com"
+# Serial: 917563065490389241595536686991402621
+# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73
+# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19
+# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f
+-----BEGIN CERTIFICATE-----
+MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4
+MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6
+ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD
+VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j
+b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq
+scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO
+xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H
+LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX
+uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD
+yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+
+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q
+rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN
+BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L
+hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB
+QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+
+HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu
+Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg
+QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB
+BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
+MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA
+A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb
+laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56
+awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo
+JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw
+LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT
+VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk
+LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb
+UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/
+QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+
+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls
+QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A.
+# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A.
+# Label: "Chambers of Commerce Root - 2008"
+# Serial: 11806822484801597146
+# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7
+# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c
+# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0
+-----BEGIN CERTIFICATE-----
+MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD
+VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
+IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
+MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz
+IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz
+MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj
+dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw
+EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp
+MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9
+28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq
+VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q
+DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR
+5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL
+ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a
+Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl
+UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s
++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5
+Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
+ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx
+hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV
+HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1
++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN
+YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t
+L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy
+ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt
+IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV
+HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w
+DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW
+PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF
+5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1
+glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH
+FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2
+pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD
+xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG
+tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq
+jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De
+fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
+OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ
+d0jQ
+-----END CERTIFICATE-----
+
+# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A.
+# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A.
+# Label: "Global Chambersign Root - 2008"
+# Serial: 14541511773111788494
+# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3
+# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c
+# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca
+-----BEGIN CERTIFICATE-----
+MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD
+VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
+IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
+MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
+aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx
+MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy
+cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG
+A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl
+BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI
+hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed
+KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7
+G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2
+zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4
+ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG
+HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2
+Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V
+yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e
+beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r
+6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
+wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog
+zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW
+BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr
+ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp
+ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk
+cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt
+YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC
+CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow
+KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI
+hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ
+UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz
+X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x
+fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz
+a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd
+Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd
+SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O
+AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso
+M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge
+v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
+09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
+-----END CERTIFICATE-----
+
+# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
+# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
+# Label: "Go Daddy Root Certificate Authority - G2"
+# Serial: 0
+# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01
+# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b
+# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
+EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
+ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
+NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
+EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
+AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
+E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
+/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
+DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
+GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
+tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
+AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
+FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
+WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
+9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
+gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
+2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
+LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
+4uJEvlz36hz1
+-----END CERTIFICATE-----
+
+# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Label: "Starfield Root Certificate Authority - G2"
+# Serial: 0
+# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96
+# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e
+# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
+HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
+ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw
+MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
+b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
+aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp
+Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg
+nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1
+HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N
+Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN
+dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0
+HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G
+CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU
+sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3
+4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg
+8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
+pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1
+mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
+-----END CERTIFICATE-----
+
+# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Label: "Starfield Services Root Certificate Authority - G2"
+# Serial: 0
+# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2
+# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f
+# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5
+-----BEGIN CERTIFICATE-----
+MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
+HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
+ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
+MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD
+VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy
+ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy
+dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p
+OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2
+8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K
+Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe
+hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk
+6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw
+DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q
+AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI
+bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB
+ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z
+qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
+iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn
+0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN
+sSi6
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Commercial O=AffirmTrust
+# Subject: CN=AffirmTrust Commercial O=AffirmTrust
+# Label: "AffirmTrust Commercial"
+# Serial: 8608355977964138876
+# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7
+# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7
+# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
+dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
+MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
+cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
+Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
+ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
+MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
+yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
+VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
+nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
+KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
+XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
+vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
+Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
+N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
+nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Networking O=AffirmTrust
+# Subject: CN=AffirmTrust Networking O=AffirmTrust
+# Label: "AffirmTrust Networking"
+# Serial: 8957382827206547757
+# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f
+# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f
+# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
+dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
+MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
+cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
+YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
+kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
+QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
+6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
+yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
+QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
+KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
+tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
+QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
+Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
+olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
+x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Premium O=AffirmTrust
+# Subject: CN=AffirmTrust Premium O=AffirmTrust
+# Label: "AffirmTrust Premium"
+# Serial: 7893706540734352110
+# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57
+# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27
+# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz
+dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG
+A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U
+cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf
+qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ
+JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ
++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS
+s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5
+HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7
+70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG
+V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S
+qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S
+5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia
+C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX
+OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE
+FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
+BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2
+KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
+Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B
+8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ
+MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc
+0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ
+u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF
+u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH
+YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8
+GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO
+RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e
+KeC2uAloGRwYQw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust
+# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust
+# Label: "AffirmTrust Premium ECC"
+# Serial: 8401224907861490260
+# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d
+# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb
+# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23
+-----BEGIN CERTIFICATE-----
+MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
+VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
+cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
+BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
+VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
+0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
+ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
+A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
+aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
+flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority
+# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority
+# Label: "Certum Trusted Network CA"
+# Serial: 279744
+# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78
+# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e
+# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e
+-----BEGIN CERTIFICATE-----
+MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM
+MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D
+ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU
+cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3
+WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg
+Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw
+IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH
+UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM
+TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU
+BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM
+kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x
+AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV
+HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y
+sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL
+I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8
+J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY
+VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
+03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
+-----END CERTIFICATE-----
+
+# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA
+# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA
+# Label: "TWCA Root Certification Authority"
+# Serial: 1
+# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79
+# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48
+# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44
+-----BEGIN CERTIFICATE-----
+MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES
+MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU
+V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz
+WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO
+LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE
+AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH
+K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX
+RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z
+rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx
+3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq
+hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC
+MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls
+XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D
+lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn
+aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ
+YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
+-----END CERTIFICATE-----
+
+# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2
+# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2
+# Label: "Security Communication RootCA2"
+# Serial: 0
+# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43
+# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74
+# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl
+MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe
+U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX
+DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy
+dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj
+YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV
+OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr
+zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM
+VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ
+hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO
+ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw
+awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs
+OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
+DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF
+coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc
+okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8
+t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy
+1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/
+SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
+-----END CERTIFICATE-----
+
+# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority
+# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority
+# Label: "Hellenic Academic and Research Institutions RootCA 2011"
+# Serial: 0
+# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9
+# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d
+# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71
+-----BEGIN CERTIFICATE-----
+MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix
+RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1
+dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p
+YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw
+NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK
+EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl
+cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
+c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz
+dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ
+fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns
+bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD
+75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP
+FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV
+HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp
+5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu
+b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA
+A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p
+6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
+TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7
+dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys
+Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI
+l7WdmplNsDz4SgCbZN2fOUvRJ9e4
+-----END CERTIFICATE-----
+
+# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
+# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
+# Label: "Actalis Authentication Root CA"
+# Serial: 6271844772424770508
+# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6
+# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac
+# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66
+-----BEGIN CERTIFICATE-----
+MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE
+BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w
+MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
+IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC
+SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1
+ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv
+UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX
+4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9
+KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/
+gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb
+rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ
+51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F
+be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe
+KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F
+v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn
+fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7
+jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz
+ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
+ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL
+e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70
+jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz
+WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V
+SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j
+pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX
+X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok
+fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R
+K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU
+ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU
+LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT
+LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
+-----END CERTIFICATE-----
+
+# Issuer: O=Trustis Limited OU=Trustis FPS Root CA
+# Subject: O=Trustis Limited OU=Trustis FPS Root CA
+# Label: "Trustis FPS Root CA"
+# Serial: 36053640375399034304724988975563710553
+# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d
+# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04
+# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d
+-----BEGIN CERTIFICATE-----
+MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF
+MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL
+ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx
+MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc
+MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+
+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH
+iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj
+vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA
+0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB
+OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/
+BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E
+FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01
+GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW
+zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4
+1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE
+f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F
+jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN
+ZetX2fNXlrtIzYE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327
+# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327
+# Label: "Buypass Class 2 Root CA"
+# Serial: 2
+# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29
+# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99
+# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
+MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
+Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow
+TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
+HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
+BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr
+6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV
+L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91
+1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx
+MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ
+QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB
+arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr
+Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi
+FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS
+P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN
+9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP
+AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz
+uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h
+9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
+A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t
+OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo
++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7
+KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2
+DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us
+H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ
+I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7
+5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h
+3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz
+Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327
+# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327
+# Label: "Buypass Class 3 Root CA"
+# Serial: 2
+# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec
+# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57
+# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
+MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
+Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow
+TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
+HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
+BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y
+ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E
+N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9
+tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX
+0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c
+/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X
+KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY
+zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS
+O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D
+34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP
+K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3
+AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv
+Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj
+QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
+cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS
+IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2
+HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa
+O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv
+033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u
+dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE
+kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41
+3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD
+u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq
+4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc=
+-----END CERTIFICATE-----
+
+# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Label: "T-TeleSec GlobalRoot Class 3"
+# Serial: 1
+# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef
+# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1
+# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
+KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
+BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
+YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1
+OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
+aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
+ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN
+8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/
+RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4
+hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5
+ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM
+EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj
+QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1
+A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy
+WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ
+1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30
+6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT
+91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
+e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p
+TpPDpFQUWw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus
+# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus
+# Label: "EE Certification Centre Root CA"
+# Serial: 112324828676200291871926431888494945866
+# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f
+# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7
+# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76
+-----BEGIN CERTIFICATE-----
+MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1
+MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1
+czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG
+CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy
+MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl
+ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS
+b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy
+euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO
+bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw
+WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d
+MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE
+1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD
+VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/
+zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB
+BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF
+BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV
+v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG
+E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
+uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW
+iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v
+GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0=
+-----END CERTIFICATE-----
+
+# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH
+# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH
+# Label: "D-TRUST Root Class 3 CA 2 2009"
+# Serial: 623603
+# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f
+# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0
+# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1
+-----BEGIN CERTIFICATE-----
+MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF
+MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD
+bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha
+ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM
+HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03
+UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42
+tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R
+ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM
+lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp
+/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G
+A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G
+A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj
+dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy
+MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl
+cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js
+L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL
+BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni
+acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
+o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K
+zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8
+PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y
+Johw1+qRzT65ysCQblrGXnRl11z+o+I=
+-----END CERTIFICATE-----
+
+# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH
+# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH
+# Label: "D-TRUST Root Class 3 CA 2 EV 2009"
+# Serial: 623604
+# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6
+# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83
+# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF
+MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD
+bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw
+NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV
+BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn
+ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0
+3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z
+qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR
+p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8
+HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw
+ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea
+HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw
+Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh
+c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E
+RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt
+dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku
+Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp
+3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
+nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF
+CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na
+xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX
+KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1
+-----END CERTIFICATE-----
+
+# Issuer: CN=CA Disig Root R2 O=Disig a.s.
+# Subject: CN=CA Disig Root R2 O=Disig a.s.
+# Label: "CA Disig Root R2"
+# Serial: 10572350602393338211
+# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03
+# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71
+# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV
+BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu
+MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy
+MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx
+EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw
+ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe
+NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH
+PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I
+x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe
+QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR
+yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO
+QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912
+H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ
+QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD
+i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs
+nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1
+rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
+DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI
+hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
+tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf
+GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb
+lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka
++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal
+TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i
+nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3
+gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr
+G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os
+zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x
+L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL
+-----END CERTIFICATE-----
+
+# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV
+# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV
+# Label: "ACCVRAIZ1"
+# Serial: 6828503384748696800
+# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02
+# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17
+# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13
+-----BEGIN CERTIFICATE-----
+MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE
+AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw
+CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ
+BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND
+VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb
+qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY
+HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo
+G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA
+lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr
+IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/
+0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH
+k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47
+4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO
+m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa
+cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl
+uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI
+KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls
+ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG
+AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
+VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT
+VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG
+CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA
+cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA
+QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA
+7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA
+cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA
+QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA
+czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu
+aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt
+aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud
+DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF
+BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp
+D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU
+JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m
+AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD
+vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms
+tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH
+7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
+I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA
+h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF
+d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H
+pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7
+-----END CERTIFICATE-----
+
+# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA
+# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA
+# Label: "TWCA Global Root CA"
+# Serial: 3262
+# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96
+# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65
+# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx
+EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT
+VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5
+NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT
+B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF
+10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz
+0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh
+MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH
+zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc
+46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2
+yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi
+laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP
+oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA
+BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE
+qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm
+4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL
+1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
+LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF
+H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo
+RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+
+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh
+15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW
+6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW
+nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j
+wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz
+aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy
+KwbQBM0=
+-----END CERTIFICATE-----
+
+# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera
+# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera
+# Label: "TeliaSonera Root CA v1"
+# Serial: 199041966741090107964904287217786801558
+# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c
+# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37
+# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89
+-----BEGIN CERTIFICATE-----
+MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw
+NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv
+b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD
+VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2
+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F
+VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1
+7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X
+Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+
+/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs
+81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm
+dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe
+Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu
+sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4
+pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs
+slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ
+arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD
+VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG
+9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl
+dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
+0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj
+TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed
+Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7
+Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI
+OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7
+vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW
+t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn
+HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx
+SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
+-----END CERTIFICATE-----
+
+# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Label: "T-TeleSec GlobalRoot Class 2"
+# Serial: 1
+# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a
+# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9
+# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
+KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
+BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
+YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1
+OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
+aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
+ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd
+AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC
+FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi
+1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq
+jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ
+wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj
+QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/
+WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy
+NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC
+uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw
+IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6
+g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
+9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP
+BSeOE6Fuwg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Atos TrustedRoot 2011 O=Atos
+# Subject: CN=Atos TrustedRoot 2011 O=Atos
+# Label: "Atos TrustedRoot 2011"
+# Serial: 6643877497813316402
+# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56
+# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21
+# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE
+AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG
+EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM
+FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC
+REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp
+Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM
+VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+
+SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ
+4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L
+cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi
+eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV
+HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG
+A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3
+DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j
+vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP
+DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc
+maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D
+lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv
+KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 1 G3"
+# Serial: 687049649626669250736271037606554624078720034195
+# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab
+# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67
+# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL
+BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
+BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00
+MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV
+wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe
+rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341
+68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh
+4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp
+UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o
+abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc
+3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G
+KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt
+hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO
+Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt
+zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD
+ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC
+MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2
+cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN
+qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5
+YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv
+b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2
+8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k
+NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj
+ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp
+q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt
+nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 2 G3"
+# Serial: 390156079458959257446133169266079962026824725800
+# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06
+# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36
+# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL
+BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
+BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00
+MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf
+qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW
+n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym
+c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+
+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1
+o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j
+IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq
+IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz
+8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh
+vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l
+7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG
+cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD
+ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66
+AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC
+roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga
+W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n
+lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE
++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV
+csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd
+dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg
+KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM
+HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4
+WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 3 G3"
+# Serial: 268090761170461462463995952157327242137089239581
+# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7
+# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d
+# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL
+BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
+BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00
+MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR
+/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu
+FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR
+U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c
+ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR
+FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k
+A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw
+eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl
+sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp
+VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q
+A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+
+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD
+ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px
+KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI
+FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv
+oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg
+u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP
+0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf
+3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl
+8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+
+DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN
+PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/
+ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Assured ID Root G2"
+# Serial: 15385348160840213938643033620894905419
+# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d
+# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f
+# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85
+-----BEGIN CERTIFICATE-----
+MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
+b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
+cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA
+n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc
+biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp
+EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA
+bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu
+YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB
+AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW
+BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI
+QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I
+0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni
+lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9
+B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv
+ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
+IhNzbM8m9Yop5w==
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Assured ID Root G3"
+# Serial: 15459312981008553731928384953135426796
+# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb
+# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89
+# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2
+-----BEGIN CERTIFICATE-----
+MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw
+CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
+ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg
+RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
+Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq
+hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf
+Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q
+RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
+BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD
+AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY
+JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv
+6pZjamVFkpUBtA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Global Root G2"
+# Serial: 4293743540046975378534879503202253541
+# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44
+# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4
+# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f
+-----BEGIN CERTIFICATE-----
+MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
+MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI
+2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx
+1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ
+q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz
+tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ
+vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP
+BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV
+5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY
+1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4
+NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG
+Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91
+8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe
+pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
+MrY=
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Global Root G3"
+# Serial: 7089244469030293291760083333884364146
+# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca
+# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e
+# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0
+-----BEGIN CERTIFICATE-----
+MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw
+CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
+ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe
+Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw
+EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x
+IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF
+K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG
+fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO
+Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd
+BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx
+AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/
+oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8
+sycX
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Trusted Root G4"
+# Serial: 7451500558977370777930084869016614236
+# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49
+# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4
+# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88
+-----BEGIN CERTIFICATE-----
+MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg
+RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
+Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y
+ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If
+xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV
+ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO
+DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ
+jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/
+CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi
+EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM
+fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY
+uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK
+chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t
+9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
+ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2
+SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd
++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc
+fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa
+sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N
+cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N
+0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie
+4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI
+r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1
+/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm
+gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+
+-----END CERTIFICATE-----
+
+# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited
+# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited
+# Label: "COMODO RSA Certification Authority"
+# Serial: 101909084537582093308941363524873193117
+# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18
+# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4
+# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34
+-----BEGIN CERTIFICATE-----
+MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB
+hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
+BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5
+MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
+EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
+Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR
+6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X
+pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC
+9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV
+/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf
+Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z
++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w
+qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah
+SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC
+u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf
+Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq
+crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
+FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB
+/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl
+wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM
+4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV
+2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna
+FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ
+CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK
+boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke
+jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL
+S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb
+QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl
+0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB
+NVOFBkpdn627G190
+-----END CERTIFICATE-----
+
+# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network
+# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network
+# Label: "USERTrust RSA Certification Authority"
+# Serial: 2645093764781058787591871645665788717
+# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5
+# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e
+# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2
+-----BEGIN CERTIFICATE-----
+MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
+iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
+cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
+BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw
+MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV
+BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy
+dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B
+3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY
+tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/
+Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2
+VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT
+79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6
+c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT
+Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l
+c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee
+UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE
+Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
+BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G
+A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF
+Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO
+VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3
+ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs
+8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR
+iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze
+Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ
+XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/
+qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB
+VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB
+L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG
+jjxDah2nGN59PRbxYvnKkKj9
+-----END CERTIFICATE-----
+
+# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network
+# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network
+# Label: "USERTrust ECC Certification Authority"
+# Serial: 123013823720199481456569720443997572134
+# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1
+# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0
+# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a
+-----BEGIN CERTIFICATE-----
+MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl
+eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT
+JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx
+MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
+Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg
+VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo
+I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng
+o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G
+A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB
+zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW
+RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4
+# Label: "GlobalSign ECC Root CA - R4"
+# Serial: 14367148294922964480859022125800977897474
+# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e
+# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb
+# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c
+-----BEGIN CERTIFICATE-----
+MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk
+MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH
+bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
+DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
+QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
+MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ
+FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw
+DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F
+uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX
+kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs
+ewv4n4Q=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5
+# Label: "GlobalSign ECC Root CA - R5"
+# Serial: 32785792099990507226680698011560947931244
+# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08
+# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa
+# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24
+-----BEGIN CERTIFICATE-----
+MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk
+MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH
+bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
+DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
+QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
+MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc
+8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke
+hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI
+KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg
+515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO
+xwy8p2Fp8fc74SrL+SvzZpA3
+-----END CERTIFICATE-----
+
+# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden
+# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden
+# Label: "Staat der Nederlanden Root CA - G3"
+# Serial: 10003001
+# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37
+# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc
+# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28
+-----BEGIN CERTIFICATE-----
+MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX
+DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl
+ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv
+b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP
+cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW
+IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX
+xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy
+KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR
+9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az
+5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8
+6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7
+Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP
+bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt
+BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt
+XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF
+MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd
+INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD
+U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp
+LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8
+Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp
+gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh
+/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw
+0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A
+fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq
+4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR
+1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/
+QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM
+94B7IWcnMFk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden
+# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden
+# Label: "Staat der Nederlanden EV Root CA"
+# Serial: 10000013
+# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba
+# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb
+# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a
+-----BEGIN CERTIFICATE-----
+MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y
+MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg
+TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS
+b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS
+M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC
+UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d
+Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p
+rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l
+pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb
+j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC
+KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS
+/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X
+cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH
+1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP
+px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7
+MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
+eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u
+2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS
+v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC
+wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy
+CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e
+vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6
+Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa
+Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL
+eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8
+FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc
+7uzXLg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust
+# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust
+# Label: "IdenTrust Commercial Root CA 1"
+# Serial: 13298821034946342390520003877796839426
+# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7
+# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25
+# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK
+MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu
+VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw
+MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw
+JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT
+3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU
++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp
+S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1
+bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi
+T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL
+vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK
+Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK
+dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT
+c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv
+l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N
+iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD
+ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
+6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt
+LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93
+nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3
++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK
+W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT
+AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq
+l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG
+4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ
+mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A
+7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H
+-----END CERTIFICATE-----
+
+# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust
+# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust
+# Label: "IdenTrust Public Sector Root CA 1"
+# Serial: 13298821034946342390521976156843933698
+# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba
+# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd
+# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f
+-----BEGIN CERTIFICATE-----
+MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN
+MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu
+VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN
+MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0
+MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7
+ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy
+RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS
+bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF
+/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R
+3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw
+EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy
+9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V
+GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ
+2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV
+WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD
+W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN
+AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj
+t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV
+DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9
+TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G
+lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW
+mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df
+WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5
++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ
+tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA
+GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv
+8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
+# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
+# Label: "Entrust Root Certification Authority - G2"
+# Serial: 1246989352
+# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2
+# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4
+# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39
+-----BEGIN CERTIFICATE-----
+MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50
+cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs
+IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz
+dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy
+NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu
+dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt
+dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0
+aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T
+RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN
+cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW
+wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1
+U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0
+jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN
+BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/
+jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
+Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v
+1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R
+nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH
+VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
+# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
+# Label: "Entrust Root Certification Authority - EC1"
+# Serial: 51543124481930649114116133369
+# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc
+# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47
+# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5
+-----BEGIN CERTIFICATE-----
+MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG
+A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3
+d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu
+dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq
+RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy
+MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD
+VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
+L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g
+Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi
+A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt
+ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH
+Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
+BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC
+R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX
+hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
+-----END CERTIFICATE-----
+
+# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority
+# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority
+# Label: "CFCA EV ROOT"
+# Serial: 407555286
+# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30
+# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83
+# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd
+-----BEGIN CERTIFICATE-----
+MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD
+TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx
+MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j
+aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP
+T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03
+sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL
+TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5
+/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp
+7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz
+EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt
+hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP
+a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot
+aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg
+TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV
+PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv
+cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL
+tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd
+BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
+ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT
+ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL
+jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS
+ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy
+P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19
+xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d
+Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN
+5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe
+/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z
+AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ
+5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
+-----END CERTIFICATE-----
+
+# Issuer: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e.
+# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e.
+# Label: "T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5"
+# Serial: 156233699172481
+# MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e
+# SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb
+# SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78
+-----BEGIN CERTIFICATE-----
+MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE
+BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn
+aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg
+QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg
+SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0
+MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD
+VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8
+dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom
+/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR
+Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3
+4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z
+5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0
+hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID
+AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX
+SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l
+VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq
+URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf
+peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF
+Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW
++qtB4Uu2NQvAmxU=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903
+# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903
+# Label: "Certinomis - Root CA"
+# Serial: 1
+# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f
+# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8
+# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58
+-----BEGIN CERTIFICATE-----
+MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET
+MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb
+BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz
+MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx
+FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g
+Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2
+fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl
+LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV
+WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF
+TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb
+5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc
+CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri
+wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ
+wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG
+m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4
+F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng
+WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0
+2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF
+AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/
+0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw
+F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS
+g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj
+qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN
+h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/
+ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V
+btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj
+Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ
+8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW
+gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed
+# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed
+# Label: "OISTE WISeKey Global Root GB CA"
+# Serial: 157768595616588414422159278966750757568
+# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d
+# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed
+# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt
+MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg
+Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i
+YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x
+CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG
+b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh
+bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3
+HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx
+WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX
+1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk
+u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P
+99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r
+M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB
+BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh
+cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5
+gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO
+ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf
+aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
+Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
+-----END CERTIFICATE-----
+
+# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A.
+# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A.
+# Label: "SZAFIR ROOT CA2"
+# Serial: 357043034767186914217277344587386743377558296292
+# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99
+# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de
+# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe
+-----BEGIN CERTIFICATE-----
+MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL
+BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6
+ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw
+NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L
+cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg
+Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN
+QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT
+3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw
+3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6
+3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5
+BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN
+XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
+AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF
+AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw
+8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG
+nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP
+oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy
+d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg
+LvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority
+# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority
+# Label: "Certum Trusted Network CA 2"
+# Serial: 44979900017204383099463764357512596969
+# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2
+# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92
+# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04
+-----BEGIN CERTIFICATE-----
+MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB
+gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu
+QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG
+A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz
+OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ
+VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3
+b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA
+DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn
+0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB
+OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE
+fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E
+Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m
+o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i
+sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW
+OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez
+Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS
+adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n
+3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ
+F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf
+CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29
+XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm
+djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/
+WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb
+AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq
+P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko
+b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj
+XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P
+5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi
+DrW5viSP
+-----END CERTIFICATE-----
+
+# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
+# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
+# Label: "Hellenic Academic and Research Institutions RootCA 2015"
+# Serial: 0
+# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce
+# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6
+# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36
+-----BEGIN CERTIFICATE-----
+MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix
+DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k
+IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT
+N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v
+dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG
+A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh
+ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx
+QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1
+dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA
+4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0
+AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10
+4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C
+ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV
+9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD
+gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6
+Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq
+NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko
+LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
+Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd
+ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I
+XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI
+M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot
+9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V
+Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea
+j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh
+X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ
+l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf
+bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4
+pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK
+e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0
+vm9qp/UsQu0yrbYhnr68
+-----END CERTIFICATE-----
+
+# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
+# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
+# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015"
+# Serial: 0
+# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef
+# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66
+# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33
+-----BEGIN CERTIFICATE-----
+MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN
+BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
+c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl
+bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv
+b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ
+BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj
+YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5
+MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0
+dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg
+QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa
+jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi
+C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep
+lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof
+TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certplus Root CA G1 O=Certplus
+# Subject: CN=Certplus Root CA G1 O=Certplus
+# Label: "Certplus Root CA G1"
+# Serial: 1491911565779898356709731176965615564637713
+# MD5 Fingerprint: 7f:09:9c:f7:d9:b9:5c:69:69:56:d5:37:3e:14:0d:42
+# SHA1 Fingerprint: 22:fd:d0:b7:fd:a2:4e:0d:ac:49:2c:a0:ac:a6:7b:6a:1f:e3:f7:66
+# SHA256 Fingerprint: 15:2a:40:2b:fc:df:2c:d5:48:05:4d:22:75:b3:9c:7f:ca:3e:c0:97:80:78:b0:f0:ea:76:e5:61:a6:c7:43:3e
+-----BEGIN CERTIFICATE-----
+MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA
+MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy
+dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa
+MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy
+dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
+ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a
+iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt
+6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP
+0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f
+6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE
+EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN
+1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc
+h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT
+mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV
+4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO
+WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud
+DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd
+Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq
+hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh
+66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7
+/SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS
+S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j
+2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R
+Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr
+RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy
+6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV
+V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5
+g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl
+++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certplus Root CA G2 O=Certplus
+# Subject: CN=Certplus Root CA G2 O=Certplus
+# Label: "Certplus Root CA G2"
+# Serial: 1492087096131536844209563509228951875861589
+# MD5 Fingerprint: a7:ee:c4:78:2d:1b:ee:2d:b9:29:ce:d6:a7:96:32:31
+# SHA1 Fingerprint: 4f:65:8e:1f:e9:06:d8:28:02:e9:54:47:41:c9:54:25:5d:69:cc:1a
+# SHA256 Fingerprint: 6c:c0:50:41:e6:44:5e:74:69:6c:4c:fb:c9:f8:0f:54:3b:7e:ab:bb:44:b4:ce:6f:78:7c:6a:99:71:c4:2f:17
+-----BEGIN CERTIFICATE-----
+MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x
+CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs
+dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x
+CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs
+dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat
+93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x
+Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P
+AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj
+FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG
+SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch
+p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal
+U5ORGpOucGpnutee5WEaXw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=OpenTrust Root CA G1 O=OpenTrust
+# Subject: CN=OpenTrust Root CA G1 O=OpenTrust
+# Label: "OpenTrust Root CA G1"
+# Serial: 1492036577811947013770400127034825178844775
+# MD5 Fingerprint: 76:00:cc:81:29:cd:55:5e:88:6a:7a:2e:f7:4d:39:da
+# SHA1 Fingerprint: 79:91:e8:34:f7:e2:ee:dd:08:95:01:52:e9:55:2d:14:e9:58:d5:7e
+# SHA256 Fingerprint: 56:c7:71:28:d9:8c:18:d9:1b:4c:fd:ff:bc:25:ee:91:03:d4:75:8e:a2:ab:ad:82:6a:90:f3:45:7d:46:0e:b4
+-----BEGIN CERTIFICATE-----
+MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA
+MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w
+ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw
+MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU
+T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b
+wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX
+/uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0
+77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP
+uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx
+p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx
+Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2
+TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W
+G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw
+vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY
+EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1
+2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw
+DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E
+PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf
+gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS
+FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0
+V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P
+XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I
+i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t
+TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91
+09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky
+Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ
+AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj
+1oxx
+-----END CERTIFICATE-----
+
+# Issuer: CN=OpenTrust Root CA G2 O=OpenTrust
+# Subject: CN=OpenTrust Root CA G2 O=OpenTrust
+# Label: "OpenTrust Root CA G2"
+# Serial: 1492012448042702096986875987676935573415441
+# MD5 Fingerprint: 57:24:b6:59:24:6b:ae:c8:fe:1c:0c:20:f2:c0:4e:eb
+# SHA1 Fingerprint: 79:5f:88:60:c5:ab:7c:3d:92:e6:cb:f4:8d:e1:45:cd:11:ef:60:0b
+# SHA256 Fingerprint: 27:99:58:29:fe:6a:75:15:c1:bf:e8:48:f9:c4:76:1d:b1:6c:22:59:29:25:7b:f4:0d:08:94:f2:9e:a8:ba:f2
+-----BEGIN CERTIFICATE-----
+MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA
+MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w
+ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw
+MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU
+T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh
+/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e
+CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6
+1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE
+FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS
+gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X
+G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy
+YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH
+vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4
+t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/
+gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3
+5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w
+DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz
+Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0
+nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT
+RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT
+wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2
+t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa
+TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2
+o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU
+3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA
+iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f
+WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM
+S1IK
+-----END CERTIFICATE-----
+
+# Issuer: CN=OpenTrust Root CA G3 O=OpenTrust
+# Subject: CN=OpenTrust Root CA G3 O=OpenTrust
+# Label: "OpenTrust Root CA G3"
+# Serial: 1492104908271485653071219941864171170455615
+# MD5 Fingerprint: 21:37:b4:17:16:92:7b:67:46:70:a9:96:d7:a8:13:24
+# SHA1 Fingerprint: 6e:26:64:f3:56:bf:34:55:bf:d1:93:3f:7c:01:de:d8:13:da:8a:a6
+# SHA256 Fingerprint: b7:c3:62:31:70:6e:81:07:8c:36:7c:b8:96:19:8f:1e:32:08:dd:92:69:49:dd:8f:57:09:a4:10:f7:5b:62:92
+-----BEGIN CERTIFICATE-----
+MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx
+CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U
+cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow
+QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl
+blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm
+3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d
+oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G
+A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5
+DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK
+BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q
+j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx
+4nxp5V2a+EEfOzmTk51V6s2N8fvB
+-----END CERTIFICATE-----
+
+# Issuer: CN=ISRG Root X1 O=Internet Security Research Group
+# Subject: CN=ISRG Root X1 O=Internet Security Research Group
+# Label: "ISRG Root X1"
+# Serial: 172886928669790476064670243504169061120
+# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e
+# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8
+# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6
+-----BEGIN CERTIFICATE-----
+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
+-----END CERTIFICATE-----
+
+# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM
+# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM
+# Label: "AC RAIZ FNMT-RCM"
+# Serial: 485876308206448804701554682760554759
+# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d
+# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20
+# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa
+-----BEGIN CERTIFICATE-----
+MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx
+CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ
+WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ
+BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG
+Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/
+yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf
+BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz
+WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF
+tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z
+374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC
+IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL
+mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7
+wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS
+MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2
+ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet
+UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H
+YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3
+LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD
+nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1
+RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM
+LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf
+77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N
+JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm
+fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp
+6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp
+1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B
+9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok
+RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv
+uu8wd+RU4riEmViAqhOLUTpPSPaLtrM=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Amazon Root CA 1 O=Amazon
+# Subject: CN=Amazon Root CA 1 O=Amazon
+# Label: "Amazon Root CA 1"
+# Serial: 143266978916655856878034712317230054538369994
+# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6
+# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16
+# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e
+-----BEGIN CERTIFICATE-----
+MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF
+ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
+b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL
+MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
+b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj
+ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM
+9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw
+IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6
+VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L
+93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm
+jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA
+A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI
+U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs
+N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv
+o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU
+5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy
+rqXRfboQnoZsG4q5WTP468SQvvG5
+-----END CERTIFICATE-----
+
+# Issuer: CN=Amazon Root CA 2 O=Amazon
+# Subject: CN=Amazon Root CA 2 O=Amazon
+# Label: "Amazon Root CA 2"
+# Serial: 143266982885963551818349160658925006970653239
+# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66
+# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a
+# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF
+ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
+b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL
+MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
+b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK
+gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ
+W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg
+1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K
+8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r
+2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me
+z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR
+8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj
+mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz
+7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6
++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI
+0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB
+Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm
+UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2
+LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS
+k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl
+7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm
+btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl
+urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+
+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63
+n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE
+76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H
+9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT
+4PsJYGw=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Amazon Root CA 3 O=Amazon
+# Subject: CN=Amazon Root CA 3 O=Amazon
+# Label: "Amazon Root CA 3"
+# Serial: 143266986699090766294700635381230934788665930
+# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87
+# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e
+# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4
+-----BEGIN CERTIFICATE-----
+MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5
+MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g
+Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG
+A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg
+Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl
+ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j
+QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr
+ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr
+BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM
+YyRIHN8wfdVoOw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Amazon Root CA 4 O=Amazon
+# Subject: CN=Amazon Root CA 4 O=Amazon
+# Label: "Amazon Root CA 4"
+# Serial: 143266989758080763974105200630763877849284878
+# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd
+# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be
+# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92
+-----BEGIN CERTIFICATE-----
+MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5
+MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g
+Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG
+A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg
+Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi
+9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk
+M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB
+MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw
+CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW
+1KyLa2tJElMzrdfkviT8tQp21KW8EA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A.
+# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A.
+# Label: "LuxTrust Global Root 2"
+# Serial: 59914338225734147123941058376788110305822489521
+# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c
+# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f
+# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5
+-----BEGIN CERTIFICATE-----
+MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQEL
+BQAwRjELMAkGA1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNV
+BAMMFkx1eFRydXN0IEdsb2JhbCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUw
+MzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEWMBQGA1UECgwNTHV4VHJ1c3QgUy5B
+LjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCCAiIwDQYJKoZIhvcN
+AQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wmKb3F
+ibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTem
+hfY7RBi2xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1
+EMShduxq3sVs35a0VkBCwGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsn
+Xpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4
+zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkmFRseTJIpgp7VkoGSQXAZ
+96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niFwpN6cj5m
+j5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4g
+DEa/a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+
+8kPREd8vZS9kzl8UubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2j
+X5t/Lax5Gw5CMZdjpPuKadUiDTSQMC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmH
+hFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGByuB
+KwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5Lmx1eHRydXN0
+Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT
++Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQEL
+BQADggIBAGoZFO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9
+BzZAcg4atmpZ1gDlaCDdLnINH2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTO
+jFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW7MM3LGVYvlcAGvI1+ut7MV3CwRI9
+loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIuZY+kt9J/Z93I055c
+qqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWAVWe+
+2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/
+JEAdemrRTxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKre
+zrnK+T+Tb/mjuuqlPpmt/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQf
+LSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+
+x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31IiyBMz2TWuJdGsE7RKlY6
+oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr
+-----END CERTIFICATE-----
+
+# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM
+# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM
+# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1"
+# Serial: 1
+# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49
+# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca
+# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16
+-----BEGIN CERTIFICATE-----
+MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx
+GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp
+bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w
+KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0
+BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy
+dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG
+EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll
+IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU
+QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT
+TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg
+LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7
+a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr
+LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr
+N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X
+YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/
+iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f
+AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH
+V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL
+BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh
+AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf
+IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4
+lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c
+8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf
+lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD.
+# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD.
+# Label: "GDCA TrustAUTH R5 ROOT"
+# Serial: 9009899650740120186
+# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4
+# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4
+# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93
+-----BEGIN CERTIFICATE-----
+MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE
+BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ
+IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0
+MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV
+BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w
+HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj
+Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj
+TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u
+KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj
+qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm
+MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12
+ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP
+zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk
+L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC
+jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA
+HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC
+AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg
+p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm
+DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5
+COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry
+L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf
+JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg
+IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io
+2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV
+09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ
+XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq
+T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe
+MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==
+-----END CERTIFICATE-----
+
+# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Label: "TrustCor RootCert CA-1"
+# Serial: 15752444095811006489
+# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45
+# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a
+# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD
+VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk
+MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
+cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y
+IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB
+pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h
+IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG
+A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU
+cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid
+RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V
+seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme
+9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV
+EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW
+hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/
+DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw
+DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD
+ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I
+/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf
+ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ
+yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts
+L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN
+zl/HHk484IkzlQsPpTLWPFp5LBk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Label: "TrustCor RootCert CA-2"
+# Serial: 2711694510199101698
+# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64
+# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0
+# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65
+-----BEGIN CERTIFICATE-----
+MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV
+BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw
+IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy
+dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig
+Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk
+MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg
+Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD
+VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy
+dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+
+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq
+1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp
+2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK
+DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape
+az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF
+3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88
+oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM
+g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3
+mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh
+8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd
+BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U
+nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw
+DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX
+dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+
+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL
+/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX
+CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa
+ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW
+2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7
+N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3
+Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB
+As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp
+5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu
+1uwJ
+-----END CERTIFICATE-----
+
+# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
+# Label: "TrustCor ECA-1"
+# Serial: 9548242946988625984
+# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c
+# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd
+# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD
+VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk
+MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
+cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y
+IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV
+BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw
+IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy
+dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig
+RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb
+3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA
+BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5
+3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou
+owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/
+wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF
+ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf
+BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/
+MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv
+civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2
+AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F
+hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50
+soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI
+WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi
+tJ/X5g==
+-----END CERTIFICATE-----
+
+# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation
+# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation
+# Label: "SSL.com Root Certification Authority RSA"
+# Serial: 8875640296558310041
+# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29
+# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb
+# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69
+-----BEGIN CERTIFICATE-----
+MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE
+BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK
+DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz
+OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv
+dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv
+bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN
+AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R
+xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX
+qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC
+C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3
+6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh
+/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF
+YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E
+JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc
+US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8
+ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm
++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi
+M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV
+HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G
+A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV
+cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc
+Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs
+PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/
+q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0
+cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr
+a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I
+H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y
+K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu
+nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf
+oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY
+Ic2wBlX7Jz9TkHCpBB5XJ7k=
+-----END CERTIFICATE-----
+
+# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation
+# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation
+# Label: "SSL.com Root Certification Authority ECC"
+# Serial: 8495723813297216424
+# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e
+# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a
+# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65
+-----BEGIN CERTIFICATE-----
+MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC
+VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T
+U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0
+aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz
+WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0
+b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS
+b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB
+BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI
+7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg
+CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud
+EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD
+VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T
+kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+
+gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl
+-----END CERTIFICATE-----
+
+# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation
+# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation
+# Label: "SSL.com EV Root Certification Authority RSA R2"
+# Serial: 6248227494352943350
+# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95
+# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a
+# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c
+-----BEGIN CERTIFICATE-----
+MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV
+BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE
+CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy
+dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy
+MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G
+A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD
+DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq
+M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf
+OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa
+4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9
+HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR
+aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA
+b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ
+Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV
+PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO
+pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu
+UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY
+MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
+HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4
+9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW
+s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5
+Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg
+cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM
+79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz
+/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt
+ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm
+Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK
+QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ
+w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi
+S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07
+mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==
+-----END CERTIFICATE-----
+
+# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation
+# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation
+# Label: "SSL.com EV Root Certification Authority ECC"
+# Serial: 3182246526754555285
+# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90
+# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d
+# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8
+-----BEGIN CERTIFICATE-----
+MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC
+VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T
+U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx
+NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv
+dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv
+bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49
+AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA
+VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku
+WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP
+MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX
+5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ
+ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg
+h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==
+-----END CERTIFICATE-----
diff --git a/.venv/lib/python3.12/site-packages/botocore/client.py b/.venv/lib/python3.12/site-packages/botocore/client.py
new file mode 100644
index 00000000..05d9b25c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/client.py
@@ -0,0 +1,1393 @@
+# Copyright 2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import logging
+
+from botocore import waiter, xform_name
+from botocore.args import ClientArgsCreator
+from botocore.auth import AUTH_TYPE_MAPS, resolve_auth_type
+from botocore.awsrequest import prepare_request_dict
+from botocore.compress import maybe_compress_request
+from botocore.config import Config
+from botocore.context import with_current_context
+from botocore.credentials import RefreshableCredentials
+from botocore.discovery import (
+ EndpointDiscoveryHandler,
+ EndpointDiscoveryManager,
+ block_endpoint_discovery_required_operations,
+)
+from botocore.docs.docstring import ClientMethodDocstring, PaginatorDocstring
+from botocore.exceptions import (
+ DataNotFoundError,
+ InvalidEndpointDiscoveryConfigurationError,
+ OperationNotPageableError,
+ UnknownServiceError,
+ UnknownSignatureVersionError,
+)
+from botocore.history import get_global_history_recorder
+from botocore.hooks import first_non_none_response
+from botocore.httpchecksum import (
+ apply_request_checksum,
+ resolve_checksum_context,
+)
+from botocore.model import ServiceModel
+from botocore.paginate import Paginator
+from botocore.retries import adaptive, standard
+from botocore.useragent import UserAgentString
+from botocore.utils import (
+ CachedProperty,
+ EventbridgeSignerSetter,
+ S3ControlArnParamHandlerv2,
+ S3ExpressIdentityResolver,
+ S3RegionRedirectorv2,
+ ensure_boolean,
+ get_service_module_name,
+)
+
+# Keep these imported. There's pre-existing code that uses:
+# "from botocore.client import UNSIGNED"
+# "from botocore.client import ClientError"
+# etc.
+from botocore.exceptions import ClientError # noqa
+from botocore.utils import S3ArnParamHandler # noqa
+from botocore.utils import S3ControlArnParamHandler # noqa
+from botocore.utils import S3ControlEndpointSetter # noqa
+from botocore.utils import S3EndpointSetter # noqa
+from botocore.utils import S3RegionRedirector # noqa
+from botocore import UNSIGNED # noqa
+
+
+_LEGACY_SIGNATURE_VERSIONS = frozenset(
+ (
+ 'v2',
+ 'v3',
+ 'v3https',
+ 'v4',
+ 's3',
+ 's3v4',
+ )
+)
+
+
+logger = logging.getLogger(__name__)
+history_recorder = get_global_history_recorder()
+
+
+class ClientCreator:
+ """Creates client objects for a service."""
+
+ def __init__(
+ self,
+ loader,
+ endpoint_resolver,
+ user_agent,
+ event_emitter,
+ retry_handler_factory,
+ retry_config_translator,
+ response_parser_factory=None,
+ exceptions_factory=None,
+ config_store=None,
+ user_agent_creator=None,
+ ):
+ self._loader = loader
+ self._endpoint_resolver = endpoint_resolver
+ self._user_agent = user_agent
+ self._event_emitter = event_emitter
+ self._retry_handler_factory = retry_handler_factory
+ self._retry_config_translator = retry_config_translator
+ self._response_parser_factory = response_parser_factory
+ self._exceptions_factory = exceptions_factory
+ # TODO: Migrate things away from scoped_config in favor of the
+ # config_store. The config store can pull things from both the scoped
+ # config and environment variables (and potentially more in the
+ # future).
+ self._config_store = config_store
+ self._user_agent_creator = user_agent_creator
+
+ def create_client(
+ self,
+ service_name,
+ region_name,
+ is_secure=True,
+ endpoint_url=None,
+ verify=None,
+ credentials=None,
+ scoped_config=None,
+ api_version=None,
+ client_config=None,
+ auth_token=None,
+ ):
+ responses = self._event_emitter.emit(
+ 'choose-service-name', service_name=service_name
+ )
+ service_name = first_non_none_response(responses, default=service_name)
+ service_model = self._load_service_model(service_name, api_version)
+ try:
+ endpoints_ruleset_data = self._load_service_endpoints_ruleset(
+ service_name, api_version
+ )
+ partition_data = self._loader.load_data('partitions')
+ except UnknownServiceError:
+ endpoints_ruleset_data = None
+ partition_data = None
+ logger.info(
+ 'No endpoints ruleset found for service %s, falling back to '
+ 'legacy endpoint routing.',
+ service_name,
+ )
+
+ cls = self._create_client_class(service_name, service_model)
+ region_name, client_config = self._normalize_fips_region(
+ region_name, client_config
+ )
+ if auth := service_model.metadata.get('auth'):
+ service_signature_version = resolve_auth_type(auth)
+ else:
+ service_signature_version = service_model.metadata.get(
+ 'signatureVersion'
+ )
+ endpoint_bridge = ClientEndpointBridge(
+ self._endpoint_resolver,
+ scoped_config,
+ client_config,
+ service_signing_name=service_model.metadata.get('signingName'),
+ config_store=self._config_store,
+ service_signature_version=service_signature_version,
+ )
+ client_args = self._get_client_args(
+ service_model,
+ region_name,
+ is_secure,
+ endpoint_url,
+ verify,
+ credentials,
+ scoped_config,
+ client_config,
+ endpoint_bridge,
+ auth_token,
+ endpoints_ruleset_data,
+ partition_data,
+ )
+ service_client = cls(**client_args)
+ self._register_retries(service_client)
+ self._register_s3_events(
+ client=service_client,
+ endpoint_bridge=None,
+ endpoint_url=None,
+ client_config=client_config,
+ scoped_config=scoped_config,
+ )
+ self._register_s3express_events(client=service_client)
+ self._register_s3_control_events(client=service_client)
+ self._register_endpoint_discovery(
+ service_client, endpoint_url, client_config
+ )
+ return service_client
+
+ def create_client_class(self, service_name, api_version=None):
+ service_model = self._load_service_model(service_name, api_version)
+ return self._create_client_class(service_name, service_model)
+
+ def _create_client_class(self, service_name, service_model):
+ class_attributes = self._create_methods(service_model)
+ py_name_to_operation_name = self._create_name_mapping(service_model)
+ class_attributes['_PY_TO_OP_NAME'] = py_name_to_operation_name
+ bases = [BaseClient]
+ service_id = service_model.service_id.hyphenize()
+ self._event_emitter.emit(
+ f'creating-client-class.{service_id}',
+ class_attributes=class_attributes,
+ base_classes=bases,
+ )
+ class_name = get_service_module_name(service_model)
+ cls = type(str(class_name), tuple(bases), class_attributes)
+ return cls
+
+ def _normalize_fips_region(self, region_name, client_config):
+ if region_name is not None:
+ normalized_region_name = region_name.replace('fips-', '').replace(
+ '-fips', ''
+ )
+ # If region has been transformed then set flag
+ if normalized_region_name != region_name:
+ config_use_fips_endpoint = Config(use_fips_endpoint=True)
+ if client_config:
+ # Keeping endpoint setting client specific
+ client_config = client_config.merge(
+ config_use_fips_endpoint
+ )
+ else:
+ client_config = config_use_fips_endpoint
+ logger.warning(
+ f'transforming region from {region_name} to '
+ f'{normalized_region_name} and setting '
+ 'use_fips_endpoint to true. client should not '
+ 'be configured with a fips psuedo region.'
+ )
+ region_name = normalized_region_name
+ return region_name, client_config
+
+ def _load_service_model(self, service_name, api_version=None):
+ json_model = self._loader.load_service_model(
+ service_name, 'service-2', api_version=api_version
+ )
+ service_model = ServiceModel(json_model, service_name=service_name)
+ return service_model
+
+ def _load_service_endpoints_ruleset(self, service_name, api_version=None):
+ return self._loader.load_service_model(
+ service_name, 'endpoint-rule-set-1', api_version=api_version
+ )
+
+ def _register_retries(self, client):
+ retry_mode = client.meta.config.retries['mode']
+ if retry_mode == 'standard':
+ self._register_v2_standard_retries(client)
+ elif retry_mode == 'adaptive':
+ self._register_v2_standard_retries(client)
+ self._register_v2_adaptive_retries(client)
+ elif retry_mode == 'legacy':
+ self._register_legacy_retries(client)
+
+ def _register_v2_standard_retries(self, client):
+ max_attempts = client.meta.config.retries.get('total_max_attempts')
+ kwargs = {'client': client}
+ if max_attempts is not None:
+ kwargs['max_attempts'] = max_attempts
+ standard.register_retry_handler(**kwargs)
+
+ def _register_v2_adaptive_retries(self, client):
+ adaptive.register_retry_handler(client)
+
+ def _register_legacy_retries(self, client):
+ endpoint_prefix = client.meta.service_model.endpoint_prefix
+ service_id = client.meta.service_model.service_id
+ service_event_name = service_id.hyphenize()
+
+ # First, we load the entire retry config for all services,
+ # then pull out just the information we need.
+ original_config = self._loader.load_data('_retry')
+ if not original_config:
+ return
+
+ retries = self._transform_legacy_retries(client.meta.config.retries)
+ retry_config = self._retry_config_translator.build_retry_config(
+ endpoint_prefix,
+ original_config.get('retry', {}),
+ original_config.get('definitions', {}),
+ retries,
+ )
+
+ logger.debug(
+ "Registering retry handlers for service: %s",
+ client.meta.service_model.service_name,
+ )
+ handler = self._retry_handler_factory.create_retry_handler(
+ retry_config, endpoint_prefix
+ )
+ unique_id = f'retry-config-{service_event_name}'
+ client.meta.events.register(
+ f"needs-retry.{service_event_name}", handler, unique_id=unique_id
+ )
+
+ def _transform_legacy_retries(self, retries):
+ if retries is None:
+ return
+ copied_args = retries.copy()
+ if 'total_max_attempts' in retries:
+ copied_args = retries.copy()
+ copied_args['max_attempts'] = (
+ copied_args.pop('total_max_attempts') - 1
+ )
+ return copied_args
+
+ def _get_retry_mode(self, client, config_store):
+ client_retries = client.meta.config.retries
+ if (
+ client_retries is not None
+ and client_retries.get('mode') is not None
+ ):
+ return client_retries['mode']
+ return config_store.get_config_variable('retry_mode') or 'legacy'
+
+ def _register_endpoint_discovery(self, client, endpoint_url, config):
+ if endpoint_url is not None:
+ # Don't register any handlers in the case of a custom endpoint url
+ return
+ # Only attach handlers if the service supports discovery
+ if client.meta.service_model.endpoint_discovery_operation is None:
+ return
+ events = client.meta.events
+ service_id = client.meta.service_model.service_id.hyphenize()
+ enabled = False
+ if config and config.endpoint_discovery_enabled is not None:
+ enabled = config.endpoint_discovery_enabled
+ elif self._config_store:
+ enabled = self._config_store.get_config_variable(
+ 'endpoint_discovery_enabled'
+ )
+
+ enabled = self._normalize_endpoint_discovery_config(enabled)
+ if enabled and self._requires_endpoint_discovery(client, enabled):
+ discover = enabled is True
+ manager = EndpointDiscoveryManager(
+ client, always_discover=discover
+ )
+ handler = EndpointDiscoveryHandler(manager)
+ handler.register(events, service_id)
+ else:
+ events.register(
+ 'before-parameter-build',
+ block_endpoint_discovery_required_operations,
+ )
+
+ def _normalize_endpoint_discovery_config(self, enabled):
+ """Config must either be a boolean-string or string-literal 'auto'"""
+ if isinstance(enabled, str):
+ enabled = enabled.lower().strip()
+ if enabled == 'auto':
+ return enabled
+ elif enabled in ('true', 'false'):
+ return ensure_boolean(enabled)
+ elif isinstance(enabled, bool):
+ return enabled
+
+ raise InvalidEndpointDiscoveryConfigurationError(config_value=enabled)
+
+ def _requires_endpoint_discovery(self, client, enabled):
+ if enabled == "auto":
+ return client.meta.service_model.endpoint_discovery_required
+ return enabled
+
+ def _register_eventbridge_events(
+ self, client, endpoint_bridge, endpoint_url
+ ):
+ if client.meta.service_model.service_name != 'events':
+ return
+ EventbridgeSignerSetter(
+ endpoint_resolver=self._endpoint_resolver,
+ region=client.meta.region_name,
+ endpoint_url=endpoint_url,
+ ).register(client.meta.events)
+
+ def _register_s3express_events(
+ self,
+ client,
+ endpoint_bridge=None,
+ endpoint_url=None,
+ client_config=None,
+ scoped_config=None,
+ ):
+ if client.meta.service_model.service_name != 's3':
+ return
+ S3ExpressIdentityResolver(client, RefreshableCredentials).register()
+
+ def _register_s3_events(
+ self,
+ client,
+ endpoint_bridge,
+ endpoint_url,
+ client_config,
+ scoped_config,
+ ):
+ if client.meta.service_model.service_name != 's3':
+ return
+ S3RegionRedirectorv2(None, client).register()
+ self._set_s3_presign_signature_version(
+ client.meta, client_config, scoped_config
+ )
+ client.meta.events.register(
+ 'before-parameter-build.s3', self._inject_s3_input_parameters
+ )
+
+ def _register_s3_control_events(
+ self,
+ client,
+ endpoint_bridge=None,
+ endpoint_url=None,
+ client_config=None,
+ scoped_config=None,
+ ):
+ if client.meta.service_model.service_name != 's3control':
+ return
+ S3ControlArnParamHandlerv2().register(client.meta.events)
+
+ def _set_s3_presign_signature_version(
+ self, client_meta, client_config, scoped_config
+ ):
+ # This will return the manually configured signature version, or None
+ # if none was manually set. If a customer manually sets the signature
+ # version, we always want to use what they set.
+ provided_signature_version = _get_configured_signature_version(
+ 's3', client_config, scoped_config
+ )
+ if provided_signature_version is not None:
+ return
+
+ # Check to see if the region is a region that we know about. If we
+ # don't know about a region, then we can safely assume it's a new
+ # region that is sigv4 only, since all new S3 regions only allow sigv4.
+ # The only exception is aws-global. This is a pseudo-region for the
+ # global endpoint, we should respect the signature versions it
+ # supports, which includes v2.
+ regions = self._endpoint_resolver.get_available_endpoints(
+ 's3', client_meta.partition
+ )
+ if (
+ client_meta.region_name != 'aws-global'
+ and client_meta.region_name not in regions
+ ):
+ return
+
+ # If it is a region we know about, we want to default to sigv2, so here
+ # we check to see if it is available.
+ endpoint = self._endpoint_resolver.construct_endpoint(
+ 's3', client_meta.region_name
+ )
+ signature_versions = endpoint['signatureVersions']
+ if 's3' not in signature_versions:
+ return
+
+ # We now know that we're in a known region that supports sigv2 and
+ # the customer hasn't set a signature version so we default the
+ # signature version to sigv2.
+ client_meta.events.register(
+ 'choose-signer.s3', self._default_s3_presign_to_sigv2
+ )
+
+ def _inject_s3_input_parameters(self, params, context, **kwargs):
+ context['input_params'] = {}
+ inject_parameters = ('Bucket', 'Delete', 'Key', 'Prefix')
+ for inject_parameter in inject_parameters:
+ if inject_parameter in params:
+ context['input_params'][inject_parameter] = params[
+ inject_parameter
+ ]
+
+ def _default_s3_presign_to_sigv2(self, signature_version, **kwargs):
+ """
+ Returns the 's3' (sigv2) signer if presigning an s3 request. This is
+ intended to be used to set the default signature version for the signer
+ to sigv2. Situations where an asymmetric signature is required are the
+ exception, for example MRAP needs v4a.
+
+ :type signature_version: str
+ :param signature_version: The current client signature version.
+
+ :type signing_name: str
+ :param signing_name: The signing name of the service.
+
+ :return: 's3' if the request is an s3 presign request, None otherwise
+ """
+ if signature_version.startswith('v4a'):
+ return
+
+ if signature_version.startswith('v4-s3express'):
+ return signature_version
+
+ for suffix in ['-query', '-presign-post']:
+ if signature_version.endswith(suffix):
+ return f's3{suffix}'
+
+ def _get_client_args(
+ self,
+ service_model,
+ region_name,
+ is_secure,
+ endpoint_url,
+ verify,
+ credentials,
+ scoped_config,
+ client_config,
+ endpoint_bridge,
+ auth_token,
+ endpoints_ruleset_data,
+ partition_data,
+ ):
+ args_creator = ClientArgsCreator(
+ self._event_emitter,
+ self._user_agent,
+ self._response_parser_factory,
+ self._loader,
+ self._exceptions_factory,
+ config_store=self._config_store,
+ user_agent_creator=self._user_agent_creator,
+ )
+ return args_creator.get_client_args(
+ service_model,
+ region_name,
+ is_secure,
+ endpoint_url,
+ verify,
+ credentials,
+ scoped_config,
+ client_config,
+ endpoint_bridge,
+ auth_token,
+ endpoints_ruleset_data,
+ partition_data,
+ )
+
+ def _create_methods(self, service_model):
+ op_dict = {}
+ for operation_name in service_model.operation_names:
+ py_operation_name = xform_name(operation_name)
+ op_dict[py_operation_name] = self._create_api_method(
+ py_operation_name, operation_name, service_model
+ )
+ return op_dict
+
+ def _create_name_mapping(self, service_model):
+ # py_name -> OperationName, for every operation available
+ # for a service.
+ mapping = {}
+ for operation_name in service_model.operation_names:
+ py_operation_name = xform_name(operation_name)
+ mapping[py_operation_name] = operation_name
+ return mapping
+
+ def _create_api_method(
+ self, py_operation_name, operation_name, service_model
+ ):
+ def _api_call(self, *args, **kwargs):
+ # We're accepting *args so that we can give a more helpful
+ # error message than TypeError: _api_call takes exactly
+ # 1 argument.
+ if args:
+ raise TypeError(
+ f"{py_operation_name}() only accepts keyword arguments."
+ )
+ # The "self" in this scope is referring to the BaseClient.
+ return self._make_api_call(operation_name, kwargs)
+
+ _api_call.__name__ = str(py_operation_name)
+
+ # Add the docstring to the client method
+ operation_model = service_model.operation_model(operation_name)
+ docstring = ClientMethodDocstring(
+ operation_model=operation_model,
+ method_name=operation_name,
+ event_emitter=self._event_emitter,
+ method_description=operation_model.documentation,
+ example_prefix=f'response = client.{py_operation_name}',
+ include_signature=False,
+ )
+ _api_call.__doc__ = docstring
+ return _api_call
+
+
+class ClientEndpointBridge:
+ """Bridges endpoint data and client creation
+
+ This class handles taking out the relevant arguments from the endpoint
+ resolver and determining which values to use, taking into account any
+ client configuration options and scope configuration options.
+
+ This class also handles determining what, if any, region to use if no
+ explicit region setting is provided. For example, Amazon S3 client will
+ utilize "us-east-1" by default if no region can be resolved."""
+
+ DEFAULT_ENDPOINT = '{service}.{region}.amazonaws.com'
+ _DUALSTACK_CUSTOMIZED_SERVICES = ['s3', 's3-control']
+
+ def __init__(
+ self,
+ endpoint_resolver,
+ scoped_config=None,
+ client_config=None,
+ default_endpoint=None,
+ service_signing_name=None,
+ config_store=None,
+ service_signature_version=None,
+ ):
+ self.service_signing_name = service_signing_name
+ self.endpoint_resolver = endpoint_resolver
+ self.scoped_config = scoped_config
+ self.client_config = client_config
+ self.default_endpoint = default_endpoint or self.DEFAULT_ENDPOINT
+ self.config_store = config_store
+ self.service_signature_version = service_signature_version
+
+ def resolve(
+ self, service_name, region_name=None, endpoint_url=None, is_secure=True
+ ):
+ region_name = self._check_default_region(service_name, region_name)
+ use_dualstack_endpoint = self._resolve_use_dualstack_endpoint(
+ service_name
+ )
+ use_fips_endpoint = self._resolve_endpoint_variant_config_var(
+ 'use_fips_endpoint'
+ )
+ resolved = self.endpoint_resolver.construct_endpoint(
+ service_name,
+ region_name,
+ use_dualstack_endpoint=use_dualstack_endpoint,
+ use_fips_endpoint=use_fips_endpoint,
+ )
+
+ # If we can't resolve the region, we'll attempt to get a global
+ # endpoint for non-regionalized services (iam, route53, etc)
+ if not resolved:
+ # TODO: fallback partition_name should be configurable in the
+ # future for users to define as needed.
+ resolved = self.endpoint_resolver.construct_endpoint(
+ service_name,
+ region_name,
+ partition_name='aws',
+ use_dualstack_endpoint=use_dualstack_endpoint,
+ use_fips_endpoint=use_fips_endpoint,
+ )
+
+ if resolved:
+ return self._create_endpoint(
+ resolved, service_name, region_name, endpoint_url, is_secure
+ )
+ else:
+ return self._assume_endpoint(
+ service_name, region_name, endpoint_url, is_secure
+ )
+
+ def resolver_uses_builtin_data(self):
+ return self.endpoint_resolver.uses_builtin_data
+
+ def _check_default_region(self, service_name, region_name):
+ if region_name is not None:
+ return region_name
+ # Use the client_config region if no explicit region was provided.
+ if self.client_config and self.client_config.region_name is not None:
+ return self.client_config.region_name
+
+ def _create_endpoint(
+ self, resolved, service_name, region_name, endpoint_url, is_secure
+ ):
+ region_name, signing_region = self._pick_region_values(
+ resolved, region_name, endpoint_url
+ )
+ if endpoint_url is None:
+ endpoint_url = self._make_url(
+ resolved.get('hostname'),
+ is_secure,
+ resolved.get('protocols', []),
+ )
+ signature_version = self._resolve_signature_version(
+ service_name, resolved
+ )
+ signing_name = self._resolve_signing_name(service_name, resolved)
+ return self._create_result(
+ service_name=service_name,
+ region_name=region_name,
+ signing_region=signing_region,
+ signing_name=signing_name,
+ endpoint_url=endpoint_url,
+ metadata=resolved,
+ signature_version=signature_version,
+ )
+
+ def _resolve_endpoint_variant_config_var(self, config_var):
+ client_config = self.client_config
+ config_val = False
+
+ # Client configuration arg has precedence
+ if client_config and getattr(client_config, config_var) is not None:
+ return getattr(client_config, config_var)
+ elif self.config_store is not None:
+ # Check config store
+ config_val = self.config_store.get_config_variable(config_var)
+ return config_val
+
+ def _resolve_use_dualstack_endpoint(self, service_name):
+ s3_dualstack_mode = self._is_s3_dualstack_mode(service_name)
+ if s3_dualstack_mode is not None:
+ return s3_dualstack_mode
+ return self._resolve_endpoint_variant_config_var(
+ 'use_dualstack_endpoint'
+ )
+
+ def _is_s3_dualstack_mode(self, service_name):
+ if service_name not in self._DUALSTACK_CUSTOMIZED_SERVICES:
+ return None
+ # TODO: This normalization logic is duplicated from the
+ # ClientArgsCreator class. Consolidate everything to
+ # ClientArgsCreator. _resolve_signature_version also has similarly
+ # duplicated logic.
+ client_config = self.client_config
+ if (
+ client_config is not None
+ and client_config.s3 is not None
+ and 'use_dualstack_endpoint' in client_config.s3
+ ):
+ # Client config trumps scoped config.
+ return client_config.s3['use_dualstack_endpoint']
+ if self.scoped_config is not None:
+ enabled = self.scoped_config.get('s3', {}).get(
+ 'use_dualstack_endpoint'
+ )
+ if enabled in [True, 'True', 'true']:
+ return True
+
+ def _assume_endpoint(
+ self, service_name, region_name, endpoint_url, is_secure
+ ):
+ if endpoint_url is None:
+ # Expand the default hostname URI template.
+ hostname = self.default_endpoint.format(
+ service=service_name, region=region_name
+ )
+ endpoint_url = self._make_url(
+ hostname, is_secure, ['http', 'https']
+ )
+ logger.debug(
+ f'Assuming an endpoint for {service_name}, {region_name}: {endpoint_url}'
+ )
+ # We still want to allow the user to provide an explicit version.
+ signature_version = self._resolve_signature_version(
+ service_name, {'signatureVersions': ['v4']}
+ )
+ signing_name = self._resolve_signing_name(service_name, resolved={})
+ return self._create_result(
+ service_name=service_name,
+ region_name=region_name,
+ signing_region=region_name,
+ signing_name=signing_name,
+ signature_version=signature_version,
+ endpoint_url=endpoint_url,
+ metadata={},
+ )
+
+ def _create_result(
+ self,
+ service_name,
+ region_name,
+ signing_region,
+ signing_name,
+ endpoint_url,
+ signature_version,
+ metadata,
+ ):
+ return {
+ 'service_name': service_name,
+ 'region_name': region_name,
+ 'signing_region': signing_region,
+ 'signing_name': signing_name,
+ 'endpoint_url': endpoint_url,
+ 'signature_version': signature_version,
+ 'metadata': metadata,
+ }
+
+ def _make_url(self, hostname, is_secure, supported_protocols):
+ if is_secure and 'https' in supported_protocols:
+ scheme = 'https'
+ else:
+ scheme = 'http'
+ return f'{scheme}://{hostname}'
+
+ def _resolve_signing_name(self, service_name, resolved):
+ # CredentialScope overrides everything else.
+ if (
+ 'credentialScope' in resolved
+ and 'service' in resolved['credentialScope']
+ ):
+ return resolved['credentialScope']['service']
+ # Use the signingName from the model if present.
+ if self.service_signing_name:
+ return self.service_signing_name
+ # Just assume is the same as the service name.
+ return service_name
+
+ def _pick_region_values(self, resolved, region_name, endpoint_url):
+ signing_region = region_name
+ if endpoint_url is None:
+ # Do not use the region name or signing name from the resolved
+ # endpoint if the user explicitly provides an endpoint_url. This
+ # would happen if we resolve to an endpoint where the service has
+ # a "defaults" section that overrides all endpoint with a single
+ # hostname and credentialScope. This has been the case historically
+ # for how STS has worked. The only way to resolve an STS endpoint
+ # was to provide a region_name and an endpoint_url. In that case,
+ # we would still resolve an endpoint, but we would not use the
+ # resolved endpointName or signingRegion because we want to allow
+ # custom endpoints.
+ region_name = resolved['endpointName']
+ signing_region = region_name
+ if (
+ 'credentialScope' in resolved
+ and 'region' in resolved['credentialScope']
+ ):
+ signing_region = resolved['credentialScope']['region']
+ return region_name, signing_region
+
+ def _resolve_signature_version(self, service_name, resolved):
+ configured_version = _get_configured_signature_version(
+ service_name, self.client_config, self.scoped_config
+ )
+ if configured_version is not None:
+ return configured_version
+
+ potential_versions = resolved.get('signatureVersions', [])
+ if (
+ self.service_signature_version is not None
+ and self.service_signature_version
+ not in _LEGACY_SIGNATURE_VERSIONS
+ ):
+ # Prefer the service model as most specific
+ # source of truth for new signature versions.
+ potential_versions = [self.service_signature_version]
+
+ # Pick a signature version from the endpoint metadata if present.
+ if 'signatureVersions' in resolved:
+ if service_name == 's3':
+ return 's3v4'
+ if 'v4' in potential_versions:
+ return 'v4'
+ # Now just iterate over the signature versions in order until we
+ # find the first one that is known to Botocore.
+ for known in potential_versions:
+ if known in AUTH_TYPE_MAPS:
+ return known
+ raise UnknownSignatureVersionError(
+ signature_version=potential_versions
+ )
+
+
+class BaseClient:
+ # This is actually reassigned with the py->op_name mapping
+ # when the client creator creates the subclass. This value is used
+ # because calls such as client.get_paginator('list_objects') use the
+ # snake_case name, but we need to know the ListObjects form.
+ # xform_name() does the ListObjects->list_objects conversion, but
+ # we need the reverse mapping here.
+ _PY_TO_OP_NAME = {}
+
+ def __init__(
+ self,
+ serializer,
+ endpoint,
+ response_parser,
+ event_emitter,
+ request_signer,
+ service_model,
+ loader,
+ client_config,
+ partition,
+ exceptions_factory,
+ endpoint_ruleset_resolver=None,
+ user_agent_creator=None,
+ ):
+ self._serializer = serializer
+ self._endpoint = endpoint
+ self._ruleset_resolver = endpoint_ruleset_resolver
+ self._response_parser = response_parser
+ self._request_signer = request_signer
+ self._cache = {}
+ self._loader = loader
+ self._client_config = client_config
+ self.meta = ClientMeta(
+ event_emitter,
+ self._client_config,
+ endpoint.host,
+ service_model,
+ self._PY_TO_OP_NAME,
+ partition,
+ )
+ self._exceptions_factory = exceptions_factory
+ self._exceptions = None
+ self._user_agent_creator = user_agent_creator
+ if self._user_agent_creator is None:
+ self._user_agent_creator = (
+ UserAgentString.from_environment().with_client_config(
+ self._client_config
+ )
+ )
+ self._register_handlers()
+
+ def __getattr__(self, item):
+ service_id = self._service_model.service_id.hyphenize()
+ event_name = f'getattr.{service_id}.{item}'
+
+ handler, event_response = self.meta.events.emit_until_response(
+ event_name, client=self
+ )
+
+ if event_response is not None:
+ return event_response
+
+ raise AttributeError(
+ f"'{self.__class__.__name__}' object has no attribute '{item}'"
+ )
+
+ def close(self):
+ """Closes underlying endpoint connections."""
+ self._endpoint.close()
+
+ def _register_handlers(self):
+ # Register the handler required to sign requests.
+ service_id = self.meta.service_model.service_id.hyphenize()
+ self.meta.events.register(
+ f"request-created.{service_id}", self._request_signer.handler
+ )
+ # Rebuild user agent string right before request is sent
+ # to ensure all registered features are included.
+ self.meta.events.register_last(
+ f"request-created.{service_id}",
+ self._user_agent_creator.rebuild_and_replace_user_agent_handler,
+ )
+
+ @property
+ def _service_model(self):
+ return self.meta.service_model
+
+ @with_current_context()
+ def _make_api_call(self, operation_name, api_params):
+ operation_model = self._service_model.operation_model(operation_name)
+ service_name = self._service_model.service_name
+ history_recorder.record(
+ 'API_CALL',
+ {
+ 'service': service_name,
+ 'operation': operation_name,
+ 'params': api_params,
+ },
+ )
+ if operation_model.deprecated:
+ logger.debug(
+ 'Warning: %s.%s() is deprecated', service_name, operation_name
+ )
+ request_context = {
+ 'client_region': self.meta.region_name,
+ 'client_config': self.meta.config,
+ 'has_streaming_input': operation_model.has_streaming_input,
+ 'auth_type': operation_model.resolved_auth_type,
+ 'unsigned_payload': operation_model.unsigned_payload,
+ }
+
+ api_params = self._emit_api_params(
+ api_params=api_params,
+ operation_model=operation_model,
+ context=request_context,
+ )
+ (
+ endpoint_url,
+ additional_headers,
+ properties,
+ ) = self._resolve_endpoint_ruleset(
+ operation_model, api_params, request_context
+ )
+ if properties:
+ # Pass arbitrary endpoint info with the Request
+ # for use during construction.
+ request_context['endpoint_properties'] = properties
+ request_dict = self._convert_to_request_dict(
+ api_params=api_params,
+ operation_model=operation_model,
+ endpoint_url=endpoint_url,
+ context=request_context,
+ headers=additional_headers,
+ )
+ resolve_checksum_context(request_dict, operation_model, api_params)
+
+ service_id = self._service_model.service_id.hyphenize()
+ handler, event_response = self.meta.events.emit_until_response(
+ f'before-call.{service_id}.{operation_name}',
+ model=operation_model,
+ params=request_dict,
+ request_signer=self._request_signer,
+ context=request_context,
+ )
+
+ if event_response is not None:
+ http, parsed_response = event_response
+ else:
+ maybe_compress_request(
+ self.meta.config, request_dict, operation_model
+ )
+ apply_request_checksum(request_dict)
+ http, parsed_response = self._make_request(
+ operation_model, request_dict, request_context
+ )
+
+ self.meta.events.emit(
+ f'after-call.{service_id}.{operation_name}',
+ http_response=http,
+ parsed=parsed_response,
+ model=operation_model,
+ context=request_context,
+ )
+
+ if http.status_code >= 300:
+ error_info = parsed_response.get("Error", {})
+ error_code = error_info.get("QueryErrorCode") or error_info.get(
+ "Code"
+ )
+ error_class = self.exceptions.from_code(error_code)
+ raise error_class(parsed_response, operation_name)
+ else:
+ return parsed_response
+
+ def _make_request(self, operation_model, request_dict, request_context):
+ try:
+ return self._endpoint.make_request(operation_model, request_dict)
+ except Exception as e:
+ self.meta.events.emit(
+ f'after-call-error.{self._service_model.service_id.hyphenize()}.{operation_model.name}',
+ exception=e,
+ context=request_context,
+ )
+ raise
+
+ def _convert_to_request_dict(
+ self,
+ api_params,
+ operation_model,
+ endpoint_url,
+ context=None,
+ headers=None,
+ set_user_agent_header=True,
+ ):
+ request_dict = self._serializer.serialize_to_request(
+ api_params, operation_model
+ )
+ if not self._client_config.inject_host_prefix:
+ request_dict.pop('host_prefix', None)
+ if headers is not None:
+ request_dict['headers'].update(headers)
+ if set_user_agent_header:
+ user_agent = self._user_agent_creator.to_string()
+ else:
+ user_agent = None
+ prepare_request_dict(
+ request_dict,
+ endpoint_url=endpoint_url,
+ user_agent=user_agent,
+ context=context,
+ )
+ return request_dict
+
+ def _emit_api_params(self, api_params, operation_model, context):
+ # Given the API params provided by the user and the operation_model
+ # we can serialize the request to a request_dict.
+ operation_name = operation_model.name
+
+ # Emit an event that allows users to modify the parameters at the
+ # beginning of the method. It allows handlers to modify existing
+ # parameters or return a new set of parameters to use.
+ service_id = self._service_model.service_id.hyphenize()
+ responses = self.meta.events.emit(
+ f'provide-client-params.{service_id}.{operation_name}',
+ params=api_params,
+ model=operation_model,
+ context=context,
+ )
+ api_params = first_non_none_response(responses, default=api_params)
+
+ self.meta.events.emit(
+ f'before-parameter-build.{service_id}.{operation_name}',
+ params=api_params,
+ model=operation_model,
+ context=context,
+ )
+ return api_params
+
+ def _resolve_endpoint_ruleset(
+ self,
+ operation_model,
+ params,
+ request_context,
+ ignore_signing_region=False,
+ ):
+ """Returns endpoint URL and list of additional headers returned from
+ EndpointRulesetResolver for the given operation and params. If the
+ ruleset resolver is not available, for example because the service has
+ no endpoints ruleset file, the legacy endpoint resolver's value is
+ returned.
+
+ Use ignore_signing_region for generating presigned URLs or any other
+ situation where the signing region information from the ruleset
+ resolver should be ignored.
+
+ Returns tuple of URL and headers dictionary. Additionally, the
+ request_context dict is modified in place with any signing information
+ returned from the ruleset resolver.
+ """
+ if self._ruleset_resolver is None:
+ endpoint_url = self.meta.endpoint_url
+ additional_headers = {}
+ endpoint_properties = {}
+ else:
+ endpoint_info = self._ruleset_resolver.construct_endpoint(
+ operation_model=operation_model,
+ call_args=params,
+ request_context=request_context,
+ )
+ endpoint_url = endpoint_info.url
+ additional_headers = endpoint_info.headers
+ endpoint_properties = endpoint_info.properties
+ # If authSchemes is present, overwrite default auth type and
+ # signing context derived from service model.
+ auth_schemes = endpoint_info.properties.get('authSchemes')
+ if auth_schemes is not None:
+ auth_info = self._ruleset_resolver.auth_schemes_to_signing_ctx(
+ auth_schemes
+ )
+ auth_type, signing_context = auth_info
+ request_context['auth_type'] = auth_type
+ if 'region' in signing_context and ignore_signing_region:
+ del signing_context['region']
+ if 'signing' in request_context:
+ request_context['signing'].update(signing_context)
+ else:
+ request_context['signing'] = signing_context
+
+ return endpoint_url, additional_headers, endpoint_properties
+
+ def get_paginator(self, operation_name):
+ """Create a paginator for an operation.
+
+ :type operation_name: string
+ :param operation_name: The operation name. This is the same name
+ as the method name on the client. For example, if the
+ method name is ``create_foo``, and you'd normally invoke the
+ operation as ``client.create_foo(**kwargs)``, if the
+ ``create_foo`` operation can be paginated, you can use the
+ call ``client.get_paginator("create_foo")``.
+
+ :raise OperationNotPageableError: Raised if the operation is not
+ pageable. You can use the ``client.can_paginate`` method to
+ check if an operation is pageable.
+
+ :rtype: ``botocore.paginate.Paginator``
+ :return: A paginator object.
+
+ """
+ if not self.can_paginate(operation_name):
+ raise OperationNotPageableError(operation_name=operation_name)
+ else:
+ actual_operation_name = self._PY_TO_OP_NAME[operation_name]
+
+ # Create a new paginate method that will serve as a proxy to
+ # the underlying Paginator.paginate method. This is needed to
+ # attach a docstring to the method.
+ def paginate(self, **kwargs):
+ return Paginator.paginate(self, **kwargs)
+
+ paginator_config = self._cache['page_config'][
+ actual_operation_name
+ ]
+ # Add the docstring for the paginate method.
+ paginate.__doc__ = PaginatorDocstring(
+ paginator_name=actual_operation_name,
+ event_emitter=self.meta.events,
+ service_model=self.meta.service_model,
+ paginator_config=paginator_config,
+ include_signature=False,
+ )
+
+ # Rename the paginator class based on the type of paginator.
+ service_module_name = get_service_module_name(
+ self.meta.service_model
+ )
+ paginator_class_name = (
+ f"{service_module_name}.Paginator.{actual_operation_name}"
+ )
+
+ # Create the new paginator class
+ documented_paginator_cls = type(
+ paginator_class_name, (Paginator,), {'paginate': paginate}
+ )
+
+ operation_model = self._service_model.operation_model(
+ actual_operation_name
+ )
+ paginator = documented_paginator_cls(
+ getattr(self, operation_name),
+ paginator_config,
+ operation_model,
+ )
+ return paginator
+
+ def can_paginate(self, operation_name):
+ """Check if an operation can be paginated.
+
+ :type operation_name: string
+ :param operation_name: The operation name. This is the same name
+ as the method name on the client. For example, if the
+ method name is ``create_foo``, and you'd normally invoke the
+ operation as ``client.create_foo(**kwargs)``, if the
+ ``create_foo`` operation can be paginated, you can use the
+ call ``client.get_paginator("create_foo")``.
+
+ :return: ``True`` if the operation can be paginated,
+ ``False`` otherwise.
+
+ """
+ if 'page_config' not in self._cache:
+ try:
+ page_config = self._loader.load_service_model(
+ self._service_model.service_name,
+ 'paginators-1',
+ self._service_model.api_version,
+ )['pagination']
+ self._cache['page_config'] = page_config
+ except DataNotFoundError:
+ self._cache['page_config'] = {}
+ actual_operation_name = self._PY_TO_OP_NAME[operation_name]
+ return actual_operation_name in self._cache['page_config']
+
+ def _get_waiter_config(self):
+ if 'waiter_config' not in self._cache:
+ try:
+ waiter_config = self._loader.load_service_model(
+ self._service_model.service_name,
+ 'waiters-2',
+ self._service_model.api_version,
+ )
+ self._cache['waiter_config'] = waiter_config
+ except DataNotFoundError:
+ self._cache['waiter_config'] = {}
+ return self._cache['waiter_config']
+
+ def get_waiter(self, waiter_name):
+ """Returns an object that can wait for some condition.
+
+ :type waiter_name: str
+ :param waiter_name: The name of the waiter to get. See the waiters
+ section of the service docs for a list of available waiters.
+
+ :returns: The specified waiter object.
+ :rtype: ``botocore.waiter.Waiter``
+ """
+ config = self._get_waiter_config()
+ if not config:
+ raise ValueError(f"Waiter does not exist: {waiter_name}")
+ model = waiter.WaiterModel(config)
+ mapping = {}
+ for name in model.waiter_names:
+ mapping[xform_name(name)] = name
+ if waiter_name not in mapping:
+ raise ValueError(f"Waiter does not exist: {waiter_name}")
+
+ return waiter.create_waiter_with_client(
+ mapping[waiter_name], model, self
+ )
+
+ @CachedProperty
+ def waiter_names(self):
+ """Returns a list of all available waiters."""
+ config = self._get_waiter_config()
+ if not config:
+ return []
+ model = waiter.WaiterModel(config)
+ # Waiter configs is a dict, we just want the waiter names
+ # which are the keys in the dict.
+ return [xform_name(name) for name in model.waiter_names]
+
+ @property
+ def exceptions(self):
+ if self._exceptions is None:
+ self._exceptions = self._load_exceptions()
+ return self._exceptions
+
+ def _load_exceptions(self):
+ return self._exceptions_factory.create_client_exceptions(
+ self._service_model
+ )
+
+ def _get_credentials(self):
+ """
+ This private interface is subject to abrupt breaking changes, including
+ removal, in any botocore release.
+ """
+ return self._request_signer._credentials
+
+
+class ClientMeta:
+ """Holds additional client methods.
+
+ This class holds additional information for clients. It exists for
+ two reasons:
+
+ * To give advanced functionality to clients
+ * To namespace additional client attributes from the operation
+ names which are mapped to methods at runtime. This avoids
+ ever running into collisions with operation names.
+
+ """
+
+ def __init__(
+ self,
+ events,
+ client_config,
+ endpoint_url,
+ service_model,
+ method_to_api_mapping,
+ partition,
+ ):
+ self.events = events
+ self._client_config = client_config
+ self._endpoint_url = endpoint_url
+ self._service_model = service_model
+ self._method_to_api_mapping = method_to_api_mapping
+ self._partition = partition
+
+ @property
+ def service_model(self):
+ return self._service_model
+
+ @property
+ def region_name(self):
+ return self._client_config.region_name
+
+ @property
+ def endpoint_url(self):
+ return self._endpoint_url
+
+ @property
+ def config(self):
+ return self._client_config
+
+ @property
+ def method_to_api_mapping(self):
+ return self._method_to_api_mapping
+
+ @property
+ def partition(self):
+ return self._partition
+
+
+def _get_configured_signature_version(
+ service_name, client_config, scoped_config
+):
+ """
+ Gets the manually configured signature version.
+
+ :returns: the customer configured signature version, or None if no
+ signature version was configured.
+ """
+ # Client config overrides everything.
+ if client_config and client_config.signature_version is not None:
+ return client_config.signature_version
+
+ # Scoped config overrides picking from the endpoint metadata.
+ if scoped_config is not None:
+ # A given service may have service specific configuration in the
+ # config file, so we need to check there as well.
+ service_config = scoped_config.get(service_name)
+ if service_config is not None and isinstance(service_config, dict):
+ version = service_config.get('signature_version')
+ if version:
+ logger.debug(
+ "Switching signature version for service %s "
+ "to version %s based on config file override.",
+ service_name,
+ version,
+ )
+ return version
+ return None
diff --git a/.venv/lib/python3.12/site-packages/botocore/compat.py b/.venv/lib/python3.12/site-packages/botocore/compat.py
new file mode 100644
index 00000000..7979795a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/compat.py
@@ -0,0 +1,362 @@
+# Copyright 2012-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+
+import copy
+import datetime
+import sys
+import inspect
+import warnings
+import hashlib
+from http.client import HTTPMessage
+import logging
+import shlex
+import re
+import os
+from collections import OrderedDict
+from collections.abc import MutableMapping
+from math import floor
+
+from botocore.vendored import six
+from botocore.exceptions import MD5UnavailableError
+from dateutil.tz import tzlocal
+from urllib3 import exceptions
+
+logger = logging.getLogger(__name__)
+
+
+class HTTPHeaders(HTTPMessage):
+ pass
+
+from urllib.parse import (
+ quote,
+ urlencode,
+ unquote,
+ unquote_plus,
+ urlparse,
+ urlsplit,
+ urlunsplit,
+ urljoin,
+ parse_qsl,
+ parse_qs,
+)
+from http.client import HTTPResponse
+from io import IOBase as _IOBase
+from base64 import encodebytes
+from email.utils import formatdate
+from itertools import zip_longest
+file_type = _IOBase
+zip = zip
+
+# In python3, unquote takes a str() object, url decodes it,
+# then takes the bytestring and decodes it to utf-8.
+unquote_str = unquote_plus
+
+def set_socket_timeout(http_response, timeout):
+ """Set the timeout of the socket from an HTTPResponse.
+
+ :param http_response: An instance of ``httplib.HTTPResponse``
+
+ """
+ http_response._fp.fp.raw._sock.settimeout(timeout)
+
+def accepts_kwargs(func):
+ # In python3.4.1, there's backwards incompatible
+ # changes when using getargspec with functools.partials.
+ return inspect.getfullargspec(func)[2]
+
+def ensure_unicode(s, encoding=None, errors=None):
+ # NOOP in Python 3, because every string is already unicode
+ return s
+
+def ensure_bytes(s, encoding='utf-8', errors='strict'):
+ if isinstance(s, str):
+ return s.encode(encoding, errors)
+ if isinstance(s, bytes):
+ return s
+ raise ValueError(f"Expected str or bytes, received {type(s)}.")
+
+
+try:
+ import xml.etree.cElementTree as ETree
+except ImportError:
+ # cElementTree does not exist from Python3.9+
+ import xml.etree.ElementTree as ETree
+XMLParseError = ETree.ParseError
+import json
+
+
+def filter_ssl_warnings():
+ # Ignore warnings related to SNI as it is not being used in validations.
+ warnings.filterwarnings(
+ 'ignore',
+ message="A true SSLContext object is not available.*",
+ category=exceptions.InsecurePlatformWarning,
+ module=r".*urllib3\.util\.ssl_",
+ )
+
+
+@classmethod
+def from_dict(cls, d):
+ new_instance = cls()
+ for key, value in d.items():
+ new_instance[key] = value
+ return new_instance
+
+
+@classmethod
+def from_pairs(cls, pairs):
+ new_instance = cls()
+ for key, value in pairs:
+ new_instance[key] = value
+ return new_instance
+
+
+HTTPHeaders.from_dict = from_dict
+HTTPHeaders.from_pairs = from_pairs
+
+
+def copy_kwargs(kwargs):
+ """
+ This used to be a compat shim for 2.6 but is now just an alias.
+ """
+ copy_kwargs = copy.copy(kwargs)
+ return copy_kwargs
+
+
+def total_seconds(delta):
+ """
+ Returns the total seconds in a ``datetime.timedelta``.
+
+ This used to be a compat shim for 2.6 but is now just an alias.
+
+ :param delta: The timedelta object
+ :type delta: ``datetime.timedelta``
+ """
+ return delta.total_seconds()
+
+
+# Checks to see if md5 is available on this system. A given system might not
+# have access to it for various reasons, such as FIPS mode being enabled.
+try:
+ hashlib.md5()
+ MD5_AVAILABLE = True
+except (AttributeError, ValueError):
+ MD5_AVAILABLE = False
+
+
+def get_md5(*args, **kwargs):
+ """
+ Attempts to get an md5 hashing object.
+
+ :param args: Args to pass to the MD5 constructor
+ :param kwargs: Key word arguments to pass to the MD5 constructor
+ :return: An MD5 hashing object if available. If it is unavailable, None
+ is returned if raise_error_if_unavailable is set to False.
+ """
+ if MD5_AVAILABLE:
+ return hashlib.md5(*args, **kwargs)
+ else:
+ raise MD5UnavailableError()
+
+
+def compat_shell_split(s, platform=None):
+ if platform is None:
+ platform = sys.platform
+
+ if platform == "win32":
+ return _windows_shell_split(s)
+ else:
+ return shlex.split(s)
+
+
+def _windows_shell_split(s):
+ """Splits up a windows command as the built-in command parser would.
+
+ Windows has potentially bizarre rules depending on where you look. When
+ spawning a process via the Windows C runtime (which is what python does
+ when you call popen) the rules are as follows:
+
+ https://docs.microsoft.com/en-us/cpp/cpp/parsing-cpp-command-line-arguments
+
+ To summarize:
+
+ * Only space and tab are valid delimiters
+ * Double quotes are the only valid quotes
+ * Backslash is interpreted literally unless it is part of a chain that
+ leads up to a double quote. Then the backslashes escape the backslashes,
+ and if there is an odd number the final backslash escapes the quote.
+
+ :param s: The command string to split up into parts.
+ :return: A list of command components.
+ """
+ if not s:
+ return []
+
+ components = []
+ buff = []
+ is_quoted = False
+ num_backslashes = 0
+ for character in s:
+ if character == '\\':
+ # We can't simply append backslashes because we don't know if
+ # they are being used as escape characters or not. Instead we
+ # keep track of how many we've encountered and handle them when
+ # we encounter a different character.
+ num_backslashes += 1
+ elif character == '"':
+ if num_backslashes > 0:
+ # The backslashes are in a chain leading up to a double
+ # quote, so they are escaping each other.
+ buff.append('\\' * int(floor(num_backslashes / 2)))
+ remainder = num_backslashes % 2
+ num_backslashes = 0
+ if remainder == 1:
+ # The number of backslashes is uneven, so they are also
+ # escaping the double quote, so it needs to be added to
+ # the current component buffer.
+ buff.append('"')
+ continue
+
+ # We've encountered a double quote that is not escaped,
+ # so we toggle is_quoted.
+ is_quoted = not is_quoted
+
+ # If there are quotes, then we may want an empty string. To be
+ # safe, we add an empty string to the buffer so that we make
+ # sure it sticks around if there's nothing else between quotes.
+ # If there is other stuff between quotes, the empty string will
+ # disappear during the joining process.
+ buff.append('')
+ elif character in [' ', '\t'] and not is_quoted:
+ # Since the backslashes aren't leading up to a quote, we put in
+ # the exact number of backslashes.
+ if num_backslashes > 0:
+ buff.append('\\' * num_backslashes)
+ num_backslashes = 0
+
+ # Excess whitespace is ignored, so only add the components list
+ # if there is anything in the buffer.
+ if buff:
+ components.append(''.join(buff))
+ buff = []
+ else:
+ # Since the backslashes aren't leading up to a quote, we put in
+ # the exact number of backslashes.
+ if num_backslashes > 0:
+ buff.append('\\' * num_backslashes)
+ num_backslashes = 0
+ buff.append(character)
+
+ # Quotes must be terminated.
+ if is_quoted:
+ raise ValueError(f"No closing quotation in string: {s}")
+
+ # There may be some leftover backslashes, so we need to add them in.
+ # There's no quote so we add the exact number.
+ if num_backslashes > 0:
+ buff.append('\\' * num_backslashes)
+
+ # Add the final component in if there is anything in the buffer.
+ if buff:
+ components.append(''.join(buff))
+
+ return components
+
+
+def get_tzinfo_options():
+ # Due to dateutil/dateutil#197, Windows may fail to parse times in the past
+ # with the system clock. We can alternatively fallback to tzwininfo when
+ # this happens, which will get time info from the Windows registry.
+ if sys.platform == 'win32':
+ from dateutil.tz import tzwinlocal
+
+ return (tzlocal, tzwinlocal)
+ else:
+ return (tzlocal,)
+
+
+# Detect if CRT is available for use
+try:
+ import awscrt.auth
+
+ # Allow user opt-out if needed
+ disabled = os.environ.get('BOTO_DISABLE_CRT', "false")
+ HAS_CRT = not disabled.lower() == 'true'
+except ImportError:
+ HAS_CRT = False
+
+
+def has_minimum_crt_version(minimum_version):
+ """Not intended for use outside botocore."""
+ if not HAS_CRT:
+ return False
+
+ crt_version_str = awscrt.__version__
+ try:
+ crt_version_ints = map(int, crt_version_str.split("."))
+ crt_version_tuple = tuple(crt_version_ints)
+ except (TypeError, ValueError):
+ return False
+
+ return crt_version_tuple >= minimum_version
+
+
+########################################################
+# urllib3 compat backports #
+########################################################
+
+# Vendoring IPv6 validation regex patterns from urllib3
+# https://github.com/urllib3/urllib3/blob/7e856c0/src/urllib3/util/url.py
+IPV4_PAT = r"(?:[0-9]{1,3}\.){3}[0-9]{1,3}"
+IPV4_RE = re.compile("^" + IPV4_PAT + "$")
+HEX_PAT = "[0-9A-Fa-f]{1,4}"
+LS32_PAT = "(?:{hex}:{hex}|{ipv4})".format(hex=HEX_PAT, ipv4=IPV4_PAT)
+_subs = {"hex": HEX_PAT, "ls32": LS32_PAT}
+_variations = [
+ # 6( h16 ":" ) ls32
+ "(?:%(hex)s:){6}%(ls32)s",
+ # "::" 5( h16 ":" ) ls32
+ "::(?:%(hex)s:){5}%(ls32)s",
+ # [ h16 ] "::" 4( h16 ":" ) ls32
+ "(?:%(hex)s)?::(?:%(hex)s:){4}%(ls32)s",
+ # [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
+ "(?:(?:%(hex)s:)?%(hex)s)?::(?:%(hex)s:){3}%(ls32)s",
+ # [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
+ "(?:(?:%(hex)s:){0,2}%(hex)s)?::(?:%(hex)s:){2}%(ls32)s",
+ # [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32
+ "(?:(?:%(hex)s:){0,3}%(hex)s)?::%(hex)s:%(ls32)s",
+ # [ *4( h16 ":" ) h16 ] "::" ls32
+ "(?:(?:%(hex)s:){0,4}%(hex)s)?::%(ls32)s",
+ # [ *5( h16 ":" ) h16 ] "::" h16
+ "(?:(?:%(hex)s:){0,5}%(hex)s)?::%(hex)s",
+ # [ *6( h16 ":" ) h16 ] "::"
+ "(?:(?:%(hex)s:){0,6}%(hex)s)?::",
+]
+
+UNRESERVED_PAT = (
+ r"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._!\-~"
+)
+IPV6_PAT = "(?:" + "|".join([x % _subs for x in _variations]) + ")"
+ZONE_ID_PAT = "(?:%25|%)(?:[" + UNRESERVED_PAT + "]|%[a-fA-F0-9]{2})+"
+IPV6_ADDRZ_PAT = r"\[" + IPV6_PAT + r"(?:" + ZONE_ID_PAT + r")?\]"
+IPV6_ADDRZ_RE = re.compile("^" + IPV6_ADDRZ_PAT + "$")
+
+# These are the characters that are stripped by post-bpo-43882 urlparse().
+UNSAFE_URL_CHARS = frozenset('\t\r\n')
+
+# Detect if gzip is available for use
+try:
+ import gzip
+ HAS_GZIP = True
+except ImportError:
+ HAS_GZIP = False
diff --git a/.venv/lib/python3.12/site-packages/botocore/compress.py b/.venv/lib/python3.12/site-packages/botocore/compress.py
new file mode 100644
index 00000000..1f8577e8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/compress.py
@@ -0,0 +1,126 @@
+# Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+"""
+NOTE: All functions in this module are considered private and are
+subject to abrupt breaking changes. Please do not use them directly.
+
+"""
+
+import io
+import logging
+from gzip import GzipFile
+from gzip import compress as gzip_compress
+
+from botocore.compat import urlencode
+from botocore.utils import determine_content_length
+
+logger = logging.getLogger(__name__)
+
+
+def maybe_compress_request(config, request_dict, operation_model):
+ """Attempt to compress the request body using the modeled encodings."""
+ if _should_compress_request(config, request_dict, operation_model):
+ for encoding in operation_model.request_compression['encodings']:
+ encoder = COMPRESSION_MAPPING.get(encoding)
+ if encoder is not None:
+ logger.debug('Compressing request with %s encoding.', encoding)
+ request_dict['body'] = encoder(request_dict['body'])
+ _set_compression_header(request_dict['headers'], encoding)
+ return
+ else:
+ logger.debug('Unsupported compression encoding: %s', encoding)
+
+
+def _should_compress_request(config, request_dict, operation_model):
+ if (
+ config.disable_request_compression is not True
+ and config.signature_version != 'v2'
+ and operation_model.request_compression is not None
+ ):
+ if not _is_compressible_type(request_dict):
+ body_type = type(request_dict['body'])
+ log_msg = 'Body type %s does not support compression.'
+ logger.debug(log_msg, body_type)
+ return False
+
+ if operation_model.has_streaming_input:
+ streaming_input = operation_model.get_streaming_input()
+ streaming_metadata = streaming_input.metadata
+ return 'requiresLength' not in streaming_metadata
+
+ body_size = _get_body_size(request_dict['body'])
+ min_size = config.request_min_compression_size_bytes
+ return min_size <= body_size
+
+ return False
+
+
+def _is_compressible_type(request_dict):
+ body = request_dict['body']
+ # Coerce dict to a format compatible with compression.
+ if isinstance(body, dict):
+ body = urlencode(body, doseq=True, encoding='utf-8').encode('utf-8')
+ request_dict['body'] = body
+ is_supported_type = isinstance(body, (str, bytes, bytearray))
+ return is_supported_type or hasattr(body, 'read')
+
+
+def _get_body_size(body):
+ size = determine_content_length(body)
+ if size is None:
+ logger.debug(
+ 'Unable to get length of the request body: %s. '
+ 'Skipping compression.',
+ body,
+ )
+ size = 0
+ return size
+
+
+def _gzip_compress_body(body):
+ if isinstance(body, str):
+ return gzip_compress(body.encode('utf-8'))
+ elif isinstance(body, (bytes, bytearray)):
+ return gzip_compress(body)
+ elif hasattr(body, 'read'):
+ if hasattr(body, 'seek') and hasattr(body, 'tell'):
+ current_position = body.tell()
+ compressed_obj = _gzip_compress_fileobj(body)
+ body.seek(current_position)
+ return compressed_obj
+ return _gzip_compress_fileobj(body)
+
+
+def _gzip_compress_fileobj(body):
+ compressed_obj = io.BytesIO()
+ with GzipFile(fileobj=compressed_obj, mode='wb') as gz:
+ while True:
+ chunk = body.read(8192)
+ if not chunk:
+ break
+ if isinstance(chunk, str):
+ chunk = chunk.encode('utf-8')
+ gz.write(chunk)
+ compressed_obj.seek(0)
+ return compressed_obj
+
+
+def _set_compression_header(headers, encoding):
+ ce_header = headers.get('Content-Encoding')
+ if ce_header is None:
+ headers['Content-Encoding'] = encoding
+ else:
+ headers['Content-Encoding'] = f'{ce_header},{encoding}'
+
+
+COMPRESSION_MAPPING = {'gzip': _gzip_compress_body}
diff --git a/.venv/lib/python3.12/site-packages/botocore/config.py b/.venv/lib/python3.12/site-packages/botocore/config.py
new file mode 100644
index 00000000..94ca84d9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/config.py
@@ -0,0 +1,468 @@
+# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import copy
+
+from botocore.compat import OrderedDict
+from botocore.endpoint import DEFAULT_TIMEOUT, MAX_POOL_CONNECTIONS
+from botocore.exceptions import (
+ InvalidMaxRetryAttemptsError,
+ InvalidRetryConfigurationError,
+ InvalidRetryModeError,
+ InvalidS3AddressingStyleError,
+)
+
+
+class Config:
+ """Advanced configuration for Botocore clients.
+
+ :type region_name: str
+ :param region_name: The region to use in instantiating the client
+
+ :type signature_version: str
+ :param signature_version: The signature version when signing requests.
+
+ :type user_agent: str
+ :param user_agent: The value to use in the User-Agent header.
+
+ :type user_agent_extra: str
+ :param user_agent_extra: The value to append to the current User-Agent
+ header value.
+
+ :type user_agent_appid: str
+ :param user_agent_appid: A value that gets included in the User-Agent
+ string in the format "app/<user_agent_appid>". Allowed characters are
+ ASCII alphanumerics and ``!$%&'*+-.^_`|~``. All other characters will
+ be replaced by a ``-``.
+
+ :type connect_timeout: float or int
+ :param connect_timeout: The time in seconds till a timeout exception is
+ thrown when attempting to make a connection. The default is 60
+ seconds.
+
+ :type read_timeout: float or int
+ :param read_timeout: The time in seconds till a timeout exception is
+ thrown when attempting to read from a connection. The default is
+ 60 seconds.
+
+ :type parameter_validation: bool
+ :param parameter_validation: Whether parameter validation should occur
+ when serializing requests. The default is True. You can disable
+ parameter validation for performance reasons. Otherwise, it's
+ recommended to leave parameter validation enabled.
+
+ :type max_pool_connections: int
+ :param max_pool_connections: The maximum number of connections to
+ keep in a connection pool. If this value is not set, the default
+ value of 10 is used.
+
+ :type proxies: dict
+ :param proxies: A dictionary of proxy servers to use by protocol or
+ endpoint, e.g.:
+ ``{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}``.
+ The proxies are used on each request.
+
+ :type proxies_config: dict
+ :param proxies_config: A dictionary of additional proxy configurations.
+ Valid keys are:
+
+ * ``proxy_ca_bundle`` -- The path to a custom certificate bundle to use
+ when establishing SSL/TLS connections with proxy.
+
+ * ``proxy_client_cert`` -- The path to a certificate for proxy
+ TLS client authentication.
+
+ When a string is provided it is treated as a path to a proxy client
+ certificate. When a two element tuple is provided, it will be
+ interpreted as the path to the client certificate, and the path
+ to the certificate key.
+
+ * ``proxy_use_forwarding_for_https`` -- For HTTPS proxies,
+ forward your requests to HTTPS destinations with an absolute
+ URI. We strongly recommend you only use this option with
+ trusted or corporate proxies. Value must be boolean.
+
+ :type s3: dict
+ :param s3: A dictionary of S3 specific configurations.
+ Valid keys are:
+
+ * ``use_accelerate_endpoint`` -- Refers to whether to use the S3
+ Accelerate endpoint. The value must be a boolean. If True, the
+ client will use the S3 Accelerate endpoint. If the S3 Accelerate
+ endpoint is being used then the addressing style will always
+ be virtual.
+
+ * ``payload_signing_enabled`` -- Refers to whether or not to SHA256
+ sign sigv4 payloads. By default, this is disabled for streaming
+ uploads (UploadPart and PutObject).
+
+ * ``addressing_style`` -- Refers to the style in which to address
+ s3 endpoints. Values must be a string that equals one of:
+
+ * ``auto`` -- Addressing style is chosen for user. Depending
+ on the configuration of client, the endpoint may be addressed in
+ the virtual or the path style. Note that this is the default
+ behavior if no style is specified.
+
+ * ``virtual`` -- Addressing style is always virtual. The name of the
+ bucket must be DNS compatible or an exception will be thrown.
+ Endpoints will be addressed as such: ``amzn-s3-demo-bucket.s3.amazonaws.com``
+
+ * ``path`` -- Addressing style is always by path. Endpoints will be
+ addressed as such: ``s3.amazonaws.com/amzn-s3-demo-bucket``
+
+ * ``us_east_1_regional_endpoint`` -- Refers to what S3 endpoint to use
+ when the region is configured to be us-east-1. Values must be a
+ string that equals:
+
+ * ``regional`` -- Use the us-east-1.amazonaws.com endpoint if the
+ client is configured to use the us-east-1 region.
+
+ * ``legacy`` -- Use the s3.amazonaws.com endpoint if the client is
+ configured to use the us-east-1 region. This is the default if
+ the configuration option is not specified.
+
+
+ :type retries: dict
+ :param retries: A dictionary for configuration related to retry behavior.
+ Valid keys are:
+
+ * ``total_max_attempts`` -- An integer representing the maximum number of
+ total attempts that will be made on a single request. This includes
+ the initial request, so a value of 1 indicates that no requests
+ will be retried. If ``total_max_attempts`` and ``max_attempts``
+ are both provided, ``total_max_attempts`` takes precedence.
+ ``total_max_attempts`` is preferred over ``max_attempts`` because
+ it maps to the ``AWS_MAX_ATTEMPTS`` environment variable and
+ the ``max_attempts`` config file value.
+ * ``max_attempts`` -- An integer representing the maximum number of
+ retry attempts that will be made on a single request. For
+ example, setting this value to 2 will result in the request
+ being retried at most two times after the initial request. Setting
+ this value to 0 will result in no retries ever being attempted after
+ the initial request. If not provided, the number of retries will
+ default to the value specified in the service model, which is
+ typically four retries.
+ * ``mode`` -- A string representing the type of retry mode botocore
+ should use. Valid values are:
+
+ * ``legacy`` - The pre-existing retry behavior.
+
+ * ``standard`` - The standardized set of retry rules. This will also
+ default to 3 max attempts unless overridden.
+
+ * ``adaptive`` - Retries with additional client side throttling.
+
+ :type client_cert: str, (str, str)
+ :param client_cert: The path to a certificate for TLS client authentication.
+
+ When a string is provided it is treated as a path to a client
+ certificate to be used when creating a TLS connection.
+
+ If a client key is to be provided alongside the client certificate the
+ client_cert should be set to a tuple of length two where the first
+ element is the path to the client certificate and the second element is
+ the path to the certificate key.
+
+ :type inject_host_prefix: bool
+ :param inject_host_prefix: Whether host prefix injection should occur.
+
+ Defaults to None.
+
+ The default of None is equivalent to setting to True, which enables
+ the injection of operation parameters into the prefix of the hostname.
+ Setting this to False disables the injection of operation parameters
+ into the prefix of the hostname. Setting this to False is useful for
+ clients providing custom endpoints that should not have their host
+ prefix modified.
+
+ :type use_dualstack_endpoint: bool
+ :param use_dualstack_endpoint: Setting to True enables dualstack
+ endpoint resolution.
+
+ Defaults to None.
+
+ :type use_fips_endpoint: bool
+ :param use_fips_endpoint: Setting to True enables fips
+ endpoint resolution.
+
+ Defaults to None.
+
+ :type ignore_configured_endpoint_urls: bool
+ :param ignore_configured_endpoint_urls: Setting to True disables use
+ of endpoint URLs provided via environment variables and
+ the shared configuration file.
+
+ Defaults to None.
+
+ :type tcp_keepalive: bool
+ :param tcp_keepalive: Enables the TCP Keep-Alive socket option used when
+ creating new connections if set to True.
+
+ Defaults to False.
+
+ :type request_min_compression_size_bytes: int
+ :param request_min_compression_size_bytes: The minimum size in bytes that a
+ request body should be to trigger compression. All requests with
+ streaming input that don't contain the ``requiresLength`` trait will be
+ compressed regardless of this setting.
+
+ Defaults to None.
+
+ :type disable_request_compression: bool
+ :param disable_request_compression: Disables request body compression if
+ set to True.
+
+ Defaults to None.
+
+ :type sigv4a_signing_region_set: string
+ :param sigv4a_signing_region_set: A set of AWS regions to apply the signature for
+ when using SigV4a for signing. Set to ``*`` to represent all regions.
+
+ Defaults to None.
+
+ :type client_context_params: dict
+ :param client_context_params: A dictionary of parameters specific to
+ individual services. If available, valid parameters can be found in
+ the ``Client Context Parameters`` section of the service client's
+ documentation. Invalid parameters or ones that are not used by the
+ specified service will be ignored.
+
+ Defaults to None.
+
+ :type request_checksum_calculation: str
+ :param request_checksum_calculation: Determines when a checksum will be
+ calculated for request payloads. Valid values are:
+
+ * ``when_supported`` -- When set, a checksum will be calculated for
+ all request payloads of operations modeled with the ``httpChecksum``
+ trait where ``requestChecksumRequired`` is ``true`` or a
+ ``requestAlgorithmMember`` is modeled.
+
+ * ``when_required`` -- When set, a checksum will only be calculated
+ for request payloads of operations modeled with the ``httpChecksum``
+ trait where ``requestChecksumRequired`` is ``true`` or where a
+ ``requestAlgorithmMember`` is modeled and supplied.
+
+ Defaults to None.
+
+ :type response_checksum_validation: str
+ :param response_checksum_validation: Determines when checksum validation
+ will be performed on response payloads. Valid values are:
+
+ * ``when_supported`` -- When set, checksum validation is performed on
+ all response payloads of operations modeled with the ``httpChecksum``
+ trait where ``responseAlgorithms`` is modeled, except when no modeled
+ checksum algorithms are supported.
+
+ * ``when_required`` -- When set, checksum validation is not performed
+ on response payloads of operations unless the checksum algorithm is
+ supported and the ``requestValidationModeMember`` member is set to ``ENABLED``.
+
+ Defaults to None.
+
+ :type account_id_endpoint_mode: str
+ :param account_id_endpoint_mode: The value used to determine the client's
+ behavior for account ID based endpoint routing. Valid values are:
+
+ * ``preferred`` - The endpoint should include account ID if available.
+ * ``disabled`` - A resolved endpoint does not include account ID.
+ * ``required`` - The endpoint must include account ID. If the account ID
+ isn't available, an exception will be raised.
+
+ If a value is not provided, the client will default to ``preferred``.
+
+ Defaults to None.
+ """
+
+ OPTION_DEFAULTS = OrderedDict(
+ [
+ ('region_name', None),
+ ('signature_version', None),
+ ('user_agent', None),
+ ('user_agent_extra', None),
+ ('user_agent_appid', None),
+ ('connect_timeout', DEFAULT_TIMEOUT),
+ ('read_timeout', DEFAULT_TIMEOUT),
+ ('parameter_validation', True),
+ ('max_pool_connections', MAX_POOL_CONNECTIONS),
+ ('proxies', None),
+ ('proxies_config', None),
+ ('s3', None),
+ ('retries', None),
+ ('client_cert', None),
+ ('inject_host_prefix', None),
+ ('endpoint_discovery_enabled', None),
+ ('use_dualstack_endpoint', None),
+ ('use_fips_endpoint', None),
+ ('ignore_configured_endpoint_urls', None),
+ ('defaults_mode', None),
+ ('tcp_keepalive', None),
+ ('request_min_compression_size_bytes', None),
+ ('disable_request_compression', None),
+ ('client_context_params', None),
+ ('sigv4a_signing_region_set', None),
+ ('request_checksum_calculation', None),
+ ('response_checksum_validation', None),
+ ('account_id_endpoint_mode', None),
+ ]
+ )
+
+ NON_LEGACY_OPTION_DEFAULTS = {
+ 'connect_timeout': None,
+ }
+
+ # The original default value of the inject_host_prefix parameter was True.
+ # This prevented the ability to override the value from other locations in
+ # the parameter provider chain, like env vars or the shared configuration
+ # file. TO accomplish this, we need to disambiguate when the value was set
+ # by the user or not. This overrides the parameter with a property so the
+ # default value of inject_host_prefix is still True if it is not set by the
+ # user.
+ @property
+ def inject_host_prefix(self):
+ if self._inject_host_prefix == "UNSET":
+ return True
+
+ return self._inject_host_prefix
+
+ # Override the setter for the case where the user does supply a value;
+ # _inject_host_prefix will no longer be "UNSET".
+ @inject_host_prefix.setter
+ def inject_host_prefix(self, value):
+ self._inject_host_prefix = value
+
+ def __init__(self, *args, **kwargs):
+ self._user_provided_options = self._record_user_provided_options(
+ args, kwargs
+ )
+
+ # By default, we use a value that indicates the user did not
+ # set it. This value MUST persist on the Config object to be used
+ # elsewhere.
+ self._inject_host_prefix = 'UNSET'
+
+ # Merge the user_provided options onto the default options
+ config_vars = copy.copy(self.OPTION_DEFAULTS)
+ defaults_mode = self._user_provided_options.get(
+ 'defaults_mode', 'legacy'
+ )
+ if defaults_mode != 'legacy':
+ config_vars.update(self.NON_LEGACY_OPTION_DEFAULTS)
+
+ config_vars.update(self._user_provided_options)
+
+ # Set the attributes based on the config_vars
+ for key, value in config_vars.items():
+ # Default values for the Config object are set here. We don't want
+ # to use `setattr` in the case where the user already supplied a
+ # value.
+ if (
+ key == 'inject_host_prefix'
+ and 'inject_host_prefix'
+ not in self._user_provided_options.keys()
+ ):
+ continue
+ setattr(self, key, value)
+
+ # Validate the s3 options
+ self._validate_s3_configuration(self.s3)
+
+ self._validate_retry_configuration(self.retries)
+
+ def _record_user_provided_options(self, args, kwargs):
+ option_order = list(self.OPTION_DEFAULTS)
+ user_provided_options = {}
+
+ # Iterate through the kwargs passed through to the constructor and
+ # map valid keys to the dictionary
+ for key, value in kwargs.items():
+ if key in self.OPTION_DEFAULTS:
+ user_provided_options[key] = value
+ # The key must exist in the available options
+ else:
+ raise TypeError(f"Got unexpected keyword argument '{key}'")
+
+ # The number of args should not be longer than the allowed
+ # options
+ if len(args) > len(option_order):
+ raise TypeError(
+ f"Takes at most {len(option_order)} arguments ({len(args)} given)"
+ )
+
+ # Iterate through the args passed through to the constructor and map
+ # them to appropriate keys.
+ for i, arg in enumerate(args):
+ # If a kwarg was specified for the arg, then error out
+ if option_order[i] in user_provided_options:
+ raise TypeError(
+ f"Got multiple values for keyword argument '{option_order[i]}'"
+ )
+ user_provided_options[option_order[i]] = arg
+
+ return user_provided_options
+
+ def _validate_s3_configuration(self, s3):
+ if s3 is not None:
+ addressing_style = s3.get('addressing_style')
+ if addressing_style not in ['virtual', 'auto', 'path', None]:
+ raise InvalidS3AddressingStyleError(
+ s3_addressing_style=addressing_style
+ )
+
+ def _validate_retry_configuration(self, retries):
+ valid_options = ('max_attempts', 'mode', 'total_max_attempts')
+ valid_modes = ('legacy', 'standard', 'adaptive')
+ if retries is not None:
+ for key, value in retries.items():
+ if key not in valid_options:
+ raise InvalidRetryConfigurationError(
+ retry_config_option=key,
+ valid_options=valid_options,
+ )
+ if key == 'max_attempts' and value < 0:
+ raise InvalidMaxRetryAttemptsError(
+ provided_max_attempts=value,
+ min_value=0,
+ )
+ if key == 'total_max_attempts' and value < 1:
+ raise InvalidMaxRetryAttemptsError(
+ provided_max_attempts=value,
+ min_value=1,
+ )
+ if key == 'mode' and value not in valid_modes:
+ raise InvalidRetryModeError(
+ provided_retry_mode=value,
+ valid_modes=valid_modes,
+ )
+
+ def merge(self, other_config):
+ """Merges the config object with another config object
+
+ This will merge in all non-default values from the provided config
+ and return a new config object
+
+ :type other_config: botocore.config.Config
+ :param other config: Another config object to merge with. The values
+ in the provided config object will take precedence in the merging
+
+ :returns: A config object built from the merged values of both
+ config objects.
+ """
+ # Make a copy of the current attributes in the config object.
+ config_options = copy.copy(self._user_provided_options)
+
+ # Merge in the user provided options from the other config
+ config_options.update(other_config._user_provided_options)
+
+ # Return a new config object with the merged properties.
+ return Config(**config_options)
diff --git a/.venv/lib/python3.12/site-packages/botocore/configloader.py b/.venv/lib/python3.12/site-packages/botocore/configloader.py
new file mode 100644
index 00000000..0b6c82bc
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/configloader.py
@@ -0,0 +1,287 @@
+# Copyright (c) 2012-2013 Mitch Garnaat http://garnaat.org/
+# Copyright 2012-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import configparser
+import copy
+import os
+import shlex
+import sys
+
+import botocore.exceptions
+
+
+def multi_file_load_config(*filenames):
+ """Load and combine multiple INI configs with profiles.
+
+ This function will take a list of filesnames and return
+ a single dictionary that represents the merging of the loaded
+ config files.
+
+ If any of the provided filenames does not exist, then that file
+ is ignored. It is therefore ok to provide a list of filenames,
+ some of which may not exist.
+
+ Configuration files are **not** deep merged, only the top level
+ keys are merged. The filenames should be passed in order of
+ precedence. The first config file has precedence over the
+ second config file, which has precedence over the third config file,
+ etc. The only exception to this is that the "profiles" key is
+ merged to combine profiles from multiple config files into a
+ single profiles mapping. However, if a profile is defined in
+ multiple config files, then the config file with the highest
+ precedence is used. Profile values themselves are not merged.
+ For example::
+
+ FileA FileB FileC
+ [foo] [foo] [bar]
+ a=1 a=2 a=3
+ b=2
+
+ [bar] [baz] [profile a]
+ a=2 a=3 region=e
+
+ [profile a] [profile b] [profile c]
+ region=c region=d region=f
+
+ The final result of ``multi_file_load_config(FileA, FileB, FileC)``
+ would be::
+
+ {"foo": {"a": 1}, "bar": {"a": 2}, "baz": {"a": 3},
+ "profiles": {"a": {"region": "c"}}, {"b": {"region": d"}},
+ {"c": {"region": "f"}}}
+
+ Note that the "foo" key comes from A, even though it's defined in both
+ FileA and FileB. Because "foo" was defined in FileA first, then the values
+ for "foo" from FileA are used and the values for "foo" from FileB are
+ ignored. Also note where the profiles originate from. Profile "a"
+ comes FileA, profile "b" comes from FileB, and profile "c" comes
+ from FileC.
+
+ """
+ configs = []
+ profiles = []
+ for filename in filenames:
+ try:
+ loaded = load_config(filename)
+ except botocore.exceptions.ConfigNotFound:
+ continue
+ profiles.append(loaded.pop('profiles'))
+ configs.append(loaded)
+ merged_config = _merge_list_of_dicts(configs)
+ merged_profiles = _merge_list_of_dicts(profiles)
+ merged_config['profiles'] = merged_profiles
+ return merged_config
+
+
+def _merge_list_of_dicts(list_of_dicts):
+ merged_dicts = {}
+ for single_dict in list_of_dicts:
+ for key, value in single_dict.items():
+ if key not in merged_dicts:
+ merged_dicts[key] = value
+ return merged_dicts
+
+
+def load_config(config_filename):
+ """Parse a INI config with profiles.
+
+ This will parse an INI config file and map top level profiles
+ into a top level "profile" key.
+
+ If you want to parse an INI file and map all section names to
+ top level keys, use ``raw_config_parse`` instead.
+
+ """
+ parsed = raw_config_parse(config_filename)
+ return build_profile_map(parsed)
+
+
+def raw_config_parse(config_filename, parse_subsections=True):
+ """Returns the parsed INI config contents.
+
+ Each section name is a top level key.
+
+ :param config_filename: The name of the INI file to parse
+
+ :param parse_subsections: If True, parse indented blocks as
+ subsections that represent their own configuration dictionary.
+ For example, if the config file had the contents::
+
+ s3 =
+ signature_version = s3v4
+ addressing_style = path
+
+ The resulting ``raw_config_parse`` would be::
+
+ {'s3': {'signature_version': 's3v4', 'addressing_style': 'path'}}
+
+ If False, do not try to parse subsections and return the indented
+ block as its literal value::
+
+ {'s3': '\nsignature_version = s3v4\naddressing_style = path'}
+
+ :returns: A dict with keys for each profile found in the config
+ file and the value of each key being a dict containing name
+ value pairs found in that profile.
+
+ :raises: ConfigNotFound, ConfigParseError
+ """
+ config = {}
+ path = config_filename
+ if path is not None:
+ path = os.path.expandvars(path)
+ path = os.path.expanduser(path)
+ if not os.path.isfile(path):
+ raise botocore.exceptions.ConfigNotFound(path=_unicode_path(path))
+ cp = configparser.RawConfigParser()
+ try:
+ cp.read([path])
+ except (configparser.Error, UnicodeDecodeError) as e:
+ raise botocore.exceptions.ConfigParseError(
+ path=_unicode_path(path), error=e
+ ) from None
+ else:
+ for section in cp.sections():
+ config[section] = {}
+ for option in cp.options(section):
+ config_value = cp.get(section, option)
+ if parse_subsections and config_value.startswith('\n'):
+ # Then we need to parse the inner contents as
+ # hierarchical. We support a single level
+ # of nesting for now.
+ try:
+ config_value = _parse_nested(config_value)
+ except ValueError as e:
+ raise botocore.exceptions.ConfigParseError(
+ path=_unicode_path(path), error=e
+ ) from None
+ config[section][option] = config_value
+ return config
+
+
+def _unicode_path(path):
+ if isinstance(path, str):
+ return path
+ # According to the documentation getfilesystemencoding can return None
+ # on unix in which case the default encoding is used instead.
+ filesystem_encoding = sys.getfilesystemencoding()
+ if filesystem_encoding is None:
+ filesystem_encoding = sys.getdefaultencoding()
+ return path.decode(filesystem_encoding, 'replace')
+
+
+def _parse_nested(config_value):
+ # Given a value like this:
+ # \n
+ # foo = bar
+ # bar = baz
+ # We need to parse this into
+ # {'foo': 'bar', 'bar': 'baz}
+ parsed = {}
+ for line in config_value.splitlines():
+ line = line.strip()
+ if not line:
+ continue
+ # The caller will catch ValueError
+ # and raise an appropriate error
+ # if this fails.
+ key, value = line.split('=', 1)
+ parsed[key.strip()] = value.strip()
+ return parsed
+
+
+def _parse_section(key, values):
+ result = {}
+ try:
+ parts = shlex.split(key)
+ except ValueError:
+ return result
+ if len(parts) == 2:
+ result[parts[1]] = values
+ return result
+
+
+def build_profile_map(parsed_ini_config):
+ """Convert the parsed INI config into a profile map.
+
+ The config file format requires that every profile except the
+ default to be prepended with "profile", e.g.::
+
+ [profile test]
+ aws_... = foo
+ aws_... = bar
+
+ [profile bar]
+ aws_... = foo
+ aws_... = bar
+
+ # This is *not* a profile
+ [preview]
+ otherstuff = 1
+
+ # Neither is this
+ [foobar]
+ morestuff = 2
+
+ The build_profile_map will take a parsed INI config file where each top
+ level key represents a section name, and convert into a format where all
+ the profiles are under a single top level "profiles" key, and each key in
+ the sub dictionary is a profile name. For example, the above config file
+ would be converted from::
+
+ {"profile test": {"aws_...": "foo", "aws...": "bar"},
+ "profile bar": {"aws...": "foo", "aws...": "bar"},
+ "preview": {"otherstuff": ...},
+ "foobar": {"morestuff": ...},
+ }
+
+ into::
+
+ {"profiles": {"test": {"aws_...": "foo", "aws...": "bar"},
+ "bar": {"aws...": "foo", "aws...": "bar"},
+ "preview": {"otherstuff": ...},
+ "foobar": {"morestuff": ...},
+ }
+
+ If there are no profiles in the provided parsed INI contents, then
+ an empty dict will be the value associated with the ``profiles`` key.
+
+ .. note::
+
+ This will not mutate the passed in parsed_ini_config. Instead it will
+ make a deepcopy and return that value.
+
+ """
+ parsed_config = copy.deepcopy(parsed_ini_config)
+ profiles = {}
+ sso_sessions = {}
+ services = {}
+ final_config = {}
+ for key, values in parsed_config.items():
+ if key.startswith("profile"):
+ profiles.update(_parse_section(key, values))
+ elif key.startswith("sso-session"):
+ sso_sessions.update(_parse_section(key, values))
+ elif key.startswith("services"):
+ services.update(_parse_section(key, values))
+ elif key == 'default':
+ # default section is special and is considered a profile
+ # name but we don't require you use 'profile "default"'
+ # as a section.
+ profiles[key] = values
+ else:
+ final_config[key] = values
+ final_config['profiles'] = profiles
+ final_config['sso_sessions'] = sso_sessions
+ final_config['services'] = services
+ return final_config
diff --git a/.venv/lib/python3.12/site-packages/botocore/configprovider.py b/.venv/lib/python3.12/site-packages/botocore/configprovider.py
new file mode 100644
index 00000000..55c4654a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/configprovider.py
@@ -0,0 +1,1061 @@
+# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+"""This module contains the interface for controlling how configuration
+is loaded.
+"""
+
+import copy
+import logging
+import os
+
+from botocore import utils
+from botocore.exceptions import InvalidConfigError
+
+logger = logging.getLogger(__name__)
+
+
+#: A default dictionary that maps the logical names for session variables
+#: to the specific environment variables and configuration file names
+#: that contain the values for these variables.
+#: When creating a new Session object, you can pass in your own dictionary
+#: to remap the logical names or to add new logical names. You can then
+#: get the current value for these variables by using the
+#: ``get_config_variable`` method of the :class:`botocore.session.Session`
+#: class.
+#: These form the keys of the dictionary. The values in the dictionary
+#: are tuples of (<config_name>, <environment variable>, <default value>,
+#: <conversion func>).
+#: The conversion func is a function that takes the configuration value
+#: as an argument and returns the converted value. If this value is
+#: None, then the configuration value is returned unmodified. This
+#: conversion function can be used to type convert config values to
+#: values other than the default values of strings.
+#: The ``profile`` and ``config_file`` variables should always have a
+#: None value for the first entry in the tuple because it doesn't make
+#: sense to look inside the config file for the location of the config
+#: file or for the default profile to use.
+#: The ``config_name`` is the name to look for in the configuration file,
+#: the ``env var`` is the OS environment variable (``os.environ``) to
+#: use, and ``default_value`` is the value to use if no value is otherwise
+#: found.
+#: NOTE: Fixing the spelling of this variable would be a breaking change.
+#: Please leave as is.
+BOTOCORE_DEFAUT_SESSION_VARIABLES = {
+ # logical: config_file, env_var, default_value, conversion_func
+ 'profile': (None, ['AWS_DEFAULT_PROFILE', 'AWS_PROFILE'], None, None),
+ 'region': ('region', 'AWS_DEFAULT_REGION', None, None),
+ 'data_path': ('data_path', 'AWS_DATA_PATH', None, None),
+ 'config_file': (None, 'AWS_CONFIG_FILE', '~/.aws/config', None),
+ 'ca_bundle': ('ca_bundle', 'AWS_CA_BUNDLE', None, None),
+ 'api_versions': ('api_versions', None, {}, None),
+ # This is the shared credentials file amongst sdks.
+ 'credentials_file': (
+ None,
+ 'AWS_SHARED_CREDENTIALS_FILE',
+ '~/.aws/credentials',
+ None,
+ ),
+ # These variables only exist in the config file.
+ # This is the number of seconds until we time out a request to
+ # the instance metadata service.
+ 'metadata_service_timeout': (
+ 'metadata_service_timeout',
+ 'AWS_METADATA_SERVICE_TIMEOUT',
+ 1,
+ int,
+ ),
+ # This is the number of request attempts we make until we give
+ # up trying to retrieve data from the instance metadata service.
+ 'metadata_service_num_attempts': (
+ 'metadata_service_num_attempts',
+ 'AWS_METADATA_SERVICE_NUM_ATTEMPTS',
+ 1,
+ int,
+ ),
+ 'ec2_metadata_service_endpoint': (
+ 'ec2_metadata_service_endpoint',
+ 'AWS_EC2_METADATA_SERVICE_ENDPOINT',
+ None,
+ None,
+ ),
+ 'ec2_metadata_service_endpoint_mode': (
+ 'ec2_metadata_service_endpoint_mode',
+ 'AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE',
+ None,
+ None,
+ ),
+ 'ec2_metadata_v1_disabled': (
+ 'ec2_metadata_v1_disabled',
+ 'AWS_EC2_METADATA_V1_DISABLED',
+ False,
+ utils.ensure_boolean,
+ ),
+ 'imds_use_ipv6': (
+ 'imds_use_ipv6',
+ 'AWS_IMDS_USE_IPV6',
+ False,
+ utils.ensure_boolean,
+ ),
+ 'use_dualstack_endpoint': (
+ 'use_dualstack_endpoint',
+ 'AWS_USE_DUALSTACK_ENDPOINT',
+ None,
+ utils.ensure_boolean,
+ ),
+ 'use_fips_endpoint': (
+ 'use_fips_endpoint',
+ 'AWS_USE_FIPS_ENDPOINT',
+ None,
+ utils.ensure_boolean,
+ ),
+ 'ignore_configured_endpoint_urls': (
+ 'ignore_configured_endpoint_urls',
+ 'AWS_IGNORE_CONFIGURED_ENDPOINT_URLS',
+ None,
+ utils.ensure_boolean,
+ ),
+ 'parameter_validation': ('parameter_validation', None, True, None),
+ # Client side monitoring configurations.
+ # Note: These configurations are considered internal to botocore.
+ # Do not use them until publicly documented.
+ 'csm_enabled': (
+ 'csm_enabled',
+ 'AWS_CSM_ENABLED',
+ False,
+ utils.ensure_boolean,
+ ),
+ 'csm_host': ('csm_host', 'AWS_CSM_HOST', '127.0.0.1', None),
+ 'csm_port': ('csm_port', 'AWS_CSM_PORT', 31000, int),
+ 'csm_client_id': ('csm_client_id', 'AWS_CSM_CLIENT_ID', '', None),
+ # Endpoint discovery configuration
+ 'endpoint_discovery_enabled': (
+ 'endpoint_discovery_enabled',
+ 'AWS_ENDPOINT_DISCOVERY_ENABLED',
+ 'auto',
+ None,
+ ),
+ 'retry_mode': ('retry_mode', 'AWS_RETRY_MODE', 'legacy', None),
+ 'defaults_mode': ('defaults_mode', 'AWS_DEFAULTS_MODE', 'legacy', None),
+ # We can't have a default here for v1 because we need to defer to
+ # whatever the defaults are in _retry.json.
+ 'max_attempts': ('max_attempts', 'AWS_MAX_ATTEMPTS', None, int),
+ 'user_agent_appid': ('sdk_ua_app_id', 'AWS_SDK_UA_APP_ID', None, None),
+ 'request_min_compression_size_bytes': (
+ 'request_min_compression_size_bytes',
+ 'AWS_REQUEST_MIN_COMPRESSION_SIZE_BYTES',
+ 10240,
+ None,
+ ),
+ 'disable_request_compression': (
+ 'disable_request_compression',
+ 'AWS_DISABLE_REQUEST_COMPRESSION',
+ False,
+ utils.ensure_boolean,
+ ),
+ 'sigv4a_signing_region_set': (
+ 'sigv4a_signing_region_set',
+ 'AWS_SIGV4A_SIGNING_REGION_SET',
+ None,
+ None,
+ ),
+ 'request_checksum_calculation': (
+ 'request_checksum_calculation',
+ 'AWS_REQUEST_CHECKSUM_CALCULATION',
+ "when_supported",
+ None,
+ ),
+ 'response_checksum_validation': (
+ 'response_checksum_validation',
+ 'AWS_RESPONSE_CHECKSUM_VALIDATION',
+ "when_supported",
+ None,
+ ),
+ 'account_id_endpoint_mode': (
+ 'account_id_endpoint_mode',
+ 'AWS_ACCOUNT_ID_ENDPOINT_MODE',
+ 'preferred',
+ None,
+ ),
+ 'disable_host_prefix_injection': (
+ 'disable_host_prefix_injection',
+ 'AWS_DISABLE_HOST_PREFIX_INJECTION',
+ None,
+ utils.ensure_boolean,
+ ),
+}
+
+# Evaluate AWS_STS_REGIONAL_ENDPOINTS settings
+try:
+ # This is not a public interface and is subject to abrupt breaking changes.
+ # Any usage is not advised or supported in external code bases.
+ from botocore.customizations.sts import (
+ sts_default_setting as _sts_default_setting,
+ )
+except ImportError:
+ _sts_default_setting = 'legacy'
+
+_STS_DEFAULT_SETTINGS = {
+ 'sts_regional_endpoints': (
+ 'sts_regional_endpoints',
+ 'AWS_STS_REGIONAL_ENDPOINTS',
+ _sts_default_setting,
+ None,
+ ),
+}
+BOTOCORE_DEFAUT_SESSION_VARIABLES.update(_STS_DEFAULT_SETTINGS)
+
+
+# A mapping for the s3 specific configuration vars. These are the configuration
+# vars that typically go in the s3 section of the config file. This mapping
+# follows the same schema as the previous session variable mapping.
+DEFAULT_S3_CONFIG_VARS = {
+ 'addressing_style': (('s3', 'addressing_style'), None, None, None),
+ 'use_accelerate_endpoint': (
+ ('s3', 'use_accelerate_endpoint'),
+ None,
+ None,
+ utils.ensure_boolean,
+ ),
+ 'use_dualstack_endpoint': (
+ ('s3', 'use_dualstack_endpoint'),
+ None,
+ None,
+ utils.ensure_boolean,
+ ),
+ 'payload_signing_enabled': (
+ ('s3', 'payload_signing_enabled'),
+ None,
+ None,
+ utils.ensure_boolean,
+ ),
+ 'use_arn_region': (
+ ['s3_use_arn_region', ('s3', 'use_arn_region')],
+ 'AWS_S3_USE_ARN_REGION',
+ None,
+ utils.ensure_boolean,
+ ),
+ 'us_east_1_regional_endpoint': (
+ [
+ 's3_us_east_1_regional_endpoint',
+ ('s3', 'us_east_1_regional_endpoint'),
+ ],
+ 'AWS_S3_US_EAST_1_REGIONAL_ENDPOINT',
+ None,
+ None,
+ ),
+ 's3_disable_multiregion_access_points': (
+ ('s3', 's3_disable_multiregion_access_points'),
+ 'AWS_S3_DISABLE_MULTIREGION_ACCESS_POINTS',
+ None,
+ utils.ensure_boolean,
+ ),
+}
+# A mapping for the proxy specific configuration vars. These are
+# used to configure how botocore interacts with proxy setups while
+# sending requests.
+DEFAULT_PROXIES_CONFIG_VARS = {
+ 'proxy_ca_bundle': ('proxy_ca_bundle', None, None, None),
+ 'proxy_client_cert': ('proxy_client_cert', None, None, None),
+ 'proxy_use_forwarding_for_https': (
+ 'proxy_use_forwarding_for_https',
+ None,
+ None,
+ utils.normalize_boolean,
+ ),
+}
+
+
+def create_botocore_default_config_mapping(session):
+ chain_builder = ConfigChainFactory(session=session)
+ config_mapping = _create_config_chain_mapping(
+ chain_builder, BOTOCORE_DEFAUT_SESSION_VARIABLES
+ )
+ config_mapping['s3'] = SectionConfigProvider(
+ 's3',
+ session,
+ _create_config_chain_mapping(chain_builder, DEFAULT_S3_CONFIG_VARS),
+ )
+ config_mapping['proxies_config'] = SectionConfigProvider(
+ 'proxies_config',
+ session,
+ _create_config_chain_mapping(
+ chain_builder, DEFAULT_PROXIES_CONFIG_VARS
+ ),
+ )
+ return config_mapping
+
+
+def _create_config_chain_mapping(chain_builder, config_variables):
+ mapping = {}
+ for logical_name, config in config_variables.items():
+ mapping[logical_name] = chain_builder.create_config_chain(
+ instance_name=logical_name,
+ env_var_names=config[1],
+ config_property_names=config[0],
+ default=config[2],
+ conversion_func=config[3],
+ )
+ return mapping
+
+
+class DefaultConfigResolver:
+ def __init__(self, default_config_data):
+ self._base_default_config = default_config_data['base']
+ self._modes = default_config_data['modes']
+ self._resolved_default_configurations = {}
+
+ def _resolve_default_values_by_mode(self, mode):
+ default_config = self._base_default_config.copy()
+ modifications = self._modes.get(mode)
+
+ for config_var in modifications:
+ default_value = default_config[config_var]
+ modification_dict = modifications[config_var]
+ modification = list(modification_dict.keys())[0]
+ modification_value = modification_dict[modification]
+ if modification == 'multiply':
+ default_value *= modification_value
+ elif modification == 'add':
+ default_value += modification_value
+ elif modification == 'override':
+ default_value = modification_value
+ default_config[config_var] = default_value
+ return default_config
+
+ def get_default_modes(self):
+ default_modes = ['legacy', 'auto']
+ default_modes.extend(self._modes.keys())
+ return default_modes
+
+ def get_default_config_values(self, mode):
+ if mode not in self._resolved_default_configurations:
+ defaults = self._resolve_default_values_by_mode(mode)
+ self._resolved_default_configurations[mode] = defaults
+ return self._resolved_default_configurations[mode]
+
+
+class ConfigChainFactory:
+ """Factory class to create our most common configuration chain case.
+
+ This is a convenience class to construct configuration chains that follow
+ our most common pattern. This is to prevent ordering them incorrectly,
+ and to make the config chain construction more readable.
+ """
+
+ def __init__(self, session, environ=None):
+ """Initialize a ConfigChainFactory.
+
+ :type session: :class:`botocore.session.Session`
+ :param session: This is the session that should be used to look up
+ values from the config file.
+
+ :type environ: dict
+ :param environ: A mapping to use for environment variables. If this
+ is not provided it will default to use os.environ.
+ """
+ self._session = session
+ if environ is None:
+ environ = os.environ
+ self._environ = environ
+
+ def create_config_chain(
+ self,
+ instance_name=None,
+ env_var_names=None,
+ config_property_names=None,
+ default=None,
+ conversion_func=None,
+ ):
+ """Build a config chain following the standard botocore pattern.
+
+ In botocore most of our config chains follow the the precendence:
+ session_instance_variables, environment, config_file, default_value.
+
+ This is a convenience function for creating a chain that follow
+ that precendence.
+
+ :type instance_name: str
+ :param instance_name: This indicates what session instance variable
+ corresponds to this config value. If it is None it will not be
+ added to the chain.
+
+ :type env_var_names: str or list of str or None
+ :param env_var_names: One or more environment variable names to
+ search for this value. They are searched in order. If it is None
+ it will not be added to the chain.
+
+ :type config_property_names: str/tuple or list of str/tuple or None
+ :param config_property_names: One of more strings or tuples
+ representing the name of the key in the config file for this
+ config option. They are searched in order. If it is None it will
+ not be added to the chain.
+
+ :type default: Any
+ :param default: Any constant value to be returned.
+
+ :type conversion_func: None or callable
+ :param conversion_func: If this value is None then it has no effect on
+ the return type. Otherwise, it is treated as a function that will
+ conversion_func our provided type.
+
+ :rvalue: ConfigChain
+ :returns: A ConfigChain that resolves in the order env_var_names ->
+ config_property_name -> default. Any values that were none are
+ omitted form the chain.
+ """
+ providers = []
+ if instance_name is not None:
+ providers.append(
+ InstanceVarProvider(
+ instance_var=instance_name, session=self._session
+ )
+ )
+ if env_var_names is not None:
+ providers.extend(self._get_env_providers(env_var_names))
+ if config_property_names is not None:
+ providers.extend(
+ self._get_scoped_config_providers(config_property_names)
+ )
+ if default is not None:
+ providers.append(ConstantProvider(value=default))
+
+ return ChainProvider(
+ providers=providers,
+ conversion_func=conversion_func,
+ )
+
+ def _get_env_providers(self, env_var_names):
+ env_var_providers = []
+ if not isinstance(env_var_names, list):
+ env_var_names = [env_var_names]
+ for env_var_name in env_var_names:
+ env_var_providers.append(
+ EnvironmentProvider(name=env_var_name, env=self._environ)
+ )
+ return env_var_providers
+
+ def _get_scoped_config_providers(self, config_property_names):
+ scoped_config_providers = []
+ if not isinstance(config_property_names, list):
+ config_property_names = [config_property_names]
+ for config_property_name in config_property_names:
+ scoped_config_providers.append(
+ ScopedConfigProvider(
+ config_var_name=config_property_name,
+ session=self._session,
+ )
+ )
+ return scoped_config_providers
+
+
+class ConfigValueStore:
+ """The ConfigValueStore object stores configuration values."""
+
+ def __init__(self, mapping=None):
+ """Initialize a ConfigValueStore.
+
+ :type mapping: dict
+ :param mapping: The mapping parameter is a map of string to a subclass
+ of BaseProvider. When a config variable is asked for via the
+ get_config_variable method, the corresponding provider will be
+ invoked to load the value.
+ """
+ self._overrides = {}
+ self._mapping = {}
+ if mapping is not None:
+ for logical_name, provider in mapping.items():
+ self.set_config_provider(logical_name, provider)
+
+ def __deepcopy__(self, memo):
+ config_store = ConfigValueStore(copy.deepcopy(self._mapping, memo))
+ for logical_name, override_value in self._overrides.items():
+ config_store.set_config_variable(logical_name, override_value)
+
+ return config_store
+
+ def __copy__(self):
+ config_store = ConfigValueStore(copy.copy(self._mapping))
+ for logical_name, override_value in self._overrides.items():
+ config_store.set_config_variable(logical_name, override_value)
+
+ return config_store
+
+ def get_config_variable(self, logical_name):
+ """
+ Retrieve the value associated with the specified logical_name
+ from the corresponding provider. If no value is found None will
+ be returned.
+
+ :type logical_name: str
+ :param logical_name: The logical name of the session variable
+ you want to retrieve. This name will be mapped to the
+ appropriate environment variable name for this session as
+ well as the appropriate config file entry.
+
+ :returns: value of variable or None if not defined.
+ """
+ if logical_name in self._overrides:
+ return self._overrides[logical_name]
+ if logical_name not in self._mapping:
+ return None
+ provider = self._mapping[logical_name]
+ return provider.provide()
+
+ def get_config_provider(self, logical_name):
+ """
+ Retrieve the provider associated with the specified logical_name.
+ If no provider is found None will be returned.
+
+ :type logical_name: str
+ :param logical_name: The logical name of the session variable
+ you want to retrieve. This name will be mapped to the
+ appropriate environment variable name for this session as
+ well as the appropriate config file entry.
+
+ :returns: configuration provider or None if not defined.
+ """
+ if (
+ logical_name in self._overrides
+ or logical_name not in self._mapping
+ ):
+ return None
+ provider = self._mapping[logical_name]
+ return provider
+
+ def set_config_variable(self, logical_name, value):
+ """Set a configuration variable to a specific value.
+
+ By using this method, you can override the normal lookup
+ process used in ``get_config_variable`` by explicitly setting
+ a value. Subsequent calls to ``get_config_variable`` will
+ use the ``value``. This gives you per-session specific
+ configuration values.
+
+ ::
+ >>> # Assume logical name 'foo' maps to env var 'FOO'
+ >>> os.environ['FOO'] = 'myvalue'
+ >>> s.get_config_variable('foo')
+ 'myvalue'
+ >>> s.set_config_variable('foo', 'othervalue')
+ >>> s.get_config_variable('foo')
+ 'othervalue'
+
+ :type logical_name: str
+ :param logical_name: The logical name of the session variable
+ you want to set. These are the keys in ``SESSION_VARIABLES``.
+
+ :param value: The value to associate with the config variable.
+ """
+ self._overrides[logical_name] = value
+
+ def clear_config_variable(self, logical_name):
+ """Remove an override config variable from the session.
+
+ :type logical_name: str
+ :param logical_name: The name of the parameter to clear the override
+ value from.
+ """
+ self._overrides.pop(logical_name, None)
+
+ def set_config_provider(self, logical_name, provider):
+ """Set the provider for a config value.
+
+ This provides control over how a particular configuration value is
+ loaded. This replaces the provider for ``logical_name`` with the new
+ ``provider``.
+
+ :type logical_name: str
+ :param logical_name: The name of the config value to change the config
+ provider for.
+
+ :type provider: :class:`botocore.configprovider.BaseProvider`
+ :param provider: The new provider that should be responsible for
+ providing a value for the config named ``logical_name``.
+ """
+ self._mapping[logical_name] = provider
+
+
+class SmartDefaultsConfigStoreFactory:
+ def __init__(self, default_config_resolver, imds_region_provider):
+ self._default_config_resolver = default_config_resolver
+ self._imds_region_provider = imds_region_provider
+ # Initializing _instance_metadata_region as None so we
+ # can fetch region in a lazy fashion only when needed.
+ self._instance_metadata_region = None
+
+ def merge_smart_defaults(self, config_store, mode, region_name):
+ if mode == 'auto':
+ mode = self.resolve_auto_mode(region_name)
+ default_configs = (
+ self._default_config_resolver.get_default_config_values(mode)
+ )
+ for config_var in default_configs:
+ config_value = default_configs[config_var]
+ method = getattr(self, f'_set_{config_var}', None)
+ if method:
+ method(config_store, config_value)
+
+ def resolve_auto_mode(self, region_name):
+ current_region = None
+ if os.environ.get('AWS_EXECUTION_ENV'):
+ default_region = os.environ.get('AWS_DEFAULT_REGION')
+ current_region = os.environ.get('AWS_REGION', default_region)
+ if not current_region:
+ if self._instance_metadata_region:
+ current_region = self._instance_metadata_region
+ else:
+ try:
+ current_region = self._imds_region_provider.provide()
+ self._instance_metadata_region = current_region
+ except Exception:
+ pass
+
+ if current_region:
+ if region_name == current_region:
+ return 'in-region'
+ else:
+ return 'cross-region'
+ return 'standard'
+
+ def _update_provider(self, config_store, variable, value):
+ original_provider = config_store.get_config_provider(variable)
+ default_provider = ConstantProvider(value)
+ if isinstance(original_provider, ChainProvider):
+ chain_provider_copy = copy.deepcopy(original_provider)
+ chain_provider_copy.set_default_provider(default_provider)
+ default_provider = chain_provider_copy
+ elif isinstance(original_provider, BaseProvider):
+ default_provider = ChainProvider(
+ providers=[original_provider, default_provider]
+ )
+ config_store.set_config_provider(variable, default_provider)
+
+ def _update_section_provider(
+ self, config_store, section_name, variable, value
+ ):
+ section_provider_copy = copy.deepcopy(
+ config_store.get_config_provider(section_name)
+ )
+ section_provider_copy.set_default_provider(
+ variable, ConstantProvider(value)
+ )
+ config_store.set_config_provider(section_name, section_provider_copy)
+
+ def _set_retryMode(self, config_store, value):
+ self._update_provider(config_store, 'retry_mode', value)
+
+ def _set_stsRegionalEndpoints(self, config_store, value):
+ self._update_provider(config_store, 'sts_regional_endpoints', value)
+
+ def _set_s3UsEast1RegionalEndpoints(self, config_store, value):
+ self._update_section_provider(
+ config_store, 's3', 'us_east_1_regional_endpoint', value
+ )
+
+ def _set_connectTimeoutInMillis(self, config_store, value):
+ self._update_provider(config_store, 'connect_timeout', value / 1000)
+
+
+class BaseProvider:
+ """Base class for configuration value providers.
+
+ A configuration provider has some method of providing a configuration
+ value.
+ """
+
+ def provide(self):
+ """Provide a config value."""
+ raise NotImplementedError('provide')
+
+
+class ChainProvider(BaseProvider):
+ """This provider wraps one or more other providers.
+
+ Each provider in the chain is called, the first one returning a non-None
+ value is then returned.
+ """
+
+ def __init__(self, providers=None, conversion_func=None):
+ """Initalize a ChainProvider.
+
+ :type providers: list
+ :param providers: The initial list of providers to check for values
+ when invoked.
+
+ :type conversion_func: None or callable
+ :param conversion_func: If this value is None then it has no affect on
+ the return type. Otherwise, it is treated as a function that will
+ transform provided value.
+ """
+ if providers is None:
+ providers = []
+ self._providers = providers
+ self._conversion_func = conversion_func
+
+ def __deepcopy__(self, memo):
+ return ChainProvider(
+ copy.deepcopy(self._providers, memo), self._conversion_func
+ )
+
+ def provide(self):
+ """Provide the value from the first provider to return non-None.
+
+ Each provider in the chain has its provide method called. The first
+ one in the chain to return a non-None value is the returned from the
+ ChainProvider. When no non-None value is found, None is returned.
+ """
+ for provider in self._providers:
+ value = provider.provide()
+ if value is not None:
+ return self._convert_type(value)
+ return None
+
+ def set_default_provider(self, default_provider):
+ if self._providers and isinstance(
+ self._providers[-1], ConstantProvider
+ ):
+ self._providers[-1] = default_provider
+ else:
+ self._providers.append(default_provider)
+
+ num_of_constants = sum(
+ isinstance(provider, ConstantProvider)
+ for provider in self._providers
+ )
+ if num_of_constants > 1:
+ logger.info(
+ 'ChainProvider object contains multiple '
+ 'instances of ConstantProvider objects'
+ )
+
+ def _convert_type(self, value):
+ if self._conversion_func is not None:
+ return self._conversion_func(value)
+ return value
+
+ def __repr__(self):
+ return '[{}]'.format(', '.join([str(p) for p in self._providers]))
+
+
+class InstanceVarProvider(BaseProvider):
+ """This class loads config values from the session instance vars."""
+
+ def __init__(self, instance_var, session):
+ """Initialize InstanceVarProvider.
+
+ :type instance_var: str
+ :param instance_var: The instance variable to load from the session.
+
+ :type session: :class:`botocore.session.Session`
+ :param session: The botocore session to get the loaded configuration
+ file variables from.
+ """
+ self._instance_var = instance_var
+ self._session = session
+
+ def __deepcopy__(self, memo):
+ return InstanceVarProvider(
+ copy.deepcopy(self._instance_var, memo), self._session
+ )
+
+ def provide(self):
+ """Provide a config value from the session instance vars."""
+ instance_vars = self._session.instance_variables()
+ value = instance_vars.get(self._instance_var)
+ return value
+
+ def __repr__(self):
+ return f'InstanceVarProvider(instance_var={self._instance_var}, session={self._session})'
+
+
+class ScopedConfigProvider(BaseProvider):
+ def __init__(self, config_var_name, session):
+ """Initialize ScopedConfigProvider.
+
+ :type config_var_name: str or tuple
+ :param config_var_name: The name of the config variable to load from
+ the configuration file. If the value is a tuple, it must only
+ consist of two items, where the first item represents the section
+ and the second item represents the config var name in the section.
+
+ :type session: :class:`botocore.session.Session`
+ :param session: The botocore session to get the loaded configuration
+ file variables from.
+ """
+ self._config_var_name = config_var_name
+ self._session = session
+
+ def __deepcopy__(self, memo):
+ return ScopedConfigProvider(
+ copy.deepcopy(self._config_var_name, memo), self._session
+ )
+
+ def provide(self):
+ """Provide a value from a config file property."""
+ scoped_config = self._session.get_scoped_config()
+ if isinstance(self._config_var_name, tuple):
+ section_config = scoped_config.get(self._config_var_name[0])
+ if not isinstance(section_config, dict):
+ return None
+ return section_config.get(self._config_var_name[1])
+ return scoped_config.get(self._config_var_name)
+
+ def __repr__(self):
+ return f'ScopedConfigProvider(config_var_name={self._config_var_name}, session={self._session})'
+
+
+class EnvironmentProvider(BaseProvider):
+ """This class loads config values from environment variables."""
+
+ def __init__(self, name, env):
+ """Initialize with the keys in the dictionary to check.
+
+ :type name: str
+ :param name: The key with that name will be loaded and returned.
+
+ :type env: dict
+ :param env: Environment variables dictionary to get variables from.
+ """
+ self._name = name
+ self._env = env
+
+ def __deepcopy__(self, memo):
+ return EnvironmentProvider(
+ copy.deepcopy(self._name, memo), copy.deepcopy(self._env, memo)
+ )
+
+ def provide(self):
+ """Provide a config value from a source dictionary."""
+ if self._name in self._env:
+ return self._env[self._name]
+ return None
+
+ def __repr__(self):
+ return f'EnvironmentProvider(name={self._name}, env={self._env})'
+
+
+class SectionConfigProvider(BaseProvider):
+ """Provides a dictionary from a section in the scoped config
+
+ This is useful for retrieving scoped config variables (i.e. s3) that have
+ their own set of config variables and resolving logic.
+ """
+
+ def __init__(self, section_name, session, override_providers=None):
+ self._section_name = section_name
+ self._session = session
+ self._scoped_config_provider = ScopedConfigProvider(
+ self._section_name, self._session
+ )
+ self._override_providers = override_providers
+ if self._override_providers is None:
+ self._override_providers = {}
+
+ def __deepcopy__(self, memo):
+ return SectionConfigProvider(
+ copy.deepcopy(self._section_name, memo),
+ self._session,
+ copy.deepcopy(self._override_providers, memo),
+ )
+
+ def provide(self):
+ section_config = self._scoped_config_provider.provide()
+ if section_config and not isinstance(section_config, dict):
+ logger.debug(
+ "The %s config key is not a dictionary type, "
+ "ignoring its value of: %s",
+ self._section_name,
+ section_config,
+ )
+ return None
+ for section_config_var, provider in self._override_providers.items():
+ provider_val = provider.provide()
+ if provider_val is not None:
+ if section_config is None:
+ section_config = {}
+ section_config[section_config_var] = provider_val
+ return section_config
+
+ def set_default_provider(self, key, default_provider):
+ provider = self._override_providers.get(key)
+ if isinstance(provider, ChainProvider):
+ provider.set_default_provider(default_provider)
+ return
+ elif isinstance(provider, BaseProvider):
+ default_provider = ChainProvider(
+ providers=[provider, default_provider]
+ )
+ self._override_providers[key] = default_provider
+
+ def __repr__(self):
+ return (
+ f'SectionConfigProvider(section_name={self._section_name}, '
+ f'session={self._session}, '
+ f'override_providers={self._override_providers})'
+ )
+
+
+class ConstantProvider(BaseProvider):
+ """This provider provides a constant value."""
+
+ def __init__(self, value):
+ self._value = value
+
+ def __deepcopy__(self, memo):
+ return ConstantProvider(copy.deepcopy(self._value, memo))
+
+ def provide(self):
+ """Provide the constant value given during initialization."""
+ return self._value
+
+ def __repr__(self):
+ return f'ConstantProvider(value={self._value})'
+
+
+class ConfiguredEndpointProvider(BaseProvider):
+ """Lookup an endpoint URL from environment variable or shared config file.
+
+ NOTE: This class is considered private and is subject to abrupt breaking
+ changes or removal without prior announcement. Please do not use it
+ directly.
+ """
+
+ _ENDPOINT_URL_LOOKUP_ORDER = [
+ 'environment_service',
+ 'environment_global',
+ 'config_service',
+ 'config_global',
+ ]
+
+ def __init__(
+ self,
+ full_config,
+ scoped_config,
+ client_name,
+ environ=None,
+ ):
+ """Initialize a ConfiguredEndpointProviderChain.
+
+ :type full_config: dict
+ :param full_config: This is the dict representing the full
+ configuration file.
+
+ :type scoped_config: dict
+ :param scoped_config: This is the dict representing the configuration
+ for the current profile for the session.
+
+ :type client_name: str
+ :param client_name: The name used to instantiate a client using
+ botocore.session.Session.create_client.
+
+ :type environ: dict
+ :param environ: A mapping to use for environment variables. If this
+ is not provided it will default to use os.environ.
+ """
+ self._full_config = full_config
+ self._scoped_config = scoped_config
+ self._client_name = client_name
+ self._transformed_service_id = self._get_snake_case_service_id(
+ self._client_name
+ )
+ if environ is None:
+ environ = os.environ
+ self._environ = environ
+
+ def provide(self):
+ """Lookup the configured endpoint URL.
+
+ The order is:
+
+ 1. The value provided by a service-specific environment variable.
+ 2. The value provided by the global endpoint environment variable
+ (AWS_ENDPOINT_URL).
+ 3. The value provided by a service-specific parameter from a services
+ definition section in the shared configuration file.
+ 4. The value provided by the global parameter from a services
+ definition section in the shared configuration file.
+ """
+ for location in self._ENDPOINT_URL_LOOKUP_ORDER:
+ logger.debug(
+ 'Looking for endpoint for %s via: %s',
+ self._client_name,
+ location,
+ )
+
+ endpoint_url = getattr(self, f'_get_endpoint_url_{location}')()
+
+ if endpoint_url:
+ logger.info(
+ 'Found endpoint for %s via: %s.',
+ self._client_name,
+ location,
+ )
+ return endpoint_url
+
+ logger.debug('No configured endpoint found.')
+ return None
+
+ def _get_snake_case_service_id(self, client_name):
+ # Get the service ID without loading the service data file, accounting
+ # for any aliases and standardizing the names with hyphens.
+ client_name = utils.SERVICE_NAME_ALIASES.get(client_name, client_name)
+ hyphenized_service_id = (
+ utils.CLIENT_NAME_TO_HYPHENIZED_SERVICE_ID_OVERRIDES.get(
+ client_name, client_name
+ )
+ )
+ return hyphenized_service_id.replace('-', '_')
+
+ def _get_service_env_var_name(self):
+ transformed_service_id_env = self._transformed_service_id.upper()
+ return f'AWS_ENDPOINT_URL_{transformed_service_id_env}'
+
+ def _get_services_config(self):
+ if 'services' not in self._scoped_config:
+ return {}
+
+ section_name = self._scoped_config['services']
+ services_section = self._full_config.get('services', {}).get(
+ section_name
+ )
+
+ if not services_section:
+ error_msg = (
+ f'The profile is configured to use the services '
+ f'section but the "{section_name}" services '
+ f'configuration does not exist.'
+ )
+ raise InvalidConfigError(error_msg=error_msg)
+
+ return services_section
+
+ def _get_endpoint_url_config_service(self):
+ snakecase_service_id = self._transformed_service_id.lower()
+ return (
+ self._get_services_config()
+ .get(snakecase_service_id, {})
+ .get('endpoint_url')
+ )
+
+ def _get_endpoint_url_config_global(self):
+ return self._scoped_config.get('endpoint_url')
+
+ def _get_endpoint_url_environment_service(self):
+ return EnvironmentProvider(
+ name=self._get_service_env_var_name(), env=self._environ
+ ).provide()
+
+ def _get_endpoint_url_environment_global(self):
+ return EnvironmentProvider(
+ name='AWS_ENDPOINT_URL', env=self._environ
+ ).provide()
diff --git a/.venv/lib/python3.12/site-packages/botocore/context.py b/.venv/lib/python3.12/site-packages/botocore/context.py
new file mode 100644
index 00000000..587690f0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/context.py
@@ -0,0 +1,128 @@
+# Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+"""
+NOTE: All classes and functions in this module are considered private and are
+subject to abrupt breaking changes. Please do not use them directly.
+"""
+
+from contextlib import contextmanager
+from contextvars import ContextVar
+from copy import deepcopy
+from dataclasses import dataclass, field
+from functools import wraps
+from typing import Set
+
+
+@dataclass
+class ClientContext:
+ """
+ Encapsulation of objects tracked within the ``_context`` context variable.
+
+ ``features`` is a set responsible for storing features used during
+ preparation of an AWS request. ``botocore.useragent.register_feature_id``
+ is used to add to this set.
+ """
+
+ features: Set[str] = field(default_factory=set)
+
+
+_context = ContextVar("_context")
+
+
+def get_context():
+ """Get the current ``_context`` context variable if set, else None."""
+ return _context.get(None)
+
+
+def set_context(ctx):
+ """Set the current ``_context`` context variable.
+
+ :type ctx: ClientContext
+ :param ctx: Client context object to set as the current context variable.
+
+ :rtype: contextvars.Token
+ :returns: Token object used to revert the context variable to what it was
+ before the corresponding set.
+ """
+ token = _context.set(ctx)
+ return token
+
+
+def reset_context(token):
+ """Reset the current ``_context`` context variable.
+
+ :type token: contextvars.Token
+ :param token: Token object to reset the context variable.
+ """
+ _context.reset(token)
+
+
+@contextmanager
+def start_as_current_context(ctx=None):
+ """
+ Context manager that copies the passed or current context object and sets
+ it as the current context variable. If no context is found, a new
+ ``ClientContext`` object is created. It mainly ensures the context variable
+ is reset to the previous value once the executed code returns.
+
+ Example usage:
+
+ def my_feature():
+ with start_as_current_context():
+ register_feature_id('MY_FEATURE')
+ pass
+
+ :type ctx: ClientContext
+ :param ctx: The client context object to set as the new context variable.
+ If not provided, the current or a new context variable is used.
+ """
+ current = ctx or get_context()
+ if current is None:
+ new = ClientContext()
+ else:
+ new = deepcopy(current)
+ token = set_context(new)
+ try:
+ yield
+ finally:
+ reset_context(token)
+
+
+def with_current_context(hook=None):
+ """
+ Decorator that wraps ``start_as_current_context`` and optionally invokes a
+ hook within the newly-set context. This is just syntactic sugar to avoid
+ indenting existing code under the context manager.
+
+ Example usage:
+
+ @with_current_context(partial(register_feature_id, 'MY_FEATURE'))
+ def my_feature():
+ pass
+
+ :type hook: callable
+ :param hook: A callable that will be invoked within the scope of the
+ ``start_as_current_context`` context manager.
+ """
+
+ def decorator(func):
+ @wraps(func)
+ def wrapper(*args, **kwargs):
+ with start_as_current_context():
+ if hook:
+ hook()
+ return func(*args, **kwargs)
+
+ return wrapper
+
+ return decorator
diff --git a/.venv/lib/python3.12/site-packages/botocore/credentials.py b/.venv/lib/python3.12/site-packages/botocore/credentials.py
new file mode 100644
index 00000000..a425cb79
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/credentials.py
@@ -0,0 +1,2391 @@
+# Copyright (c) 2012-2013 Mitch Garnaat http://garnaat.org/
+# Copyright 2012-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import datetime
+import getpass
+import json
+import logging
+import os
+import subprocess
+import threading
+import time
+from collections import namedtuple
+from copy import deepcopy
+from hashlib import sha1
+
+from dateutil.parser import parse
+from dateutil.tz import tzlocal, tzutc
+
+import botocore.compat
+import botocore.configloader
+from botocore import UNSIGNED
+from botocore.compat import compat_shell_split, total_seconds
+from botocore.config import Config
+from botocore.exceptions import (
+ ConfigNotFound,
+ CredentialRetrievalError,
+ InfiniteLoopConfigError,
+ InvalidConfigError,
+ MetadataRetrievalError,
+ PartialCredentialsError,
+ RefreshWithMFAUnsupportedError,
+ UnauthorizedSSOTokenError,
+ UnknownCredentialError,
+)
+from botocore.tokens import SSOTokenProvider
+from botocore.utils import (
+ ArnParser,
+ ContainerMetadataFetcher,
+ FileWebIdentityTokenLoader,
+ InstanceMetadataFetcher,
+ JSONFileCache,
+ SSOTokenLoader,
+ parse_key_val_file,
+ resolve_imds_endpoint_mode,
+)
+
+logger = logging.getLogger(__name__)
+ReadOnlyCredentials = namedtuple(
+ 'ReadOnlyCredentials',
+ ['access_key', 'secret_key', 'token', 'account_id'],
+ defaults=(None,),
+)
+
+_DEFAULT_MANDATORY_REFRESH_TIMEOUT = 10 * 60 # 10 min
+_DEFAULT_ADVISORY_REFRESH_TIMEOUT = 15 * 60 # 15 min
+
+
+def create_credential_resolver(session, cache=None, region_name=None):
+ """Create a default credential resolver.
+
+ This creates a pre-configured credential resolver
+ that includes the default lookup chain for
+ credentials.
+
+ """
+ profile_name = session.get_config_variable('profile') or 'default'
+ metadata_timeout = session.get_config_variable('metadata_service_timeout')
+ num_attempts = session.get_config_variable('metadata_service_num_attempts')
+ disable_env_vars = session.instance_variables().get('profile') is not None
+
+ imds_config = {
+ 'ec2_metadata_service_endpoint': session.get_config_variable(
+ 'ec2_metadata_service_endpoint'
+ ),
+ 'ec2_metadata_service_endpoint_mode': resolve_imds_endpoint_mode(
+ session
+ ),
+ 'ec2_credential_refresh_window': _DEFAULT_ADVISORY_REFRESH_TIMEOUT,
+ 'ec2_metadata_v1_disabled': session.get_config_variable(
+ 'ec2_metadata_v1_disabled'
+ ),
+ }
+
+ if cache is None:
+ cache = {}
+
+ env_provider = EnvProvider()
+ container_provider = ContainerProvider()
+ instance_metadata_provider = InstanceMetadataProvider(
+ iam_role_fetcher=InstanceMetadataFetcher(
+ timeout=metadata_timeout,
+ num_attempts=num_attempts,
+ user_agent=session.user_agent(),
+ config=imds_config,
+ )
+ )
+
+ profile_provider_builder = ProfileProviderBuilder(
+ session, cache=cache, region_name=region_name
+ )
+ assume_role_provider = AssumeRoleProvider(
+ load_config=lambda: session.full_config,
+ client_creator=_get_client_creator(session, region_name),
+ cache=cache,
+ profile_name=profile_name,
+ credential_sourcer=CanonicalNameCredentialSourcer(
+ [env_provider, container_provider, instance_metadata_provider]
+ ),
+ profile_provider_builder=profile_provider_builder,
+ )
+
+ pre_profile = [
+ env_provider,
+ assume_role_provider,
+ ]
+ profile_providers = profile_provider_builder.providers(
+ profile_name=profile_name,
+ disable_env_vars=disable_env_vars,
+ )
+ post_profile = [
+ OriginalEC2Provider(),
+ BotoProvider(),
+ container_provider,
+ instance_metadata_provider,
+ ]
+ providers = pre_profile + profile_providers + post_profile
+
+ if disable_env_vars:
+ # An explicitly provided profile will negate an EnvProvider.
+ # We will defer to providers that understand the "profile"
+ # concept to retrieve credentials.
+ # The one edge case if is all three values are provided via
+ # env vars:
+ # export AWS_ACCESS_KEY_ID=foo
+ # export AWS_SECRET_ACCESS_KEY=bar
+ # export AWS_PROFILE=baz
+ # Then, just like our client() calls, the explicit credentials
+ # will take precedence.
+ #
+ # This precedence is enforced by leaving the EnvProvider in the chain.
+ # This means that the only way a "profile" would win is if the
+ # EnvProvider does not return credentials, which is what we want
+ # in this scenario.
+ providers.remove(env_provider)
+ logger.debug(
+ 'Skipping environment variable credential check'
+ ' because profile name was explicitly set.'
+ )
+
+ resolver = CredentialResolver(providers=providers)
+ return resolver
+
+
+class ProfileProviderBuilder:
+ """This class handles the creation of profile based providers.
+
+ NOTE: This class is only intended for internal use.
+
+ This class handles the creation and ordering of the various credential
+ providers that primarly source their configuration from the shared config.
+ This is needed to enable sharing between the default credential chain and
+ the source profile chain created by the assume role provider.
+ """
+
+ def __init__(
+ self, session, cache=None, region_name=None, sso_token_cache=None
+ ):
+ self._session = session
+ self._cache = cache
+ self._region_name = region_name
+ self._sso_token_cache = sso_token_cache
+
+ def providers(self, profile_name, disable_env_vars=False):
+ return [
+ self._create_web_identity_provider(
+ profile_name,
+ disable_env_vars,
+ ),
+ self._create_sso_provider(profile_name),
+ self._create_shared_credential_provider(profile_name),
+ self._create_process_provider(profile_name),
+ self._create_config_provider(profile_name),
+ ]
+
+ def _create_process_provider(self, profile_name):
+ return ProcessProvider(
+ profile_name=profile_name,
+ load_config=lambda: self._session.full_config,
+ )
+
+ def _create_shared_credential_provider(self, profile_name):
+ credential_file = self._session.get_config_variable('credentials_file')
+ return SharedCredentialProvider(
+ profile_name=profile_name,
+ creds_filename=credential_file,
+ )
+
+ def _create_config_provider(self, profile_name):
+ config_file = self._session.get_config_variable('config_file')
+ return ConfigProvider(
+ profile_name=profile_name,
+ config_filename=config_file,
+ )
+
+ def _create_web_identity_provider(self, profile_name, disable_env_vars):
+ return AssumeRoleWithWebIdentityProvider(
+ load_config=lambda: self._session.full_config,
+ client_creator=_get_client_creator(
+ self._session, self._region_name
+ ),
+ cache=self._cache,
+ profile_name=profile_name,
+ disable_env_vars=disable_env_vars,
+ )
+
+ def _create_sso_provider(self, profile_name):
+ return SSOProvider(
+ load_config=lambda: self._session.full_config,
+ client_creator=self._session.create_client,
+ profile_name=profile_name,
+ cache=self._cache,
+ token_cache=self._sso_token_cache,
+ token_provider=SSOTokenProvider(
+ self._session,
+ cache=self._sso_token_cache,
+ profile_name=profile_name,
+ ),
+ )
+
+
+def get_credentials(session):
+ resolver = create_credential_resolver(session)
+ return resolver.load_credentials()
+
+
+def _local_now():
+ return datetime.datetime.now(tzlocal())
+
+
+def _parse_if_needed(value):
+ if isinstance(value, datetime.datetime):
+ return value
+ return parse(value)
+
+
+def _serialize_if_needed(value, iso=False):
+ if isinstance(value, datetime.datetime):
+ if iso:
+ return value.isoformat()
+ return value.strftime('%Y-%m-%dT%H:%M:%S%Z')
+ return value
+
+
+def _get_client_creator(session, region_name):
+ def client_creator(service_name, **kwargs):
+ create_client_kwargs = {'region_name': region_name}
+ create_client_kwargs.update(**kwargs)
+ return session.create_client(service_name, **create_client_kwargs)
+
+ return client_creator
+
+
+def create_assume_role_refresher(client, params):
+ def refresh():
+ response = client.assume_role(**params)
+ credentials = response['Credentials']
+ # We need to normalize the credential names to
+ # the values expected by the refresh creds.
+ return {
+ 'access_key': credentials['AccessKeyId'],
+ 'secret_key': credentials['SecretAccessKey'],
+ 'token': credentials['SessionToken'],
+ 'expiry_time': _serialize_if_needed(credentials['Expiration']),
+ }
+
+ return refresh
+
+
+def create_mfa_serial_refresher(actual_refresh):
+ class _Refresher:
+ def __init__(self, refresh):
+ self._refresh = refresh
+ self._has_been_called = False
+
+ def __call__(self):
+ if self._has_been_called:
+ # We can explore an option in the future to support
+ # reprompting for MFA, but for now we just error out
+ # when the temp creds expire.
+ raise RefreshWithMFAUnsupportedError()
+ self._has_been_called = True
+ return self._refresh()
+
+ return _Refresher(actual_refresh)
+
+
+class Credentials:
+ """
+ Holds the credentials needed to authenticate requests.
+
+ :param str access_key: The access key part of the credentials.
+ :param str secret_key: The secret key part of the credentials.
+ :param str token: The security token, valid only for session credentials.
+ :param str method: A string which identifies where the credentials
+ were found.
+ :param str account_id: (optional) An account ID associated with the credentials.
+ """
+
+ def __init__(
+ self, access_key, secret_key, token=None, method=None, account_id=None
+ ):
+ self.access_key = access_key
+ self.secret_key = secret_key
+ self.token = token
+
+ if method is None:
+ method = 'explicit'
+ self.method = method
+ self.account_id = account_id
+
+ self._normalize()
+
+ def _normalize(self):
+ # Keys would sometimes (accidentally) contain non-ascii characters.
+ # It would cause a confusing UnicodeDecodeError in Python 2.
+ # We explicitly convert them into unicode to avoid such error.
+ #
+ # Eventually the service will decide whether to accept the credential.
+ # This also complies with the behavior in Python 3.
+ self.access_key = botocore.compat.ensure_unicode(self.access_key)
+ self.secret_key = botocore.compat.ensure_unicode(self.secret_key)
+
+ def get_frozen_credentials(self):
+ return ReadOnlyCredentials(
+ self.access_key, self.secret_key, self.token, self.account_id
+ )
+
+ def get_deferred_property(self, property_name):
+ def get_property():
+ return getattr(self, property_name, None)
+
+ return get_property
+
+
+class RefreshableCredentials(Credentials):
+ """
+ Holds the credentials needed to authenticate requests. In addition, it
+ knows how to refresh itself.
+
+ :param str access_key: The access key part of the credentials.
+ :param str secret_key: The secret key part of the credentials.
+ :param str token: The security token, valid only for session credentials.
+ :param datetime expiry_time: The expiration time of the credentials.
+ :param function refresh_using: Callback function to refresh the credentials.
+ :param str method: A string which identifies where the credentials
+ were found.
+ :param function time_fetcher: Callback function to retrieve current time.
+ """
+
+ # The time at which we'll attempt to refresh, but not
+ # block if someone else is refreshing.
+ _advisory_refresh_timeout = _DEFAULT_ADVISORY_REFRESH_TIMEOUT
+ # The time at which all threads will block waiting for
+ # refreshed credentials.
+ _mandatory_refresh_timeout = _DEFAULT_MANDATORY_REFRESH_TIMEOUT
+
+ def __init__(
+ self,
+ access_key,
+ secret_key,
+ token,
+ expiry_time,
+ refresh_using,
+ method,
+ time_fetcher=_local_now,
+ advisory_timeout=None,
+ mandatory_timeout=None,
+ account_id=None,
+ ):
+ self._refresh_using = refresh_using
+ self._access_key = access_key
+ self._secret_key = secret_key
+ self._token = token
+ self._account_id = account_id
+ self._expiry_time = expiry_time
+ self._time_fetcher = time_fetcher
+ self._refresh_lock = threading.Lock()
+ self.method = method
+ self._frozen_credentials = ReadOnlyCredentials(
+ access_key, secret_key, token, account_id
+ )
+ self._normalize()
+ if advisory_timeout is not None:
+ self._advisory_refresh_timeout = advisory_timeout
+ if mandatory_timeout is not None:
+ self._mandatory_refresh_timeout = mandatory_timeout
+
+ def _normalize(self):
+ self._access_key = botocore.compat.ensure_unicode(self._access_key)
+ self._secret_key = botocore.compat.ensure_unicode(self._secret_key)
+
+ @classmethod
+ def create_from_metadata(
+ cls,
+ metadata,
+ refresh_using,
+ method,
+ advisory_timeout=None,
+ mandatory_timeout=None,
+ ):
+ kwargs = {}
+ if advisory_timeout is not None:
+ kwargs['advisory_timeout'] = advisory_timeout
+ if mandatory_timeout is not None:
+ kwargs['mandatory_timeout'] = mandatory_timeout
+
+ instance = cls(
+ access_key=metadata['access_key'],
+ secret_key=metadata['secret_key'],
+ token=metadata['token'],
+ expiry_time=cls._expiry_datetime(metadata['expiry_time']),
+ method=method,
+ refresh_using=refresh_using,
+ account_id=metadata.get('account_id'),
+ **kwargs,
+ )
+ return instance
+
+ @property
+ def access_key(self):
+ """Warning: Using this property can lead to race conditions if you
+ access another property subsequently along the refresh boundary.
+ Please use get_frozen_credentials instead.
+ """
+ self._refresh()
+ return self._access_key
+
+ @access_key.setter
+ def access_key(self, value):
+ self._access_key = value
+
+ @property
+ def secret_key(self):
+ """Warning: Using this property can lead to race conditions if you
+ access another property subsequently along the refresh boundary.
+ Please use get_frozen_credentials instead.
+ """
+ self._refresh()
+ return self._secret_key
+
+ @secret_key.setter
+ def secret_key(self, value):
+ self._secret_key = value
+
+ @property
+ def token(self):
+ """Warning: Using this property can lead to race conditions if you
+ access another property subsequently along the refresh boundary.
+ Please use get_frozen_credentials instead.
+ """
+ self._refresh()
+ return self._token
+
+ @token.setter
+ def token(self, value):
+ self._token = value
+
+ @property
+ def account_id(self):
+ """Warning: Using this property can lead to race conditions if you
+ access another property subsequently along the refresh boundary.
+ Please use get_frozen_credentials instead.
+ """
+ self._refresh()
+ return self._account_id
+
+ @account_id.setter
+ def account_id(self, value):
+ self._account_id = value
+
+ def _seconds_remaining(self):
+ delta = self._expiry_time - self._time_fetcher()
+ return total_seconds(delta)
+
+ def refresh_needed(self, refresh_in=None):
+ """Check if a refresh is needed.
+
+ A refresh is needed if the expiry time associated
+ with the temporary credentials is less than the
+ provided ``refresh_in``. If ``time_delta`` is not
+ provided, ``self.advisory_refresh_needed`` will be used.
+
+ For example, if your temporary credentials expire
+ in 10 minutes and the provided ``refresh_in`` is
+ ``15 * 60``, then this function will return ``True``.
+
+ :type refresh_in: int
+ :param refresh_in: The number of seconds before the
+ credentials expire in which refresh attempts should
+ be made.
+
+ :return: True if refresh needed, False otherwise.
+
+ """
+ if self._expiry_time is None:
+ # No expiration, so assume we don't need to refresh.
+ return False
+
+ if refresh_in is None:
+ refresh_in = self._advisory_refresh_timeout
+ # The credentials should be refreshed if they're going to expire
+ # in less than 5 minutes.
+ if self._seconds_remaining() >= refresh_in:
+ # There's enough time left. Don't refresh.
+ return False
+ logger.debug("Credentials need to be refreshed.")
+ return True
+
+ def _is_expired(self):
+ # Checks if the current credentials are expired.
+ return self.refresh_needed(refresh_in=0)
+
+ def _refresh(self):
+ # In the common case where we don't need a refresh, we
+ # can immediately exit and not require acquiring the
+ # refresh lock.
+ if not self.refresh_needed(self._advisory_refresh_timeout):
+ return
+
+ # acquire() doesn't accept kwargs, but False is indicating
+ # that we should not block if we can't acquire the lock.
+ # If we aren't able to acquire the lock, we'll trigger
+ # the else clause.
+ if self._refresh_lock.acquire(False):
+ try:
+ if not self.refresh_needed(self._advisory_refresh_timeout):
+ return
+ is_mandatory_refresh = self.refresh_needed(
+ self._mandatory_refresh_timeout
+ )
+ self._protected_refresh(is_mandatory=is_mandatory_refresh)
+ return
+ finally:
+ self._refresh_lock.release()
+ elif self.refresh_needed(self._mandatory_refresh_timeout):
+ # If we're within the mandatory refresh window,
+ # we must block until we get refreshed credentials.
+ with self._refresh_lock:
+ if not self.refresh_needed(self._mandatory_refresh_timeout):
+ return
+ self._protected_refresh(is_mandatory=True)
+
+ def _protected_refresh(self, is_mandatory):
+ # precondition: this method should only be called if you've acquired
+ # the self._refresh_lock.
+ try:
+ metadata = self._refresh_using()
+ except Exception:
+ period_name = 'mandatory' if is_mandatory else 'advisory'
+ logger.warning(
+ "Refreshing temporary credentials failed "
+ "during %s refresh period.",
+ period_name,
+ exc_info=True,
+ )
+ if is_mandatory:
+ # If this is a mandatory refresh, then
+ # all errors that occur when we attempt to refresh
+ # credentials are propagated back to the user.
+ raise
+ # Otherwise we'll just return.
+ # The end result will be that we'll use the current
+ # set of temporary credentials we have.
+ return
+ self._set_from_data(metadata)
+ self._frozen_credentials = ReadOnlyCredentials(
+ self._access_key, self._secret_key, self._token, self._account_id
+ )
+ if self._is_expired():
+ # We successfully refreshed credentials but for whatever
+ # reason, our refreshing function returned credentials
+ # that are still expired. In this scenario, the only
+ # thing we can do is let the user know and raise
+ # an exception.
+ msg = (
+ "Credentials were refreshed, but the "
+ "refreshed credentials are still expired."
+ )
+ logger.warning(msg)
+ raise RuntimeError(msg)
+
+ @staticmethod
+ def _expiry_datetime(time_str):
+ return parse(time_str)
+
+ def _set_from_data(self, data):
+ expected_keys = ['access_key', 'secret_key', 'token', 'expiry_time']
+ if not data:
+ missing_keys = expected_keys
+ else:
+ missing_keys = [k for k in expected_keys if k not in data]
+
+ if missing_keys:
+ message = "Credential refresh failed, response did not contain: %s"
+ raise CredentialRetrievalError(
+ provider=self.method,
+ error_msg=message % ', '.join(missing_keys),
+ )
+
+ self.access_key = data['access_key']
+ self.secret_key = data['secret_key']
+ self.token = data['token']
+ self._expiry_time = parse(data['expiry_time'])
+ self.account_id = data.get('account_id')
+ logger.debug(
+ "Retrieved credentials will expire at: %s", self._expiry_time
+ )
+ self._normalize()
+
+ def get_frozen_credentials(self):
+ """Return immutable credentials.
+
+ The ``access_key``, ``secret_key``, and ``token`` properties
+ on this class will always check and refresh credentials if
+ needed before returning the particular credentials.
+
+ This has an edge case where you can get inconsistent
+ credentials. Imagine this:
+
+ # Current creds are "t1"
+ tmp.access_key ---> expired? no, so return t1.access_key
+ # ---- time is now expired, creds need refreshing to "t2" ----
+ tmp.secret_key ---> expired? yes, refresh and return t2.secret_key
+
+ This means we're using the access key from t1 with the secret key
+ from t2. To fix this issue, you can request a frozen credential object
+ which is guaranteed not to change.
+
+ The frozen credentials returned from this method should be used
+ immediately and then discarded. The typical usage pattern would
+ be::
+
+ creds = RefreshableCredentials(...)
+ some_code = SomeSignerObject()
+ # I'm about to sign the request.
+ # The frozen credentials are only used for the
+ # duration of generate_presigned_url and will be
+ # immediately thrown away.
+ request = some_code.sign_some_request(
+ with_credentials=creds.get_frozen_credentials())
+ print("Signed request:", request)
+
+ """
+ self._refresh()
+ return self._frozen_credentials
+
+
+class DeferredRefreshableCredentials(RefreshableCredentials):
+ """Refreshable credentials that don't require initial credentials.
+
+ refresh_using will be called upon first access.
+ """
+
+ def __init__(self, refresh_using, method, time_fetcher=_local_now):
+ self._refresh_using = refresh_using
+ self._access_key = None
+ self._secret_key = None
+ self._token = None
+ self._account_id = None
+ self._expiry_time = None
+ self._time_fetcher = time_fetcher
+ self._refresh_lock = threading.Lock()
+ self.method = method
+ self._frozen_credentials = None
+
+ def refresh_needed(self, refresh_in=None):
+ if self._frozen_credentials is None:
+ return True
+ return super().refresh_needed(refresh_in)
+
+
+class CachedCredentialFetcher:
+ DEFAULT_EXPIRY_WINDOW_SECONDS = 60 * 15
+
+ def __init__(self, cache=None, expiry_window_seconds=None):
+ if cache is None:
+ cache = {}
+ self._cache = cache
+ self._cache_key = self._create_cache_key()
+ if expiry_window_seconds is None:
+ expiry_window_seconds = self.DEFAULT_EXPIRY_WINDOW_SECONDS
+ self._expiry_window_seconds = expiry_window_seconds
+
+ def _create_cache_key(self):
+ raise NotImplementedError('_create_cache_key()')
+
+ def _make_file_safe(self, filename):
+ # Replace :, path sep, and / to make it the string filename safe.
+ filename = filename.replace(':', '_').replace(os.sep, '_')
+ return filename.replace('/', '_')
+
+ def _get_credentials(self):
+ raise NotImplementedError('_get_credentials()')
+
+ def fetch_credentials(self):
+ return self._get_cached_credentials()
+
+ def _get_cached_credentials(self):
+ """Get up-to-date credentials.
+
+ This will check the cache for up-to-date credentials, calling assume
+ role if none are available.
+ """
+ response = self._load_from_cache()
+ if response is None:
+ response = self._get_credentials()
+ self._write_to_cache(response)
+ else:
+ logger.debug("Credentials for role retrieved from cache.")
+
+ creds = response['Credentials']
+ expiration = _serialize_if_needed(creds['Expiration'], iso=True)
+ credentials = {
+ 'access_key': creds['AccessKeyId'],
+ 'secret_key': creds['SecretAccessKey'],
+ 'token': creds['SessionToken'],
+ 'expiry_time': expiration,
+ 'account_id': creds.get('AccountId'),
+ }
+
+ return credentials
+
+ def _load_from_cache(self):
+ if self._cache_key in self._cache:
+ creds = deepcopy(self._cache[self._cache_key])
+ if not self._is_expired(creds):
+ return creds
+ else:
+ logger.debug(
+ "Credentials were found in cache, but they are expired."
+ )
+ return None
+
+ def _write_to_cache(self, response):
+ self._cache[self._cache_key] = deepcopy(response)
+
+ def _is_expired(self, credentials):
+ """Check if credentials are expired."""
+ end_time = _parse_if_needed(credentials['Credentials']['Expiration'])
+ seconds = total_seconds(end_time - _local_now())
+ return seconds < self._expiry_window_seconds
+
+
+class BaseAssumeRoleCredentialFetcher(CachedCredentialFetcher):
+ def __init__(
+ self,
+ client_creator,
+ role_arn,
+ extra_args=None,
+ cache=None,
+ expiry_window_seconds=None,
+ ):
+ self._client_creator = client_creator
+ self._role_arn = role_arn
+
+ if extra_args is None:
+ self._assume_kwargs = {}
+ else:
+ self._assume_kwargs = deepcopy(extra_args)
+ self._assume_kwargs['RoleArn'] = self._role_arn
+
+ self._role_session_name = self._assume_kwargs.get('RoleSessionName')
+ self._using_default_session_name = False
+ if not self._role_session_name:
+ self._generate_assume_role_name()
+
+ super().__init__(cache, expiry_window_seconds)
+
+ def _generate_assume_role_name(self):
+ self._role_session_name = f'botocore-session-{int(time.time())}'
+ self._assume_kwargs['RoleSessionName'] = self._role_session_name
+ self._using_default_session_name = True
+
+ def _create_cache_key(self):
+ """Create a predictable cache key for the current configuration.
+
+ The cache key is intended to be compatible with file names.
+ """
+ args = deepcopy(self._assume_kwargs)
+
+ # The role session name gets randomly generated, so we don't want it
+ # in the hash.
+ if self._using_default_session_name:
+ del args['RoleSessionName']
+
+ if 'Policy' in args:
+ # To have a predictable hash, the keys of the policy must be
+ # sorted, so we have to load it here to make sure it gets sorted
+ # later on.
+ args['Policy'] = json.loads(args['Policy'])
+
+ args = json.dumps(args, sort_keys=True)
+ argument_hash = sha1(args.encode('utf-8')).hexdigest()
+ return self._make_file_safe(argument_hash)
+
+ def _add_account_id_to_response(self, response):
+ role_arn = response.get('AssumedRoleUser', {}).get('Arn')
+ if ArnParser.is_arn(role_arn):
+ arn_parser = ArnParser()
+ account_id = arn_parser.parse_arn(role_arn)['account']
+ response['Credentials']['AccountId'] = account_id
+ else:
+ logger.debug(f"Unable to extract account ID from Arn: {role_arn}")
+
+
+class AssumeRoleCredentialFetcher(BaseAssumeRoleCredentialFetcher):
+ def __init__(
+ self,
+ client_creator,
+ source_credentials,
+ role_arn,
+ extra_args=None,
+ mfa_prompter=None,
+ cache=None,
+ expiry_window_seconds=None,
+ ):
+ """
+ :type client_creator: callable
+ :param client_creator: A callable that creates a client taking
+ arguments like ``Session.create_client``.
+
+ :type source_credentials: Credentials
+ :param source_credentials: The credentials to use to create the
+ client for the call to AssumeRole.
+
+ :type role_arn: str
+ :param role_arn: The ARN of the role to be assumed.
+
+ :type extra_args: dict
+ :param extra_args: Any additional arguments to add to the assume
+ role request using the format of the botocore operation.
+ Possible keys include, but may not be limited to,
+ DurationSeconds, Policy, SerialNumber, ExternalId and
+ RoleSessionName.
+
+ :type mfa_prompter: callable
+ :param mfa_prompter: A callable that returns input provided by the
+ user (i.e raw_input, getpass.getpass, etc.).
+
+ :type cache: dict
+ :param cache: An object that supports ``__getitem__``,
+ ``__setitem__``, and ``__contains__``. An example of this is
+ the ``JSONFileCache`` class in aws-cli.
+
+ :type expiry_window_seconds: int
+ :param expiry_window_seconds: The amount of time, in seconds,
+ """
+ self._source_credentials = source_credentials
+ self._mfa_prompter = mfa_prompter
+ if self._mfa_prompter is None:
+ self._mfa_prompter = getpass.getpass
+
+ super().__init__(
+ client_creator,
+ role_arn,
+ extra_args=extra_args,
+ cache=cache,
+ expiry_window_seconds=expiry_window_seconds,
+ )
+
+ def _get_credentials(self):
+ """Get credentials by calling assume role."""
+ kwargs = self._assume_role_kwargs()
+ client = self._create_client()
+ response = client.assume_role(**kwargs)
+ self._add_account_id_to_response(response)
+ return response
+
+ def _assume_role_kwargs(self):
+ """Get the arguments for assume role based on current configuration."""
+ assume_role_kwargs = deepcopy(self._assume_kwargs)
+
+ mfa_serial = assume_role_kwargs.get('SerialNumber')
+
+ if mfa_serial is not None:
+ prompt = f'Enter MFA code for {mfa_serial}: '
+ token_code = self._mfa_prompter(prompt)
+ assume_role_kwargs['TokenCode'] = token_code
+
+ duration_seconds = assume_role_kwargs.get('DurationSeconds')
+
+ if duration_seconds is not None:
+ assume_role_kwargs['DurationSeconds'] = duration_seconds
+
+ return assume_role_kwargs
+
+ def _create_client(self):
+ """Create an STS client using the source credentials."""
+ frozen_credentials = self._source_credentials.get_frozen_credentials()
+ return self._client_creator(
+ 'sts',
+ aws_access_key_id=frozen_credentials.access_key,
+ aws_secret_access_key=frozen_credentials.secret_key,
+ aws_session_token=frozen_credentials.token,
+ )
+
+
+class AssumeRoleWithWebIdentityCredentialFetcher(
+ BaseAssumeRoleCredentialFetcher
+):
+ def __init__(
+ self,
+ client_creator,
+ web_identity_token_loader,
+ role_arn,
+ extra_args=None,
+ cache=None,
+ expiry_window_seconds=None,
+ ):
+ """
+ :type client_creator: callable
+ :param client_creator: A callable that creates a client taking
+ arguments like ``Session.create_client``.
+
+ :type web_identity_token_loader: callable
+ :param web_identity_token_loader: A callable that takes no arguments
+ and returns a web identity token str.
+
+ :type role_arn: str
+ :param role_arn: The ARN of the role to be assumed.
+
+ :type extra_args: dict
+ :param extra_args: Any additional arguments to add to the assume
+ role request using the format of the botocore operation.
+ Possible keys include, but may not be limited to,
+ DurationSeconds, Policy, SerialNumber, ExternalId and
+ RoleSessionName.
+
+ :type cache: dict
+ :param cache: An object that supports ``__getitem__``,
+ ``__setitem__``, and ``__contains__``. An example of this is
+ the ``JSONFileCache`` class in aws-cli.
+
+ :type expiry_window_seconds: int
+ :param expiry_window_seconds: The amount of time, in seconds,
+ """
+ self._web_identity_token_loader = web_identity_token_loader
+
+ super().__init__(
+ client_creator,
+ role_arn,
+ extra_args=extra_args,
+ cache=cache,
+ expiry_window_seconds=expiry_window_seconds,
+ )
+
+ def _get_credentials(self):
+ """Get credentials by calling assume role."""
+ kwargs = self._assume_role_kwargs()
+ # Assume role with web identity does not require credentials other than
+ # the token, explicitly configure the client to not sign requests.
+ config = Config(signature_version=UNSIGNED)
+ client = self._client_creator('sts', config=config)
+ response = client.assume_role_with_web_identity(**kwargs)
+ self._add_account_id_to_response(response)
+ return response
+
+ def _assume_role_kwargs(self):
+ """Get the arguments for assume role based on current configuration."""
+ assume_role_kwargs = deepcopy(self._assume_kwargs)
+ identity_token = self._web_identity_token_loader()
+ assume_role_kwargs['WebIdentityToken'] = identity_token
+
+ return assume_role_kwargs
+
+
+class CredentialProvider:
+ # A short name to identify the provider within botocore.
+ METHOD = None
+
+ # A name to identify the provider for use in cross-sdk features like
+ # assume role's `credential_source` configuration option. These names
+ # are to be treated in a case-insensitive way. NOTE: any providers not
+ # implemented in botocore MUST prefix their canonical names with
+ # 'custom' or we DO NOT guarantee that it will work with any features
+ # that this provides.
+ CANONICAL_NAME = None
+
+ def __init__(self, session=None):
+ self.session = session
+
+ def load(self):
+ """
+ Loads the credentials from their source & sets them on the object.
+
+ Subclasses should implement this method (by reading from disk, the
+ environment, the network or wherever), returning ``True`` if they were
+ found & loaded.
+
+ If not found, this method should return ``False``, indictating that the
+ ``CredentialResolver`` should fall back to the next available method.
+
+ The default implementation does nothing, assuming the user has set the
+ ``access_key/secret_key/token`` themselves.
+
+ :returns: Whether credentials were found & set
+ :rtype: Credentials
+ """
+ return True
+
+ def _extract_creds_from_mapping(self, mapping, *key_names):
+ found = []
+ for key_name in key_names:
+ try:
+ found.append(mapping[key_name])
+ except KeyError:
+ raise PartialCredentialsError(
+ provider=self.METHOD, cred_var=key_name
+ )
+ return found
+
+
+class ProcessProvider(CredentialProvider):
+ METHOD = 'custom-process'
+
+ def __init__(self, profile_name, load_config, popen=subprocess.Popen):
+ self._profile_name = profile_name
+ self._load_config = load_config
+ self._loaded_config = None
+ self._popen = popen
+
+ def load(self):
+ credential_process = self._credential_process
+ if credential_process is None:
+ return
+
+ creds_dict = self._retrieve_credentials_using(credential_process)
+ if creds_dict.get('expiry_time') is not None:
+ return RefreshableCredentials.create_from_metadata(
+ creds_dict,
+ lambda: self._retrieve_credentials_using(credential_process),
+ self.METHOD,
+ )
+
+ return Credentials(
+ access_key=creds_dict['access_key'],
+ secret_key=creds_dict['secret_key'],
+ token=creds_dict.get('token'),
+ method=self.METHOD,
+ account_id=creds_dict.get('account_id'),
+ )
+
+ def _retrieve_credentials_using(self, credential_process):
+ # We're not using shell=True, so we need to pass the
+ # command and all arguments as a list.
+ process_list = compat_shell_split(credential_process)
+ p = self._popen(
+ process_list, stdout=subprocess.PIPE, stderr=subprocess.PIPE
+ )
+ stdout, stderr = p.communicate()
+ if p.returncode != 0:
+ raise CredentialRetrievalError(
+ provider=self.METHOD, error_msg=stderr.decode('utf-8')
+ )
+ parsed = botocore.compat.json.loads(stdout.decode('utf-8'))
+ version = parsed.get('Version', '<Version key not provided>')
+ if version != 1:
+ raise CredentialRetrievalError(
+ provider=self.METHOD,
+ error_msg=(
+ f"Unsupported version '{version}' for credential process "
+ f"provider, supported versions: 1"
+ ),
+ )
+ try:
+ return {
+ 'access_key': parsed['AccessKeyId'],
+ 'secret_key': parsed['SecretAccessKey'],
+ 'token': parsed.get('SessionToken'),
+ 'expiry_time': parsed.get('Expiration'),
+ 'account_id': self._get_account_id(parsed),
+ }
+ except KeyError as e:
+ raise CredentialRetrievalError(
+ provider=self.METHOD,
+ error_msg=f"Missing required key in response: {e}",
+ )
+
+ @property
+ def _credential_process(self):
+ return self.profile_config.get('credential_process')
+
+ @property
+ def profile_config(self):
+ if self._loaded_config is None:
+ self._loaded_config = self._load_config()
+ profile_config = self._loaded_config.get('profiles', {}).get(
+ self._profile_name, {}
+ )
+ return profile_config
+
+ def _get_account_id(self, parsed):
+ account_id = parsed.get('AccountId')
+ return account_id or self.profile_config.get('aws_account_id')
+
+
+class InstanceMetadataProvider(CredentialProvider):
+ METHOD = 'iam-role'
+ CANONICAL_NAME = 'Ec2InstanceMetadata'
+
+ def __init__(self, iam_role_fetcher):
+ self._role_fetcher = iam_role_fetcher
+
+ def load(self):
+ fetcher = self._role_fetcher
+ # We do the first request, to see if we get useful data back.
+ # If not, we'll pass & move on to whatever's next in the credential
+ # chain.
+ metadata = fetcher.retrieve_iam_role_credentials()
+ if not metadata:
+ return None
+ logger.info(
+ 'Found credentials from IAM Role: %s', metadata['role_name']
+ )
+ # We manually set the data here, since we already made the request &
+ # have it. When the expiry is hit, the credentials will auto-refresh
+ # themselves.
+ creds = RefreshableCredentials.create_from_metadata(
+ metadata,
+ method=self.METHOD,
+ refresh_using=fetcher.retrieve_iam_role_credentials,
+ )
+ return creds
+
+
+class EnvProvider(CredentialProvider):
+ METHOD = 'env'
+ CANONICAL_NAME = 'Environment'
+ ACCESS_KEY = 'AWS_ACCESS_KEY_ID'
+ SECRET_KEY = 'AWS_SECRET_ACCESS_KEY'
+ # The token can come from either of these env var.
+ # AWS_SESSION_TOKEN is what other AWS SDKs have standardized on.
+ TOKENS = ['AWS_SECURITY_TOKEN', 'AWS_SESSION_TOKEN']
+ EXPIRY_TIME = 'AWS_CREDENTIAL_EXPIRATION'
+ ACCOUNT_ID = 'AWS_ACCOUNT_ID'
+
+ def __init__(self, environ=None, mapping=None):
+ """
+
+ :param environ: The environment variables (defaults to
+ ``os.environ`` if no value is provided).
+ :param mapping: An optional mapping of variable names to
+ environment variable names. Use this if you want to
+ change the mapping of access_key->AWS_ACCESS_KEY_ID, etc.
+ The dict can have up to 5 keys:
+ * ``access_key``
+ * ``secret_key``
+ * ``token``
+ * ``expiry_time``
+ * ``account_id``
+ """
+ if environ is None:
+ environ = os.environ
+ self.environ = environ
+ self._mapping = self._build_mapping(mapping)
+
+ def _build_mapping(self, mapping):
+ # Mapping of variable name to env var name.
+ var_mapping = {}
+ if mapping is None:
+ # Use the class var default.
+ var_mapping['access_key'] = self.ACCESS_KEY
+ var_mapping['secret_key'] = self.SECRET_KEY
+ var_mapping['token'] = self.TOKENS
+ var_mapping['expiry_time'] = self.EXPIRY_TIME
+ var_mapping['account_id'] = self.ACCOUNT_ID
+ else:
+ var_mapping['access_key'] = mapping.get(
+ 'access_key', self.ACCESS_KEY
+ )
+ var_mapping['secret_key'] = mapping.get(
+ 'secret_key', self.SECRET_KEY
+ )
+ var_mapping['token'] = mapping.get('token', self.TOKENS)
+ if not isinstance(var_mapping['token'], list):
+ var_mapping['token'] = [var_mapping['token']]
+ var_mapping['expiry_time'] = mapping.get(
+ 'expiry_time', self.EXPIRY_TIME
+ )
+ var_mapping['account_id'] = mapping.get(
+ 'account_id', self.ACCOUNT_ID
+ )
+ return var_mapping
+
+ def load(self):
+ """
+ Search for credentials in explicit environment variables.
+ """
+
+ access_key = self.environ.get(self._mapping['access_key'], '')
+
+ if access_key:
+ logger.info('Found credentials in environment variables.')
+ fetcher = self._create_credentials_fetcher()
+ credentials = fetcher(require_expiry=False)
+
+ expiry_time = credentials['expiry_time']
+ if expiry_time is not None:
+ expiry_time = parse(expiry_time)
+ return RefreshableCredentials(
+ credentials['access_key'],
+ credentials['secret_key'],
+ credentials['token'],
+ expiry_time,
+ refresh_using=fetcher,
+ method=self.METHOD,
+ account_id=credentials['account_id'],
+ )
+
+ return Credentials(
+ credentials['access_key'],
+ credentials['secret_key'],
+ credentials['token'],
+ method=self.METHOD,
+ account_id=credentials['account_id'],
+ )
+ else:
+ return None
+
+ def _create_credentials_fetcher(self):
+ mapping = self._mapping
+ method = self.METHOD
+ environ = self.environ
+
+ def fetch_credentials(require_expiry=True):
+ credentials = {}
+
+ access_key = environ.get(mapping['access_key'], '')
+ if not access_key:
+ raise PartialCredentialsError(
+ provider=method, cred_var=mapping['access_key']
+ )
+ credentials['access_key'] = access_key
+
+ secret_key = environ.get(mapping['secret_key'], '')
+ if not secret_key:
+ raise PartialCredentialsError(
+ provider=method, cred_var=mapping['secret_key']
+ )
+ credentials['secret_key'] = secret_key
+
+ credentials['token'] = None
+ for token_env_var in mapping['token']:
+ token = environ.get(token_env_var, '')
+ if token:
+ credentials['token'] = token
+ break
+
+ credentials['expiry_time'] = None
+ expiry_time = environ.get(mapping['expiry_time'], '')
+ if expiry_time:
+ credentials['expiry_time'] = expiry_time
+ if require_expiry and not expiry_time:
+ raise PartialCredentialsError(
+ provider=method, cred_var=mapping['expiry_time']
+ )
+
+ credentials['account_id'] = None
+ account_id = environ.get(mapping['account_id'], '')
+ if account_id:
+ credentials['account_id'] = account_id
+
+ return credentials
+
+ return fetch_credentials
+
+
+class OriginalEC2Provider(CredentialProvider):
+ METHOD = 'ec2-credentials-file'
+ CANONICAL_NAME = 'Ec2Config'
+
+ CRED_FILE_ENV = 'AWS_CREDENTIAL_FILE'
+ ACCESS_KEY = 'AWSAccessKeyId'
+ SECRET_KEY = 'AWSSecretKey'
+
+ def __init__(self, environ=None, parser=None):
+ if environ is None:
+ environ = os.environ
+ if parser is None:
+ parser = parse_key_val_file
+ self._environ = environ
+ self._parser = parser
+
+ def load(self):
+ """
+ Search for a credential file used by original EC2 CLI tools.
+ """
+ if 'AWS_CREDENTIAL_FILE' in self._environ:
+ full_path = os.path.expanduser(
+ self._environ['AWS_CREDENTIAL_FILE']
+ )
+ creds = self._parser(full_path)
+ if self.ACCESS_KEY in creds:
+ logger.info('Found credentials in AWS_CREDENTIAL_FILE.')
+ access_key = creds[self.ACCESS_KEY]
+ secret_key = creds[self.SECRET_KEY]
+ # EC2 creds file doesn't support session tokens.
+ return Credentials(access_key, secret_key, method=self.METHOD)
+ else:
+ return None
+
+
+class SharedCredentialProvider(CredentialProvider):
+ METHOD = 'shared-credentials-file'
+ CANONICAL_NAME = 'SharedCredentials'
+
+ ACCESS_KEY = 'aws_access_key_id'
+ SECRET_KEY = 'aws_secret_access_key'
+ # Same deal as the EnvProvider above. Botocore originally supported
+ # aws_security_token, but the SDKs are standardizing on aws_session_token
+ # so we support both.
+ TOKENS = ['aws_security_token', 'aws_session_token']
+ ACCOUNT_ID = 'aws_account_id'
+
+ def __init__(self, creds_filename, profile_name=None, ini_parser=None):
+ self._creds_filename = creds_filename
+ if profile_name is None:
+ profile_name = 'default'
+ self._profile_name = profile_name
+ if ini_parser is None:
+ ini_parser = botocore.configloader.raw_config_parse
+ self._ini_parser = ini_parser
+
+ def load(self):
+ try:
+ available_creds = self._ini_parser(self._creds_filename)
+ except ConfigNotFound:
+ return None
+ if self._profile_name in available_creds:
+ config = available_creds[self._profile_name]
+ if self.ACCESS_KEY in config:
+ logger.info(
+ "Found credentials in shared credentials file: %s",
+ self._creds_filename,
+ )
+ access_key, secret_key = self._extract_creds_from_mapping(
+ config, self.ACCESS_KEY, self.SECRET_KEY
+ )
+ token = self._get_session_token(config)
+ account_id = self._get_account_id(config)
+ return Credentials(
+ access_key,
+ secret_key,
+ token,
+ method=self.METHOD,
+ account_id=account_id,
+ )
+
+ def _get_session_token(self, config):
+ for token_envvar in self.TOKENS:
+ if token_envvar in config:
+ return config[token_envvar]
+
+ def _get_account_id(self, config):
+ return config.get(self.ACCOUNT_ID)
+
+
+class ConfigProvider(CredentialProvider):
+ """INI based config provider with profile sections."""
+
+ METHOD = 'config-file'
+ CANONICAL_NAME = 'SharedConfig'
+
+ ACCESS_KEY = 'aws_access_key_id'
+ SECRET_KEY = 'aws_secret_access_key'
+ # Same deal as the EnvProvider above. Botocore originally supported
+ # aws_security_token, but the SDKs are standardizing on aws_session_token
+ # so we support both.
+ TOKENS = ['aws_security_token', 'aws_session_token']
+ ACCOUNT_ID = 'aws_account_id'
+
+ def __init__(self, config_filename, profile_name, config_parser=None):
+ """
+
+ :param config_filename: The session configuration scoped to the current
+ profile. This is available via ``session.config``.
+ :param profile_name: The name of the current profile.
+ :param config_parser: A config parser callable.
+
+ """
+ self._config_filename = config_filename
+ self._profile_name = profile_name
+ if config_parser is None:
+ config_parser = botocore.configloader.load_config
+ self._config_parser = config_parser
+
+ def load(self):
+ """
+ If there is are credentials in the configuration associated with
+ the session, use those.
+ """
+ try:
+ full_config = self._config_parser(self._config_filename)
+ except ConfigNotFound:
+ return None
+ if self._profile_name in full_config['profiles']:
+ profile_config = full_config['profiles'][self._profile_name]
+ if self.ACCESS_KEY in profile_config:
+ logger.info(
+ "Credentials found in config file: %s",
+ self._config_filename,
+ )
+ access_key, secret_key = self._extract_creds_from_mapping(
+ profile_config, self.ACCESS_KEY, self.SECRET_KEY
+ )
+ token = self._get_session_token(profile_config)
+ account_id = self._get_account_id(profile_config)
+ return Credentials(
+ access_key,
+ secret_key,
+ token,
+ method=self.METHOD,
+ account_id=account_id,
+ )
+ else:
+ return None
+
+ def _get_session_token(self, profile_config):
+ for token_name in self.TOKENS:
+ if token_name in profile_config:
+ return profile_config[token_name]
+
+ def _get_account_id(self, config):
+ return config.get(self.ACCOUNT_ID)
+
+
+class BotoProvider(CredentialProvider):
+ METHOD = 'boto-config'
+ CANONICAL_NAME = 'Boto2Config'
+
+ BOTO_CONFIG_ENV = 'BOTO_CONFIG'
+ DEFAULT_CONFIG_FILENAMES = ['/etc/boto.cfg', '~/.boto']
+ ACCESS_KEY = 'aws_access_key_id'
+ SECRET_KEY = 'aws_secret_access_key'
+
+ def __init__(self, environ=None, ini_parser=None):
+ if environ is None:
+ environ = os.environ
+ if ini_parser is None:
+ ini_parser = botocore.configloader.raw_config_parse
+ self._environ = environ
+ self._ini_parser = ini_parser
+
+ def load(self):
+ """
+ Look for credentials in boto config file.
+ """
+ if self.BOTO_CONFIG_ENV in self._environ:
+ potential_locations = [self._environ[self.BOTO_CONFIG_ENV]]
+ else:
+ potential_locations = self.DEFAULT_CONFIG_FILENAMES
+ for filename in potential_locations:
+ try:
+ config = self._ini_parser(filename)
+ except ConfigNotFound:
+ # Move on to the next potential config file name.
+ continue
+ if 'Credentials' in config:
+ credentials = config['Credentials']
+ if self.ACCESS_KEY in credentials:
+ logger.info(
+ "Found credentials in boto config file: %s", filename
+ )
+ access_key, secret_key = self._extract_creds_from_mapping(
+ credentials, self.ACCESS_KEY, self.SECRET_KEY
+ )
+ return Credentials(
+ access_key, secret_key, method=self.METHOD
+ )
+
+
+class AssumeRoleProvider(CredentialProvider):
+ METHOD = 'assume-role'
+ # The AssumeRole provider is logically part of the SharedConfig and
+ # SharedCredentials providers. Since the purpose of the canonical name
+ # is to provide cross-sdk compatibility, calling code will need to be
+ # aware that either of those providers should be tied to the AssumeRole
+ # provider as much as possible.
+ CANONICAL_NAME = None
+ ROLE_CONFIG_VAR = 'role_arn'
+ WEB_IDENTITY_TOKE_FILE_VAR = 'web_identity_token_file'
+ # Credentials are considered expired (and will be refreshed) once the total
+ # remaining time left until the credentials expires is less than the
+ # EXPIRY_WINDOW.
+ EXPIRY_WINDOW_SECONDS = 60 * 15
+
+ def __init__(
+ self,
+ load_config,
+ client_creator,
+ cache,
+ profile_name,
+ prompter=getpass.getpass,
+ credential_sourcer=None,
+ profile_provider_builder=None,
+ ):
+ """
+ :type load_config: callable
+ :param load_config: A function that accepts no arguments, and
+ when called, will return the full configuration dictionary
+ for the session (``session.full_config``).
+
+ :type client_creator: callable
+ :param client_creator: A factory function that will create
+ a client when called. Has the same interface as
+ ``botocore.session.Session.create_client``.
+
+ :type cache: dict
+ :param cache: An object that supports ``__getitem__``,
+ ``__setitem__``, and ``__contains__``. An example
+ of this is the ``JSONFileCache`` class in the CLI.
+
+ :type profile_name: str
+ :param profile_name: The name of the profile.
+
+ :type prompter: callable
+ :param prompter: A callable that returns input provided
+ by the user (i.e raw_input, getpass.getpass, etc.).
+
+ :type credential_sourcer: CanonicalNameCredentialSourcer
+ :param credential_sourcer: A credential provider that takes a
+ configuration, which is used to provide the source credentials
+ for the STS call.
+ """
+ #: The cache used to first check for assumed credentials.
+ #: This is checked before making the AssumeRole API
+ #: calls and can be useful if you have short lived
+ #: scripts and you'd like to avoid calling AssumeRole
+ #: until the credentials are expired.
+ self.cache = cache
+ self._load_config = load_config
+ # client_creator is a callable that creates function.
+ # It's basically session.create_client
+ self._client_creator = client_creator
+ self._profile_name = profile_name
+ self._prompter = prompter
+ # The _loaded_config attribute will be populated from the
+ # load_config() function once the configuration is actually
+ # loaded. The reason we go through all this instead of just
+ # requiring that the loaded_config be passed to us is to that
+ # we can defer configuration loaded until we actually try
+ # to load credentials (as opposed to when the object is
+ # instantiated).
+ self._loaded_config = {}
+ self._credential_sourcer = credential_sourcer
+ self._profile_provider_builder = profile_provider_builder
+ self._visited_profiles = [self._profile_name]
+
+ def load(self):
+ self._loaded_config = self._load_config()
+ profiles = self._loaded_config.get('profiles', {})
+ profile = profiles.get(self._profile_name, {})
+ if self._has_assume_role_config_vars(profile):
+ return self._load_creds_via_assume_role(self._profile_name)
+
+ def _has_assume_role_config_vars(self, profile):
+ return (
+ self.ROLE_CONFIG_VAR in profile
+ and
+ # We need to ensure this provider doesn't look at a profile when
+ # the profile has configuration for web identity. Simply relying on
+ # the order in the credential chain is insufficient as it doesn't
+ # prevent the case when we're doing an assume role chain.
+ self.WEB_IDENTITY_TOKE_FILE_VAR not in profile
+ )
+
+ def _load_creds_via_assume_role(self, profile_name):
+ role_config = self._get_role_config(profile_name)
+ source_credentials = self._resolve_source_credentials(
+ role_config, profile_name
+ )
+
+ extra_args = {}
+ role_session_name = role_config.get('role_session_name')
+ if role_session_name is not None:
+ extra_args['RoleSessionName'] = role_session_name
+
+ external_id = role_config.get('external_id')
+ if external_id is not None:
+ extra_args['ExternalId'] = external_id
+
+ mfa_serial = role_config.get('mfa_serial')
+ if mfa_serial is not None:
+ extra_args['SerialNumber'] = mfa_serial
+
+ duration_seconds = role_config.get('duration_seconds')
+ if duration_seconds is not None:
+ extra_args['DurationSeconds'] = duration_seconds
+
+ fetcher = AssumeRoleCredentialFetcher(
+ client_creator=self._client_creator,
+ source_credentials=source_credentials,
+ role_arn=role_config['role_arn'],
+ extra_args=extra_args,
+ mfa_prompter=self._prompter,
+ cache=self.cache,
+ )
+ refresher = fetcher.fetch_credentials
+ if mfa_serial is not None:
+ refresher = create_mfa_serial_refresher(refresher)
+
+ # The initial credentials are empty and the expiration time is set
+ # to now so that we can delay the call to assume role until it is
+ # strictly needed.
+ return DeferredRefreshableCredentials(
+ method=self.METHOD,
+ refresh_using=refresher,
+ time_fetcher=_local_now,
+ )
+
+ def _get_role_config(self, profile_name):
+ """Retrieves and validates the role configuration for the profile."""
+ profiles = self._loaded_config.get('profiles', {})
+
+ profile = profiles[profile_name]
+ source_profile = profile.get('source_profile')
+ role_arn = profile['role_arn']
+ credential_source = profile.get('credential_source')
+ mfa_serial = profile.get('mfa_serial')
+ external_id = profile.get('external_id')
+ role_session_name = profile.get('role_session_name')
+ duration_seconds = profile.get('duration_seconds')
+
+ role_config = {
+ 'role_arn': role_arn,
+ 'external_id': external_id,
+ 'mfa_serial': mfa_serial,
+ 'role_session_name': role_session_name,
+ 'source_profile': source_profile,
+ 'credential_source': credential_source,
+ }
+
+ if duration_seconds is not None:
+ try:
+ role_config['duration_seconds'] = int(duration_seconds)
+ except ValueError:
+ pass
+
+ # Either the credential source or the source profile must be
+ # specified, but not both.
+ if credential_source is not None and source_profile is not None:
+ raise InvalidConfigError(
+ error_msg=(
+ f'The profile "{profile_name}" contains both '
+ 'source_profile and credential_source.'
+ )
+ )
+ elif credential_source is None and source_profile is None:
+ raise PartialCredentialsError(
+ provider=self.METHOD,
+ cred_var='source_profile or credential_source',
+ )
+ elif credential_source is not None:
+ self._validate_credential_source(profile_name, credential_source)
+ else:
+ self._validate_source_profile(profile_name, source_profile)
+
+ return role_config
+
+ def _validate_credential_source(self, parent_profile, credential_source):
+ if self._credential_sourcer is None:
+ raise InvalidConfigError(
+ error_msg=(
+ f"The credential_source \"{credential_source}\" is specified "
+ f"in profile \"{parent_profile}\", "
+ f"but no source provider was configured."
+ )
+ )
+ if not self._credential_sourcer.is_supported(credential_source):
+ raise InvalidConfigError(
+ error_msg=(
+ f"The credential source \"{credential_source}\" referenced "
+ f"in profile \"{parent_profile}\" is not valid."
+ )
+ )
+
+ def _source_profile_has_credentials(self, profile):
+ return any(
+ [
+ self._has_static_credentials(profile),
+ self._has_assume_role_config_vars(profile),
+ ]
+ )
+
+ def _validate_source_profile(
+ self, parent_profile_name, source_profile_name
+ ):
+ profiles = self._loaded_config.get('profiles', {})
+ if source_profile_name not in profiles:
+ raise InvalidConfigError(
+ error_msg=(
+ f"The source_profile \"{source_profile_name}\" referenced in "
+ f"the profile \"{parent_profile_name}\" does not exist."
+ )
+ )
+
+ source_profile = profiles[source_profile_name]
+
+ # Make sure we aren't going into an infinite loop. If we haven't
+ # visited the profile yet, we're good.
+ if source_profile_name not in self._visited_profiles:
+ return
+
+ # If we have visited the profile and the profile isn't simply
+ # referencing itself, that's an infinite loop.
+ if source_profile_name != parent_profile_name:
+ raise InfiniteLoopConfigError(
+ source_profile=source_profile_name,
+ visited_profiles=self._visited_profiles,
+ )
+
+ # A profile is allowed to reference itself so that it can source
+ # static credentials and have configuration all in the same
+ # profile. This will only ever work for the top level assume
+ # role because the static credentials will otherwise take
+ # precedence.
+ if not self._has_static_credentials(source_profile):
+ raise InfiniteLoopConfigError(
+ source_profile=source_profile_name,
+ visited_profiles=self._visited_profiles,
+ )
+
+ def _has_static_credentials(self, profile):
+ static_keys = ['aws_secret_access_key', 'aws_access_key_id']
+ return any(static_key in profile for static_key in static_keys)
+
+ def _resolve_source_credentials(self, role_config, profile_name):
+ credential_source = role_config.get('credential_source')
+ if credential_source is not None:
+ return self._resolve_credentials_from_source(
+ credential_source, profile_name
+ )
+
+ source_profile = role_config['source_profile']
+ self._visited_profiles.append(source_profile)
+ return self._resolve_credentials_from_profile(source_profile)
+
+ def _resolve_credentials_from_profile(self, profile_name):
+ profiles = self._loaded_config.get('profiles', {})
+ profile = profiles[profile_name]
+
+ if (
+ self._has_static_credentials(profile)
+ and not self._profile_provider_builder
+ ):
+ # This is only here for backwards compatibility. If this provider
+ # isn't given a profile provider builder we still want to be able
+ # to handle the basic static credential case as we would before the
+ # profile provider builder parameter was added.
+ return self._resolve_static_credentials_from_profile(profile)
+ elif self._has_static_credentials(
+ profile
+ ) or not self._has_assume_role_config_vars(profile):
+ profile_providers = self._profile_provider_builder.providers(
+ profile_name=profile_name,
+ disable_env_vars=True,
+ )
+ profile_chain = CredentialResolver(profile_providers)
+ credentials = profile_chain.load_credentials()
+ if credentials is None:
+ error_message = (
+ 'The source profile "%s" must have credentials.'
+ )
+ raise InvalidConfigError(
+ error_msg=error_message % profile_name,
+ )
+ return credentials
+
+ return self._load_creds_via_assume_role(profile_name)
+
+ def _resolve_static_credentials_from_profile(self, profile):
+ try:
+ return Credentials(
+ access_key=profile['aws_access_key_id'],
+ secret_key=profile['aws_secret_access_key'],
+ token=profile.get('aws_session_token'),
+ )
+ except KeyError as e:
+ raise PartialCredentialsError(
+ provider=self.METHOD, cred_var=str(e)
+ )
+
+ def _resolve_credentials_from_source(
+ self, credential_source, profile_name
+ ):
+ credentials = self._credential_sourcer.source_credentials(
+ credential_source
+ )
+ if credentials is None:
+ raise CredentialRetrievalError(
+ provider=credential_source,
+ error_msg=(
+ 'No credentials found in credential_source referenced '
+ f'in profile {profile_name}'
+ ),
+ )
+ return credentials
+
+
+class AssumeRoleWithWebIdentityProvider(CredentialProvider):
+ METHOD = 'assume-role-with-web-identity'
+ CANONICAL_NAME = None
+ _CONFIG_TO_ENV_VAR = {
+ 'web_identity_token_file': 'AWS_WEB_IDENTITY_TOKEN_FILE',
+ 'role_session_name': 'AWS_ROLE_SESSION_NAME',
+ 'role_arn': 'AWS_ROLE_ARN',
+ }
+
+ def __init__(
+ self,
+ load_config,
+ client_creator,
+ profile_name,
+ cache=None,
+ disable_env_vars=False,
+ token_loader_cls=None,
+ ):
+ self.cache = cache
+ self._load_config = load_config
+ self._client_creator = client_creator
+ self._profile_name = profile_name
+ self._profile_config = None
+ self._disable_env_vars = disable_env_vars
+ if token_loader_cls is None:
+ token_loader_cls = FileWebIdentityTokenLoader
+ self._token_loader_cls = token_loader_cls
+
+ def load(self):
+ return self._assume_role_with_web_identity()
+
+ def _get_profile_config(self, key):
+ if self._profile_config is None:
+ loaded_config = self._load_config()
+ profiles = loaded_config.get('profiles', {})
+ self._profile_config = profiles.get(self._profile_name, {})
+ return self._profile_config.get(key)
+
+ def _get_env_config(self, key):
+ if self._disable_env_vars:
+ return None
+ env_key = self._CONFIG_TO_ENV_VAR.get(key)
+ if env_key and env_key in os.environ:
+ return os.environ[env_key]
+ return None
+
+ def _get_config(self, key):
+ env_value = self._get_env_config(key)
+ if env_value is not None:
+ return env_value
+ return self._get_profile_config(key)
+
+ def _assume_role_with_web_identity(self):
+ token_path = self._get_config('web_identity_token_file')
+ if not token_path:
+ return None
+ token_loader = self._token_loader_cls(token_path)
+
+ role_arn = self._get_config('role_arn')
+ if not role_arn:
+ error_msg = (
+ 'The provided profile or the current environment is '
+ 'configured to assume role with web identity but has no '
+ 'role ARN configured. Ensure that the profile has the role_arn'
+ 'configuration set or the AWS_ROLE_ARN env var is set.'
+ )
+ raise InvalidConfigError(error_msg=error_msg)
+
+ extra_args = {}
+ role_session_name = self._get_config('role_session_name')
+ if role_session_name is not None:
+ extra_args['RoleSessionName'] = role_session_name
+
+ fetcher = AssumeRoleWithWebIdentityCredentialFetcher(
+ client_creator=self._client_creator,
+ web_identity_token_loader=token_loader,
+ role_arn=role_arn,
+ extra_args=extra_args,
+ cache=self.cache,
+ )
+ # The initial credentials are empty and the expiration time is set
+ # to now so that we can delay the call to assume role until it is
+ # strictly needed.
+ return DeferredRefreshableCredentials(
+ method=self.METHOD,
+ refresh_using=fetcher.fetch_credentials,
+ )
+
+
+class CanonicalNameCredentialSourcer:
+ def __init__(self, providers):
+ self._providers = providers
+
+ def is_supported(self, source_name):
+ """Validates a given source name.
+
+ :type source_name: str
+ :param source_name: The value of credential_source in the config
+ file. This is the canonical name of the credential provider.
+
+ :rtype: bool
+ :returns: True if the credential provider is supported,
+ False otherwise.
+ """
+ return source_name in [p.CANONICAL_NAME for p in self._providers]
+
+ def source_credentials(self, source_name):
+ """Loads source credentials based on the provided configuration.
+
+ :type source_name: str
+ :param source_name: The value of credential_source in the config
+ file. This is the canonical name of the credential provider.
+
+ :rtype: Credentials
+ """
+ source = self._get_provider(source_name)
+ if isinstance(source, CredentialResolver):
+ return source.load_credentials()
+ return source.load()
+
+ def _get_provider(self, canonical_name):
+ """Return a credential provider by its canonical name.
+
+ :type canonical_name: str
+ :param canonical_name: The canonical name of the provider.
+
+ :raises UnknownCredentialError: Raised if no
+ credential provider by the provided name
+ is found.
+ """
+ provider = self._get_provider_by_canonical_name(canonical_name)
+
+ # The AssumeRole provider should really be part of the SharedConfig
+ # provider rather than being its own thing, but it is not. It is
+ # effectively part of both the SharedConfig provider and the
+ # SharedCredentials provider now due to the way it behaves.
+ # Therefore if we want either of those providers we should return
+ # the AssumeRole provider with it.
+ if canonical_name.lower() in ['sharedconfig', 'sharedcredentials']:
+ assume_role_provider = self._get_provider_by_method('assume-role')
+ if assume_role_provider is not None:
+ # The SharedConfig or SharedCredentials provider may not be
+ # present if it was removed for some reason, but the
+ # AssumeRole provider could still be present. In that case,
+ # return the assume role provider by itself.
+ if provider is None:
+ return assume_role_provider
+
+ # If both are present, return them both as a
+ # CredentialResolver so that calling code can treat them as
+ # a single entity.
+ return CredentialResolver([assume_role_provider, provider])
+
+ if provider is None:
+ raise UnknownCredentialError(name=canonical_name)
+
+ return provider
+
+ def _get_provider_by_canonical_name(self, canonical_name):
+ """Return a credential provider by its canonical name.
+
+ This function is strict, it does not attempt to address
+ compatibility issues.
+ """
+ for provider in self._providers:
+ name = provider.CANONICAL_NAME
+ # Canonical names are case-insensitive
+ if name and name.lower() == canonical_name.lower():
+ return provider
+
+ def _get_provider_by_method(self, method):
+ """Return a credential provider by its METHOD name."""
+ for provider in self._providers:
+ if provider.METHOD == method:
+ return provider
+
+
+class ContainerProvider(CredentialProvider):
+ METHOD = 'container-role'
+ CANONICAL_NAME = 'EcsContainer'
+ ENV_VAR = 'AWS_CONTAINER_CREDENTIALS_RELATIVE_URI'
+ ENV_VAR_FULL = 'AWS_CONTAINER_CREDENTIALS_FULL_URI'
+ ENV_VAR_AUTH_TOKEN = 'AWS_CONTAINER_AUTHORIZATION_TOKEN'
+ ENV_VAR_AUTH_TOKEN_FILE = 'AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE'
+
+ def __init__(self, environ=None, fetcher=None):
+ if environ is None:
+ environ = os.environ
+ if fetcher is None:
+ fetcher = ContainerMetadataFetcher()
+ self._environ = environ
+ self._fetcher = fetcher
+
+ def load(self):
+ # This cred provider is only triggered if the self.ENV_VAR is set,
+ # which only happens if you opt into this feature.
+ if self.ENV_VAR in self._environ or self.ENV_VAR_FULL in self._environ:
+ return self._retrieve_or_fail()
+
+ def _retrieve_or_fail(self):
+ if self._provided_relative_uri():
+ full_uri = self._fetcher.full_url(self._environ[self.ENV_VAR])
+ else:
+ full_uri = self._environ[self.ENV_VAR_FULL]
+ fetcher = self._create_fetcher(full_uri)
+ creds = fetcher()
+ return RefreshableCredentials(
+ access_key=creds['access_key'],
+ secret_key=creds['secret_key'],
+ token=creds['token'],
+ method=self.METHOD,
+ expiry_time=_parse_if_needed(creds['expiry_time']),
+ refresh_using=fetcher,
+ account_id=creds.get('account_id'),
+ )
+
+ def _build_headers(self):
+ auth_token = None
+ if self.ENV_VAR_AUTH_TOKEN_FILE in self._environ:
+ auth_token_file_path = self._environ[self.ENV_VAR_AUTH_TOKEN_FILE]
+ with open(auth_token_file_path) as token_file:
+ auth_token = token_file.read()
+ elif self.ENV_VAR_AUTH_TOKEN in self._environ:
+ auth_token = self._environ[self.ENV_VAR_AUTH_TOKEN]
+ if auth_token is not None:
+ self._validate_auth_token(auth_token)
+ return {'Authorization': auth_token}
+
+ def _validate_auth_token(self, auth_token):
+ if "\r" in auth_token or "\n" in auth_token:
+ raise ValueError("Auth token value is not a legal header value")
+
+ def _create_fetcher(self, full_uri, *args, **kwargs):
+ def fetch_creds():
+ try:
+ headers = self._build_headers()
+ response = self._fetcher.retrieve_full_uri(
+ full_uri, headers=headers
+ )
+ except MetadataRetrievalError as e:
+ logger.debug(
+ "Error retrieving container metadata: %s", e, exc_info=True
+ )
+ raise CredentialRetrievalError(
+ provider=self.METHOD, error_msg=str(e)
+ )
+ return {
+ 'access_key': response['AccessKeyId'],
+ 'secret_key': response['SecretAccessKey'],
+ 'token': response['Token'],
+ 'expiry_time': response['Expiration'],
+ 'account_id': response.get('AccountId'),
+ }
+
+ return fetch_creds
+
+ def _provided_relative_uri(self):
+ return self.ENV_VAR in self._environ
+
+
+class CredentialResolver:
+ def __init__(self, providers):
+ """
+
+ :param providers: A list of ``CredentialProvider`` instances.
+
+ """
+ self.providers = providers
+
+ def insert_before(self, name, credential_provider):
+ """
+ Inserts a new instance of ``CredentialProvider`` into the chain that
+ will be tried before an existing one.
+
+ :param name: The short name of the credentials you'd like to insert the
+ new credentials before. (ex. ``env`` or ``config``). Existing names
+ & ordering can be discovered via ``self.available_methods``.
+ :type name: string
+
+ :param cred_instance: An instance of the new ``Credentials`` object
+ you'd like to add to the chain.
+ :type cred_instance: A subclass of ``Credentials``
+ """
+ try:
+ offset = [p.METHOD for p in self.providers].index(name)
+ except ValueError:
+ raise UnknownCredentialError(name=name)
+ self.providers.insert(offset, credential_provider)
+
+ def insert_after(self, name, credential_provider):
+ """
+ Inserts a new type of ``Credentials`` instance into the chain that will
+ be tried after an existing one.
+
+ :param name: The short name of the credentials you'd like to insert the
+ new credentials after. (ex. ``env`` or ``config``). Existing names
+ & ordering can be discovered via ``self.available_methods``.
+ :type name: string
+
+ :param cred_instance: An instance of the new ``Credentials`` object
+ you'd like to add to the chain.
+ :type cred_instance: A subclass of ``Credentials``
+ """
+ offset = self._get_provider_offset(name)
+ self.providers.insert(offset + 1, credential_provider)
+
+ def remove(self, name):
+ """
+ Removes a given ``Credentials`` instance from the chain.
+
+ :param name: The short name of the credentials instance to remove.
+ :type name: string
+ """
+ available_methods = [p.METHOD for p in self.providers]
+ if name not in available_methods:
+ # It's not present. Fail silently.
+ return
+
+ offset = available_methods.index(name)
+ self.providers.pop(offset)
+
+ def get_provider(self, name):
+ """Return a credential provider by name.
+
+ :type name: str
+ :param name: The name of the provider.
+
+ :raises UnknownCredentialError: Raised if no
+ credential provider by the provided name
+ is found.
+ """
+ return self.providers[self._get_provider_offset(name)]
+
+ def _get_provider_offset(self, name):
+ try:
+ return [p.METHOD for p in self.providers].index(name)
+ except ValueError:
+ raise UnknownCredentialError(name=name)
+
+ def load_credentials(self):
+ """
+ Goes through the credentials chain, returning the first ``Credentials``
+ that could be loaded.
+ """
+ # First provider to return a non-None response wins.
+ for provider in self.providers:
+ logger.debug("Looking for credentials via: %s", provider.METHOD)
+ creds = provider.load()
+ if creds is not None:
+ return creds
+
+ # If we got here, no credentials could be found.
+ # This feels like it should be an exception, but historically, ``None``
+ # is returned.
+ #
+ # +1
+ # -js
+ return None
+
+
+class SSOCredentialFetcher(CachedCredentialFetcher):
+ _UTC_DATE_FORMAT = '%Y-%m-%dT%H:%M:%SZ'
+
+ def __init__(
+ self,
+ start_url,
+ sso_region,
+ role_name,
+ account_id,
+ client_creator,
+ token_loader=None,
+ cache=None,
+ expiry_window_seconds=None,
+ token_provider=None,
+ sso_session_name=None,
+ ):
+ self._client_creator = client_creator
+ self._sso_region = sso_region
+ self._role_name = role_name
+ self._account_id = account_id
+ self._start_url = start_url
+ self._token_loader = token_loader
+ self._token_provider = token_provider
+ self._sso_session_name = sso_session_name
+ super().__init__(cache, expiry_window_seconds)
+
+ def _create_cache_key(self):
+ """Create a predictable cache key for the current configuration.
+
+ The cache key is intended to be compatible with file names.
+ """
+ args = {
+ 'roleName': self._role_name,
+ 'accountId': self._account_id,
+ }
+ if self._sso_session_name:
+ args['sessionName'] = self._sso_session_name
+ else:
+ args['startUrl'] = self._start_url
+ # NOTE: It would be good to hoist this cache key construction logic
+ # into the CachedCredentialFetcher class as we should be consistent.
+ # Unfortunately, the current assume role fetchers that sub class don't
+ # pass separators resulting in non-minified JSON. In the long term,
+ # all fetchers should use the below caching scheme.
+ args = json.dumps(args, sort_keys=True, separators=(',', ':'))
+ argument_hash = sha1(args.encode('utf-8')).hexdigest()
+ return self._make_file_safe(argument_hash)
+
+ def _parse_timestamp(self, timestamp_ms):
+ # fromtimestamp expects seconds so: milliseconds / 1000 = seconds
+ timestamp_seconds = timestamp_ms / 1000.0
+ timestamp = datetime.datetime.fromtimestamp(timestamp_seconds, tzutc())
+ return timestamp.strftime(self._UTC_DATE_FORMAT)
+
+ def _get_credentials(self):
+ """Get credentials by calling SSO get role credentials."""
+ config = Config(
+ signature_version=UNSIGNED,
+ region_name=self._sso_region,
+ )
+ client = self._client_creator('sso', config=config)
+ if self._token_provider:
+ initial_token_data = self._token_provider.load_token()
+ token = initial_token_data.get_frozen_token().token
+ else:
+ token = self._token_loader(self._start_url)['accessToken']
+
+ kwargs = {
+ 'roleName': self._role_name,
+ 'accountId': self._account_id,
+ 'accessToken': token,
+ }
+ try:
+ response = client.get_role_credentials(**kwargs)
+ except client.exceptions.UnauthorizedException:
+ raise UnauthorizedSSOTokenError()
+ credentials = response['roleCredentials']
+
+ credentials = {
+ 'ProviderType': 'sso',
+ 'Credentials': {
+ 'AccessKeyId': credentials['accessKeyId'],
+ 'SecretAccessKey': credentials['secretAccessKey'],
+ 'SessionToken': credentials['sessionToken'],
+ 'Expiration': self._parse_timestamp(credentials['expiration']),
+ 'AccountId': self._account_id,
+ },
+ }
+ return credentials
+
+
+class SSOProvider(CredentialProvider):
+ METHOD = 'sso'
+
+ _SSO_TOKEN_CACHE_DIR = os.path.expanduser(
+ os.path.join('~', '.aws', 'sso', 'cache')
+ )
+ _PROFILE_REQUIRED_CONFIG_VARS = (
+ 'sso_role_name',
+ 'sso_account_id',
+ )
+ _SSO_REQUIRED_CONFIG_VARS = (
+ 'sso_start_url',
+ 'sso_region',
+ )
+ _ALL_REQUIRED_CONFIG_VARS = (
+ _PROFILE_REQUIRED_CONFIG_VARS + _SSO_REQUIRED_CONFIG_VARS
+ )
+
+ def __init__(
+ self,
+ load_config,
+ client_creator,
+ profile_name,
+ cache=None,
+ token_cache=None,
+ token_provider=None,
+ ):
+ if token_cache is None:
+ token_cache = JSONFileCache(self._SSO_TOKEN_CACHE_DIR)
+ self._token_cache = token_cache
+ self._token_provider = token_provider
+ if cache is None:
+ cache = {}
+ self.cache = cache
+ self._load_config = load_config
+ self._client_creator = client_creator
+ self._profile_name = profile_name
+
+ def _load_sso_config(self):
+ loaded_config = self._load_config()
+ profiles = loaded_config.get('profiles', {})
+ profile_name = self._profile_name
+ profile_config = profiles.get(self._profile_name, {})
+ sso_sessions = loaded_config.get('sso_sessions', {})
+
+ # Role name & Account ID indicate the cred provider should be used
+ if all(
+ c not in profile_config for c in self._PROFILE_REQUIRED_CONFIG_VARS
+ ):
+ return None
+
+ resolved_config, extra_reqs = self._resolve_sso_session_reference(
+ profile_config, sso_sessions
+ )
+
+ config = {}
+ missing_config_vars = []
+ all_required_configs = self._ALL_REQUIRED_CONFIG_VARS + extra_reqs
+ for config_var in all_required_configs:
+ if config_var in resolved_config:
+ config[config_var] = resolved_config[config_var]
+ else:
+ missing_config_vars.append(config_var)
+
+ if missing_config_vars:
+ missing = ', '.join(missing_config_vars)
+ raise InvalidConfigError(
+ error_msg=(
+ f'The profile "{profile_name}" is configured to use SSO '
+ f'but is missing required configuration: {missing}'
+ )
+ )
+ return config
+
+ def _resolve_sso_session_reference(self, profile_config, sso_sessions):
+ sso_session_name = profile_config.get('sso_session')
+ if sso_session_name is None:
+ # No reference to resolve, proceed with legacy flow
+ return profile_config, ()
+
+ if sso_session_name not in sso_sessions:
+ error_msg = f'The specified sso-session does not exist: "{sso_session_name}"'
+ raise InvalidConfigError(error_msg=error_msg)
+
+ config = profile_config.copy()
+ session = sso_sessions[sso_session_name]
+ for config_var, val in session.items():
+ # Validate any keys referenced in both profile and sso_session match
+ if config.get(config_var, val) != val:
+ error_msg = (
+ f"The value for {config_var} is inconsistent between "
+ f"profile ({config[config_var]}) and sso-session ({val})."
+ )
+ raise InvalidConfigError(error_msg=error_msg)
+ config[config_var] = val
+ return config, ('sso_session',)
+
+ def load(self):
+ sso_config = self._load_sso_config()
+ if not sso_config:
+ return None
+
+ fetcher_kwargs = {
+ 'start_url': sso_config['sso_start_url'],
+ 'sso_region': sso_config['sso_region'],
+ 'role_name': sso_config['sso_role_name'],
+ 'account_id': sso_config['sso_account_id'],
+ 'client_creator': self._client_creator,
+ 'token_loader': SSOTokenLoader(cache=self._token_cache),
+ 'cache': self.cache,
+ }
+ if 'sso_session' in sso_config:
+ fetcher_kwargs['sso_session_name'] = sso_config['sso_session']
+ fetcher_kwargs['token_provider'] = self._token_provider
+
+ sso_fetcher = SSOCredentialFetcher(**fetcher_kwargs)
+
+ return DeferredRefreshableCredentials(
+ method=self.METHOD,
+ refresh_using=sso_fetcher.fetch_credentials,
+ )
diff --git a/.venv/lib/python3.12/site-packages/botocore/crt/__init__.py b/.venv/lib/python3.12/site-packages/botocore/crt/__init__.py
new file mode 100644
index 00000000..952ebf34
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/crt/__init__.py
@@ -0,0 +1,27 @@
+# Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+
+# A list of auth types supported by the signers in botocore/crt/auth.py. This
+# should always match the keys of botocore.crt.auth.CRT_AUTH_TYPE_MAPS. The
+# information is duplicated here so that it can be accessed in environments
+# where `awscrt` is not present and any import from botocore.crt.auth would
+# fail.
+CRT_SUPPORTED_AUTH_TYPES = (
+ 'v4',
+ 'v4-query',
+ 'v4a',
+ 's3v4',
+ 's3v4-query',
+ 's3v4a',
+ 's3v4a-query',
+)
diff --git a/.venv/lib/python3.12/site-packages/botocore/crt/auth.py b/.venv/lib/python3.12/site-packages/botocore/crt/auth.py
new file mode 100644
index 00000000..9919e20f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/crt/auth.py
@@ -0,0 +1,631 @@
+# Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+
+import datetime
+from io import BytesIO
+
+from botocore.auth import (
+ SIGNED_HEADERS_BLACKLIST,
+ STREAMING_UNSIGNED_PAYLOAD_TRAILER,
+ UNSIGNED_PAYLOAD,
+ BaseSigner,
+ _get_body_as_dict,
+ _host_from_url,
+)
+from botocore.compat import HTTPHeaders, awscrt, parse_qs, urlsplit, urlunsplit
+from botocore.exceptions import NoCredentialsError
+from botocore.useragent import register_feature_id
+from botocore.utils import percent_encode_sequence
+
+
+class CrtSigV4Auth(BaseSigner):
+ REQUIRES_REGION = True
+ _PRESIGNED_HEADERS_BLOCKLIST = [
+ 'Authorization',
+ 'X-Amz-Date',
+ 'X-Amz-Content-SHA256',
+ 'X-Amz-Security-Token',
+ ]
+ _SIGNATURE_TYPE = awscrt.auth.AwsSignatureType.HTTP_REQUEST_HEADERS
+ _USE_DOUBLE_URI_ENCODE = True
+ _SHOULD_NORMALIZE_URI_PATH = True
+
+ def __init__(self, credentials, service_name, region_name):
+ self.credentials = credentials
+ self._service_name = service_name
+ self._region_name = region_name
+ self._expiration_in_seconds = None
+
+ def _is_streaming_checksum_payload(self, request):
+ checksum_context = request.context.get('checksum', {})
+ algorithm = checksum_context.get('request_algorithm')
+ return isinstance(algorithm, dict) and algorithm.get('in') == 'trailer'
+
+ def add_auth(self, request):
+ if self.credentials is None:
+ raise NoCredentialsError()
+
+ # Use utcnow() because that's what gets mocked by tests, but set
+ # timezone because CRT assumes naive datetime is local time.
+ datetime_now = datetime.datetime.utcnow().replace(
+ tzinfo=datetime.timezone.utc
+ )
+
+ # Use existing 'X-Amz-Content-SHA256' header if able
+ existing_sha256 = self._get_existing_sha256(request)
+
+ self._modify_request_before_signing(request)
+
+ credentials_provider = awscrt.auth.AwsCredentialsProvider.new_static(
+ access_key_id=self.credentials.access_key,
+ secret_access_key=self.credentials.secret_key,
+ session_token=self.credentials.token,
+ )
+
+ if self._is_streaming_checksum_payload(request):
+ explicit_payload = STREAMING_UNSIGNED_PAYLOAD_TRAILER
+ elif self._should_sha256_sign_payload(request):
+ if existing_sha256:
+ explicit_payload = existing_sha256
+ else:
+ explicit_payload = None # to be calculated during signing
+ else:
+ explicit_payload = UNSIGNED_PAYLOAD
+
+ if self._should_add_content_sha256_header(explicit_payload):
+ body_header = (
+ awscrt.auth.AwsSignedBodyHeaderType.X_AMZ_CONTENT_SHA_256
+ )
+ else:
+ body_header = awscrt.auth.AwsSignedBodyHeaderType.NONE
+
+ signing_config = awscrt.auth.AwsSigningConfig(
+ algorithm=awscrt.auth.AwsSigningAlgorithm.V4,
+ signature_type=self._SIGNATURE_TYPE,
+ credentials_provider=credentials_provider,
+ region=self._region_name,
+ service=self._service_name,
+ date=datetime_now,
+ should_sign_header=self._should_sign_header,
+ use_double_uri_encode=self._USE_DOUBLE_URI_ENCODE,
+ should_normalize_uri_path=self._SHOULD_NORMALIZE_URI_PATH,
+ signed_body_value=explicit_payload,
+ signed_body_header_type=body_header,
+ expiration_in_seconds=self._expiration_in_seconds,
+ )
+ crt_request = self._crt_request_from_aws_request(request)
+ future = awscrt.auth.aws_sign_request(crt_request, signing_config)
+ future.result()
+ self._apply_signing_changes(request, crt_request)
+
+ def _crt_request_from_aws_request(self, aws_request):
+ url_parts = urlsplit(aws_request.url)
+ crt_path = url_parts.path if url_parts.path else '/'
+ if aws_request.params:
+ array = []
+ for param, value in aws_request.params.items():
+ value = str(value)
+ array.append(f'{param}={value}')
+ crt_path = crt_path + '?' + '&'.join(array)
+ elif url_parts.query:
+ crt_path = f'{crt_path}?{url_parts.query}'
+
+ crt_headers = awscrt.http.HttpHeaders(aws_request.headers.items())
+
+ # CRT requires body (if it exists) to be an I/O stream.
+ crt_body_stream = None
+ if aws_request.body:
+ if hasattr(aws_request.body, 'seek'):
+ crt_body_stream = aws_request.body
+ else:
+ crt_body_stream = BytesIO(aws_request.body)
+
+ crt_request = awscrt.http.HttpRequest(
+ method=aws_request.method,
+ path=crt_path,
+ headers=crt_headers,
+ body_stream=crt_body_stream,
+ )
+ return crt_request
+
+ def _apply_signing_changes(self, aws_request, signed_crt_request):
+ # Apply changes from signed CRT request to the AWSRequest
+ aws_request.headers = HTTPHeaders.from_pairs(
+ list(signed_crt_request.headers)
+ )
+
+ def _should_sign_header(self, name, **kwargs):
+ return name.lower() not in SIGNED_HEADERS_BLACKLIST
+
+ def _modify_request_before_signing(self, request):
+ # This could be a retry. Make sure the previous
+ # authorization headers are removed first.
+ for h in self._PRESIGNED_HEADERS_BLOCKLIST:
+ if h in request.headers:
+ del request.headers[h]
+ # If necessary, add the host header
+ if 'host' not in request.headers:
+ request.headers['host'] = _host_from_url(request.url)
+
+ def _get_existing_sha256(self, request):
+ return request.headers.get('X-Amz-Content-SHA256')
+
+ def _should_sha256_sign_payload(self, request):
+ # Payloads will always be signed over insecure connections.
+ if not request.url.startswith('https'):
+ return True
+
+ # Certain operations may have payload signing disabled by default.
+ # Since we don't have access to the operation model, we pass in this
+ # bit of metadata through the request context.
+ return request.context.get('payload_signing_enabled', True)
+
+ def _should_add_content_sha256_header(self, explicit_payload):
+ # only add X-Amz-Content-SHA256 header if payload is explicitly set
+ return explicit_payload is not None
+
+
+class CrtS3SigV4Auth(CrtSigV4Auth):
+ # For S3, we do not normalize the path.
+ _USE_DOUBLE_URI_ENCODE = False
+ _SHOULD_NORMALIZE_URI_PATH = False
+
+ def _get_existing_sha256(self, request):
+ # always recalculate
+ return None
+
+ def _should_sha256_sign_payload(self, request):
+ # S3 allows optional body signing, so to minimize the performance
+ # impact, we opt to not SHA256 sign the body on streaming uploads,
+ # provided that we're on https.
+ client_config = request.context.get('client_config')
+ s3_config = getattr(client_config, 's3', None)
+
+ # The config could be None if it isn't set, or if the customer sets it
+ # to None.
+ if s3_config is None:
+ s3_config = {}
+
+ # The explicit configuration takes precedence over any implicit
+ # configuration.
+ sign_payload = s3_config.get('payload_signing_enabled', None)
+ if sign_payload is not None:
+ return sign_payload
+
+ # We require that both a checksum be present and https be enabled
+ # to implicitly disable body signing. The combination of TLS and
+ # a checksum is sufficiently secure and durable for us to be
+ # confident in the request without body signing.
+ checksum_header = 'Content-MD5'
+ checksum_context = request.context.get('checksum', {})
+ algorithm = checksum_context.get('request_algorithm')
+ if isinstance(algorithm, dict) and algorithm.get('in') == 'header':
+ checksum_header = algorithm['name']
+ if (
+ not request.url.startswith('https')
+ or checksum_header not in request.headers
+ ):
+ return True
+
+ # If the input is streaming we disable body signing by default.
+ if request.context.get('has_streaming_input', False):
+ return False
+
+ # If the S3-specific checks had no results, delegate to the generic
+ # checks.
+ return super()._should_sha256_sign_payload(request)
+
+ def _should_add_content_sha256_header(self, explicit_payload):
+ # Always add X-Amz-Content-SHA256 header
+ return True
+
+
+class CrtSigV4AsymAuth(BaseSigner):
+ REQUIRES_REGION = True
+ _PRESIGNED_HEADERS_BLOCKLIST = [
+ 'Authorization',
+ 'X-Amz-Date',
+ 'X-Amz-Content-SHA256',
+ 'X-Amz-Security-Token',
+ ]
+ _SIGNATURE_TYPE = awscrt.auth.AwsSignatureType.HTTP_REQUEST_HEADERS
+ _USE_DOUBLE_URI_ENCODE = True
+ _SHOULD_NORMALIZE_URI_PATH = True
+
+ def __init__(self, credentials, service_name, region_name):
+ self.credentials = credentials
+ self._service_name = service_name
+ self._region_name = region_name
+ self._expiration_in_seconds = None
+
+ def add_auth(self, request):
+ register_feature_id("SIGV4A_SIGNING")
+ if self.credentials is None:
+ raise NoCredentialsError()
+
+ # Use utcnow() because that's what gets mocked by tests, but set
+ # timezone because CRT assumes naive datetime is local time.
+ datetime_now = datetime.datetime.utcnow().replace(
+ tzinfo=datetime.timezone.utc
+ )
+
+ # Use existing 'X-Amz-Content-SHA256' header if able
+ existing_sha256 = self._get_existing_sha256(request)
+
+ self._modify_request_before_signing(request)
+
+ credentials_provider = awscrt.auth.AwsCredentialsProvider.new_static(
+ access_key_id=self.credentials.access_key,
+ secret_access_key=self.credentials.secret_key,
+ session_token=self.credentials.token,
+ )
+
+ if self._is_streaming_checksum_payload(request):
+ explicit_payload = STREAMING_UNSIGNED_PAYLOAD_TRAILER
+ elif self._should_sha256_sign_payload(request):
+ if existing_sha256:
+ explicit_payload = existing_sha256
+ else:
+ explicit_payload = None # to be calculated during signing
+ else:
+ explicit_payload = UNSIGNED_PAYLOAD
+
+ if self._should_add_content_sha256_header(explicit_payload):
+ body_header = (
+ awscrt.auth.AwsSignedBodyHeaderType.X_AMZ_CONTENT_SHA_256
+ )
+ else:
+ body_header = awscrt.auth.AwsSignedBodyHeaderType.NONE
+
+ signing_config = awscrt.auth.AwsSigningConfig(
+ algorithm=awscrt.auth.AwsSigningAlgorithm.V4_ASYMMETRIC,
+ signature_type=self._SIGNATURE_TYPE,
+ credentials_provider=credentials_provider,
+ region=self._region_name,
+ service=self._service_name,
+ date=datetime_now,
+ should_sign_header=self._should_sign_header,
+ use_double_uri_encode=self._USE_DOUBLE_URI_ENCODE,
+ should_normalize_uri_path=self._SHOULD_NORMALIZE_URI_PATH,
+ signed_body_value=explicit_payload,
+ signed_body_header_type=body_header,
+ expiration_in_seconds=self._expiration_in_seconds,
+ )
+ crt_request = self._crt_request_from_aws_request(request)
+ future = awscrt.auth.aws_sign_request(crt_request, signing_config)
+ future.result()
+ self._apply_signing_changes(request, crt_request)
+
+ def _crt_request_from_aws_request(self, aws_request):
+ url_parts = urlsplit(aws_request.url)
+ crt_path = url_parts.path if url_parts.path else '/'
+ if aws_request.params:
+ array = []
+ for param, value in aws_request.params.items():
+ value = str(value)
+ array.append(f'{param}={value}')
+ crt_path = crt_path + '?' + '&'.join(array)
+ elif url_parts.query:
+ crt_path = f'{crt_path}?{url_parts.query}'
+
+ crt_headers = awscrt.http.HttpHeaders(aws_request.headers.items())
+
+ # CRT requires body (if it exists) to be an I/O stream.
+ crt_body_stream = None
+ if aws_request.body:
+ if hasattr(aws_request.body, 'seek'):
+ crt_body_stream = aws_request.body
+ else:
+ crt_body_stream = BytesIO(aws_request.body)
+
+ crt_request = awscrt.http.HttpRequest(
+ method=aws_request.method,
+ path=crt_path,
+ headers=crt_headers,
+ body_stream=crt_body_stream,
+ )
+ return crt_request
+
+ def _apply_signing_changes(self, aws_request, signed_crt_request):
+ # Apply changes from signed CRT request to the AWSRequest
+ aws_request.headers = HTTPHeaders.from_pairs(
+ list(signed_crt_request.headers)
+ )
+
+ def _should_sign_header(self, name, **kwargs):
+ return name.lower() not in SIGNED_HEADERS_BLACKLIST
+
+ def _modify_request_before_signing(self, request):
+ # This could be a retry. Make sure the previous
+ # authorization headers are removed first.
+ for h in self._PRESIGNED_HEADERS_BLOCKLIST:
+ if h in request.headers:
+ del request.headers[h]
+ # If necessary, add the host header
+ if 'host' not in request.headers:
+ request.headers['host'] = _host_from_url(request.url)
+
+ def _get_existing_sha256(self, request):
+ return request.headers.get('X-Amz-Content-SHA256')
+
+ def _is_streaming_checksum_payload(self, request):
+ checksum_context = request.context.get('checksum', {})
+ algorithm = checksum_context.get('request_algorithm')
+ return isinstance(algorithm, dict) and algorithm.get('in') == 'trailer'
+
+ def _should_sha256_sign_payload(self, request):
+ # Payloads will always be signed over insecure connections.
+ if not request.url.startswith('https'):
+ return True
+
+ # Certain operations may have payload signing disabled by default.
+ # Since we don't have access to the operation model, we pass in this
+ # bit of metadata through the request context.
+ return request.context.get('payload_signing_enabled', True)
+
+ def _should_add_content_sha256_header(self, explicit_payload):
+ # only add X-Amz-Content-SHA256 header if payload is explicitly set
+ return explicit_payload is not None
+
+
+class CrtS3SigV4AsymAuth(CrtSigV4AsymAuth):
+ # For S3, we do not normalize the path.
+ _USE_DOUBLE_URI_ENCODE = False
+ _SHOULD_NORMALIZE_URI_PATH = False
+
+ def _get_existing_sha256(self, request):
+ # always recalculate
+ return None
+
+ def _should_sha256_sign_payload(self, request):
+ # S3 allows optional body signing, so to minimize the performance
+ # impact, we opt to not SHA256 sign the body on streaming uploads,
+ # provided that we're on https.
+ client_config = request.context.get('client_config')
+ s3_config = getattr(client_config, 's3', None)
+
+ # The config could be None if it isn't set, or if the customer sets it
+ # to None.
+ if s3_config is None:
+ s3_config = {}
+
+ # The explicit configuration takes precedence over any implicit
+ # configuration.
+ sign_payload = s3_config.get('payload_signing_enabled', None)
+ if sign_payload is not None:
+ return sign_payload
+
+ # We require that both content-md5 be present and https be enabled
+ # to implicitly disable body signing. The combination of TLS and
+ # content-md5 is sufficiently secure and durable for us to be
+ # confident in the request without body signing.
+ if (
+ not request.url.startswith('https')
+ or 'Content-MD5' not in request.headers
+ ):
+ return True
+
+ # If the input is streaming we disable body signing by default.
+ if request.context.get('has_streaming_input', False):
+ return False
+
+ # If the S3-specific checks had no results, delegate to the generic
+ # checks.
+ return super()._should_sha256_sign_payload(request)
+
+ def _should_add_content_sha256_header(self, explicit_payload):
+ # Always add X-Amz-Content-SHA256 header
+ return True
+
+
+class CrtSigV4AsymQueryAuth(CrtSigV4AsymAuth):
+ DEFAULT_EXPIRES = 3600
+ _SIGNATURE_TYPE = awscrt.auth.AwsSignatureType.HTTP_REQUEST_QUERY_PARAMS
+
+ def __init__(
+ self, credentials, service_name, region_name, expires=DEFAULT_EXPIRES
+ ):
+ super().__init__(credentials, service_name, region_name)
+ self._expiration_in_seconds = expires
+
+ def _modify_request_before_signing(self, request):
+ super()._modify_request_before_signing(request)
+
+ # We automatically set this header, so if it's the auto-set value we
+ # want to get rid of it since it doesn't make sense for presigned urls.
+ content_type = request.headers.get('content-type')
+ if content_type == 'application/x-www-form-urlencoded; charset=utf-8':
+ del request.headers['content-type']
+
+ # Now parse the original query string to a dict, inject our new query
+ # params, and serialize back to a query string.
+ url_parts = urlsplit(request.url)
+ # parse_qs makes each value a list, but in our case we know we won't
+ # have repeated keys so we know we have single element lists which we
+ # can convert back to scalar values.
+ query_string_parts = parse_qs(url_parts.query, keep_blank_values=True)
+ query_dict = {k: v[0] for k, v in query_string_parts.items()}
+
+ # The spec is particular about this. It *has* to be:
+ # https://<endpoint>?<operation params>&<auth params>
+ # You can't mix the two types of params together, i.e just keep doing
+ # new_query_params.update(op_params)
+ # new_query_params.update(auth_params)
+ # percent_encode_sequence(new_query_params)
+ if request.data:
+ # We also need to move the body params into the query string. To
+ # do this, we first have to convert it to a dict.
+ query_dict.update(_get_body_as_dict(request))
+ request.data = ''
+ new_query_string = percent_encode_sequence(query_dict)
+ # url_parts is a tuple (and therefore immutable) so we need to create
+ # a new url_parts with the new query string.
+ # <part> - <index>
+ # scheme - 0
+ # netloc - 1
+ # path - 2
+ # query - 3 <-- we're replacing this.
+ # fragment - 4
+ p = url_parts
+ new_url_parts = (p[0], p[1], p[2], new_query_string, p[4])
+ request.url = urlunsplit(new_url_parts)
+
+ def _apply_signing_changes(self, aws_request, signed_crt_request):
+ # Apply changes from signed CRT request to the AWSRequest
+ super()._apply_signing_changes(aws_request, signed_crt_request)
+
+ signed_query = urlsplit(signed_crt_request.path).query
+ p = urlsplit(aws_request.url)
+ # urlsplit() returns a tuple (and therefore immutable) so we
+ # need to create new url with the new query string.
+ # <part> - <index>
+ # scheme - 0
+ # netloc - 1
+ # path - 2
+ # query - 3 <-- we're replacing this.
+ # fragment - 4
+ aws_request.url = urlunsplit((p[0], p[1], p[2], signed_query, p[4]))
+
+
+class CrtS3SigV4AsymQueryAuth(CrtSigV4AsymQueryAuth):
+ """S3 SigV4A auth using query parameters.
+ This signer will sign a request using query parameters and signature
+ version 4A, i.e a "presigned url" signer.
+ """
+
+ # For S3, we do not normalize the path.
+ _USE_DOUBLE_URI_ENCODE = False
+ _SHOULD_NORMALIZE_URI_PATH = False
+
+ def _should_sha256_sign_payload(self, request):
+ # From the doc link above:
+ # "You don't include a payload hash in the Canonical Request, because
+ # when you create a presigned URL, you don't know anything about the
+ # payload. Instead, you use a constant string "UNSIGNED-PAYLOAD".
+ return False
+
+ def _should_add_content_sha256_header(self, explicit_payload):
+ # Never add X-Amz-Content-SHA256 header
+ return False
+
+
+class CrtSigV4QueryAuth(CrtSigV4Auth):
+ DEFAULT_EXPIRES = 3600
+ _SIGNATURE_TYPE = awscrt.auth.AwsSignatureType.HTTP_REQUEST_QUERY_PARAMS
+
+ def __init__(
+ self, credentials, service_name, region_name, expires=DEFAULT_EXPIRES
+ ):
+ super().__init__(credentials, service_name, region_name)
+ self._expiration_in_seconds = expires
+
+ def _modify_request_before_signing(self, request):
+ super()._modify_request_before_signing(request)
+
+ # We automatically set this header, so if it's the auto-set value we
+ # want to get rid of it since it doesn't make sense for presigned urls.
+ content_type = request.headers.get('content-type')
+ if content_type == 'application/x-www-form-urlencoded; charset=utf-8':
+ del request.headers['content-type']
+
+ # Now parse the original query string to a dict, inject our new query
+ # params, and serialize back to a query string.
+ url_parts = urlsplit(request.url)
+ # parse_qs makes each value a list, but in our case we know we won't
+ # have repeated keys so we know we have single element lists which we
+ # can convert back to scalar values.
+ query_dict = {
+ k: v[0]
+ for k, v in parse_qs(
+ url_parts.query, keep_blank_values=True
+ ).items()
+ }
+ if request.params:
+ query_dict.update(request.params)
+ request.params = {}
+ # The spec is particular about this. It *has* to be:
+ # https://<endpoint>?<operation params>&<auth params>
+ # You can't mix the two types of params together, i.e just keep doing
+ # new_query_params.update(op_params)
+ # new_query_params.update(auth_params)
+ # percent_encode_sequence(new_query_params)
+ if request.data:
+ # We also need to move the body params into the query string. To
+ # do this, we first have to convert it to a dict.
+ query_dict.update(_get_body_as_dict(request))
+ request.data = ''
+ new_query_string = percent_encode_sequence(query_dict)
+ # url_parts is a tuple (and therefore immutable) so we need to create
+ # a new url_parts with the new query string.
+ # <part> - <index>
+ # scheme - 0
+ # netloc - 1
+ # path - 2
+ # query - 3 <-- we're replacing this.
+ # fragment - 4
+ p = url_parts
+ new_url_parts = (p[0], p[1], p[2], new_query_string, p[4])
+ request.url = urlunsplit(new_url_parts)
+
+ def _apply_signing_changes(self, aws_request, signed_crt_request):
+ # Apply changes from signed CRT request to the AWSRequest
+ super()._apply_signing_changes(aws_request, signed_crt_request)
+
+ signed_query = urlsplit(signed_crt_request.path).query
+ p = urlsplit(aws_request.url)
+ # urlsplit() returns a tuple (and therefore immutable) so we
+ # need to create new url with the new query string.
+ # <part> - <index>
+ # scheme - 0
+ # netloc - 1
+ # path - 2
+ # query - 3 <-- we're replacing this.
+ # fragment - 4
+ aws_request.url = urlunsplit((p[0], p[1], p[2], signed_query, p[4]))
+
+
+class CrtS3SigV4QueryAuth(CrtSigV4QueryAuth):
+ """S3 SigV4 auth using query parameters.
+ This signer will sign a request using query parameters and signature
+ version 4, i.e a "presigned url" signer.
+ Based off of:
+ http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html
+ """
+
+ # For S3, we do not normalize the path.
+ _USE_DOUBLE_URI_ENCODE = False
+ _SHOULD_NORMALIZE_URI_PATH = False
+
+ def _should_sha256_sign_payload(self, request):
+ # From the doc link above:
+ # "You don't include a payload hash in the Canonical Request, because
+ # when you create a presigned URL, you don't know anything about the
+ # payload. Instead, you use a constant string "UNSIGNED-PAYLOAD".
+ return False
+
+ def _should_add_content_sha256_header(self, explicit_payload):
+ # Never add X-Amz-Content-SHA256 header
+ return False
+
+
+# Defined at the bottom of module to ensure all Auth
+# classes are defined.
+CRT_AUTH_TYPE_MAPS = {
+ 'v4': CrtSigV4Auth,
+ 'v4-query': CrtSigV4QueryAuth,
+ 'v4a': CrtSigV4AsymAuth,
+ 's3v4': CrtS3SigV4Auth,
+ 's3v4-query': CrtS3SigV4QueryAuth,
+ 's3v4a': CrtS3SigV4AsymAuth,
+ 's3v4a-query': CrtS3SigV4AsymQueryAuth,
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/_retry.json b/.venv/lib/python3.12/site-packages/botocore/data/_retry.json
new file mode 100644
index 00000000..bfdd2641
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/_retry.json
@@ -0,0 +1,292 @@
+{
+ "definitions": {
+ "throttling": {
+ "applies_when": {
+ "response": {
+ "service_error_code": "Throttling",
+ "http_status_code": 400
+ }
+ }
+ },
+ "throttling_exception": {
+ "applies_when": {
+ "response": {
+ "service_error_code": "ThrottlingException",
+ "http_status_code": 400
+ }
+ }
+ },
+ "throttled_exception": {
+ "applies_when": {
+ "response": {
+ "service_error_code": "ThrottledException",
+ "http_status_code": 400
+ }
+ }
+ },
+ "request_throttled_exception": {
+ "applies_when": {
+ "response": {
+ "service_error_code": "RequestThrottledException",
+ "http_status_code": 400
+ }
+ }
+ },
+ "too_many_requests": {
+ "applies_when": {
+ "response": {
+ "http_status_code": 429
+ }
+ }
+ },
+ "general_socket_errors": {
+ "applies_when": {
+ "socket_errors": ["GENERAL_CONNECTION_ERROR"]
+ }
+ },
+ "general_server_error": {
+ "applies_when": {
+ "response": {
+ "http_status_code": 500
+ }
+ }
+ },
+ "bad_gateway": {
+ "applies_when": {
+ "response": {
+ "http_status_code": 502
+ }
+ }
+ },
+ "service_unavailable": {
+ "applies_when": {
+ "response": {
+ "http_status_code": 503
+ }
+ }
+ },
+ "gateway_timeout": {
+ "applies_when": {
+ "response": {
+ "http_status_code": 504
+ }
+ }
+ },
+ "limit_exceeded": {
+ "applies_when": {
+ "response": {
+ "http_status_code": 509
+ }
+ }
+ },
+ "throughput_exceeded": {
+ "applies_when": {
+ "response": {
+ "service_error_code": "ProvisionedThroughputExceededException",
+ "http_status_code": 400
+ }
+ }
+ }
+ },
+ "retry": {
+ "__default__": {
+ "max_attempts": 5,
+ "delay": {
+ "type": "exponential",
+ "base": "rand",
+ "growth_factor": 2
+ },
+ "policies": {
+ "general_socket_errors": {"$ref": "general_socket_errors"},
+ "general_server_error": {"$ref": "general_server_error"},
+ "bad_gateway": {"$ref": "bad_gateway"},
+ "service_unavailable": {"$ref": "service_unavailable"},
+ "gateway_timeout": {"$ref": "gateway_timeout"},
+ "limit_exceeded": {"$ref": "limit_exceeded"},
+ "throttling_exception": {"$ref": "throttling_exception"},
+ "throttled_exception": {"$ref": "throttled_exception"},
+ "request_throttled_exception": {"$ref": "request_throttled_exception"},
+ "throttling": {"$ref": "throttling"},
+ "too_many_requests": {"$ref": "too_many_requests"},
+ "throughput_exceeded": {"$ref": "throughput_exceeded"}
+ }
+ },
+ "organizations": {
+ "__default__": {
+ "policies": {
+ "too_many_requests": {
+ "applies_when": {
+ "response": {
+ "service_error_code": "TooManyRequestsException",
+ "http_status_code": 400
+ }
+ }
+ }
+ }
+ }
+ },
+ "dynamodb": {
+ "__default__": {
+ "max_attempts": 10,
+ "delay": {
+ "type": "exponential",
+ "base": 0.05,
+ "growth_factor": 2
+ },
+ "policies": {
+ "still_processing": {
+ "applies_when": {
+ "response": {
+ "service_error_code": "TransactionInProgressException",
+ "http_status_code": 400
+ }
+ }
+ },
+ "crc32": {
+ "applies_when": {
+ "response": {
+ "crc32body": "x-amz-crc32"
+ }
+ }
+ }
+ }
+ }
+ },
+ "ec2": {
+ "__default__": {
+ "policies": {
+ "request_limit_exceeded": {
+ "applies_when": {
+ "response": {
+ "service_error_code": "RequestLimitExceeded",
+ "http_status_code": 503
+ }
+ }
+ },
+ "ec2_throttled_exception": {
+ "applies_when": {
+ "response": {
+ "service_error_code": "EC2ThrottledException",
+ "http_status_code": 503
+ }
+ }
+ }
+ }
+ }
+ },
+ "cloudsearch": {
+ "__default__": {
+ "policies": {
+ "request_limit_exceeded": {
+ "applies_when": {
+ "response": {
+ "service_error_code": "BandwidthLimitExceeded",
+ "http_status_code": 509
+ }
+ }
+ }
+ }
+ }
+ },
+ "kinesis": {
+ "__default__": {
+ "policies": {
+ "request_limit_exceeded": {
+ "applies_when": {
+ "response": {
+ "service_error_code": "LimitExceededException",
+ "http_status_code": 400
+ }
+ }
+ }
+ }
+ }
+ },
+ "sqs": {
+ "__default__": {
+ "policies": {
+ "request_limit_exceeded": {
+ "applies_when": {
+ "response": {
+ "service_error_code": "RequestThrottled",
+ "http_status_code": 403
+ }
+ }
+ }
+ }
+ }
+ },
+ "s3": {
+ "__default__": {
+ "policies": {
+ "timeouts": {
+ "applies_when": {
+ "response": {
+ "http_status_code": 400,
+ "service_error_code": "RequestTimeout"
+ }
+ }
+ },
+ "contentmd5": {
+ "applies_when": {
+ "response": {
+ "http_status_code": 400,
+ "service_error_code": "BadDigest"
+ }
+ }
+ }
+ }
+ }
+ },
+ "glacier": {
+ "__default__": {
+ "policies": {
+ "timeouts": {
+ "applies_when": {
+ "response": {
+ "http_status_code": 408,
+ "service_error_code": "RequestTimeoutException"
+ }
+ }
+ }
+ }
+ }
+ },
+ "route53": {
+ "__default__": {
+ "policies": {
+ "request_limit_exceeded": {
+ "applies_when": {
+ "response": {
+ "service_error_code": "Throttling",
+ "http_status_code": 400
+ }
+ }
+ },
+ "still_processing": {
+ "applies_when": {
+ "response": {
+ "service_error_code": "PriorRequestNotComplete",
+ "http_status_code": 400
+ }
+ }
+ }
+ }
+ }
+ },
+ "sts": {
+ "__default__": {
+ "policies": {
+ "idp_unreachable_error": {
+ "applies_when": {
+ "response": {
+ "service_error_code": "IDPCommunicationError",
+ "http_status_code": 400
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/accessanalyzer/2019-11-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/accessanalyzer/2019-11-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..40b0d452
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/accessanalyzer/2019-11-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/accessanalyzer/2019-11-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/accessanalyzer/2019-11-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/accessanalyzer/2019-11-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/accessanalyzer/2019-11-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/accessanalyzer/2019-11-01/paginators-1.json
new file mode 100644
index 00000000..de88b6d4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/accessanalyzer/2019-11-01/paginators-1.json
@@ -0,0 +1,70 @@
+{
+ "pagination": {
+ "ListAnalyzedResources": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "analyzedResources"
+ },
+ "ListAnalyzers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "analyzers"
+ },
+ "ListArchiveRules": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "archiveRules"
+ },
+ "ListFindings": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "findings"
+ },
+ "ListAccessPreviewFindings": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "findings"
+ },
+ "ListAccessPreviews": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "accessPreviews"
+ },
+ "ValidatePolicy": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "findings"
+ },
+ "ListPolicyGenerations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "policyGenerations"
+ },
+ "GetFindingV2": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "findingDetails"
+ },
+ "ListFindingsV2": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "findings"
+ },
+ "GetFindingRecommendation": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "recommendedSteps"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/accessanalyzer/2019-11-01/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/accessanalyzer/2019-11-01/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..2fe19c01
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/accessanalyzer/2019-11-01/paginators-1.sdk-extras.json
@@ -0,0 +1,31 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "GetFindingV2": {
+ "non_aggregate_keys": [
+ "resource",
+ "status",
+ "error",
+ "createdAt",
+ "resourceType",
+ "findingType",
+ "resourceOwnerAccount",
+ "analyzedAt",
+ "id",
+ "updatedAt"
+ ]
+ },
+ "GetFindingRecommendation": {
+ "non_aggregate_keys": [
+ "status",
+ "error",
+ "completedAt",
+ "recommendationType",
+ "resourceArn",
+ "startedAt"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/accessanalyzer/2019-11-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/accessanalyzer/2019-11-01/service-2.json.gz
new file mode 100644
index 00000000..f24d373c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/accessanalyzer/2019-11-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/account/2021-02-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/account/2021-02-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..31f07930
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/account/2021-02-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/account/2021-02-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/account/2021-02-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/account/2021-02-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/account/2021-02-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/account/2021-02-01/paginators-1.json
new file mode 100644
index 00000000..5e75ec80
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/account/2021-02-01/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListRegions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Regions"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/account/2021-02-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/account/2021-02-01/service-2.json.gz
new file mode 100644
index 00000000..5d70de5d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/account/2021-02-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/acm-pca/2017-08-22/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/acm-pca/2017-08-22/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..09cf6aa5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/acm-pca/2017-08-22/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/acm-pca/2017-08-22/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/acm-pca/2017-08-22/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/acm-pca/2017-08-22/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/acm-pca/2017-08-22/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/acm-pca/2017-08-22/paginators-1.json
new file mode 100644
index 00000000..c1f4e234
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/acm-pca/2017-08-22/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListCertificateAuthorities": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "CertificateAuthorities"
+ },
+ "ListTags": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Tags"
+ },
+ "ListPermissions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Permissions"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/acm-pca/2017-08-22/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/acm-pca/2017-08-22/service-2.json.gz
new file mode 100644
index 00000000..d00ceeb5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/acm-pca/2017-08-22/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/acm-pca/2017-08-22/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/acm-pca/2017-08-22/waiters-2.json
new file mode 100644
index 00000000..1d48140d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/acm-pca/2017-08-22/waiters-2.json
@@ -0,0 +1,64 @@
+{
+ "version" : 2,
+ "waiters" : {
+ "AuditReportCreated" : {
+ "description" : "Wait until a Audit Report is created",
+ "delay" : 3,
+ "maxAttempts" : 60,
+ "operation" : "DescribeCertificateAuthorityAuditReport",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "AuditReportStatus",
+ "state" : "success",
+ "expected" : "SUCCESS"
+ }, {
+ "matcher" : "path",
+ "argument" : "AuditReportStatus",
+ "state" : "failure",
+ "expected" : "FAILED"
+ }, {
+ "matcher" : "error",
+ "state" : "failure",
+ "expected" : "AccessDeniedException"
+ } ]
+ },
+ "CertificateAuthorityCSRCreated" : {
+ "description" : "Wait until a Certificate Authority CSR is created",
+ "delay" : 3,
+ "maxAttempts" : 60,
+ "operation" : "GetCertificateAuthorityCsr",
+ "acceptors" : [ {
+ "matcher" : "error",
+ "state" : "success",
+ "expected" : false
+ }, {
+ "matcher" : "error",
+ "state" : "retry",
+ "expected" : "RequestInProgressException"
+ }, {
+ "matcher" : "error",
+ "state" : "failure",
+ "expected" : "AccessDeniedException"
+ } ]
+ },
+ "CertificateIssued" : {
+ "description" : "Wait until a certificate is issued",
+ "delay" : 1,
+ "maxAttempts" : 60,
+ "operation" : "GetCertificate",
+ "acceptors" : [ {
+ "matcher" : "error",
+ "state" : "success",
+ "expected" : false
+ }, {
+ "matcher" : "error",
+ "state" : "retry",
+ "expected" : "RequestInProgressException"
+ }, {
+ "matcher" : "error",
+ "state" : "failure",
+ "expected" : "AccessDeniedException"
+ } ]
+ }
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/acm/2015-12-08/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/acm/2015-12-08/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..50cd0dfa
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/acm/2015-12-08/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/acm/2015-12-08/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/acm/2015-12-08/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/acm/2015-12-08/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/acm/2015-12-08/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/acm/2015-12-08/paginators-1.json
new file mode 100644
index 00000000..2e2e4f9a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/acm/2015-12-08/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListCertificates": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxItems",
+ "result_key": "CertificateSummaryList"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/acm/2015-12-08/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/acm/2015-12-08/service-2.json.gz
new file mode 100644
index 00000000..ecebb23e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/acm/2015-12-08/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/acm/2015-12-08/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/acm/2015-12-08/waiters-2.json
new file mode 100644
index 00000000..1fba453d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/acm/2015-12-08/waiters-2.json
@@ -0,0 +1,35 @@
+{
+ "version": 2,
+ "waiters": {
+ "CertificateValidated": {
+ "delay": 60,
+ "maxAttempts": 40,
+ "operation": "DescribeCertificate",
+ "acceptors": [
+ {
+ "matcher": "pathAll",
+ "expected": "SUCCESS",
+ "argument": "Certificate.DomainValidationOptions[].ValidationStatus",
+ "state": "success"
+ },
+ {
+ "matcher": "pathAny",
+ "expected": "PENDING_VALIDATION",
+ "argument": "Certificate.DomainValidationOptions[].ValidationStatus",
+ "state": "retry"
+ },
+ {
+ "matcher": "path",
+ "expected": "FAILED",
+ "argument": "Certificate.Status",
+ "state": "failure"
+ },
+ {
+ "matcher": "error",
+ "expected": "ResourceNotFoundException",
+ "state": "failure"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/amp/2020-08-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/amp/2020-08-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..69ab620f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/amp/2020-08-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/amp/2020-08-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/amp/2020-08-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/amp/2020-08-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/amp/2020-08-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/amp/2020-08-01/paginators-1.json
new file mode 100644
index 00000000..c1bf32ab
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/amp/2020-08-01/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListWorkspaces": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "workspaces"
+ },
+ "ListRuleGroupsNamespaces": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "ruleGroupsNamespaces"
+ },
+ "ListScrapers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "scrapers"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/amp/2020-08-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/amp/2020-08-01/service-2.json.gz
new file mode 100644
index 00000000..6de57aed
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/amp/2020-08-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/amp/2020-08-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/amp/2020-08-01/waiters-2.json
new file mode 100644
index 00000000..93d8cd64
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/amp/2020-08-01/waiters-2.json
@@ -0,0 +1,76 @@
+{
+ "version" : 2,
+ "waiters" : {
+ "ScraperActive" : {
+ "description" : "Wait until a scraper reaches ACTIVE status",
+ "delay" : 2,
+ "maxAttempts" : 60,
+ "operation" : "DescribeScraper",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "scraper.status.statusCode",
+ "state" : "success",
+ "expected" : "ACTIVE"
+ }, {
+ "matcher" : "path",
+ "argument" : "scraper.status.statusCode",
+ "state" : "failure",
+ "expected" : "CREATION_FAILED"
+ } ]
+ },
+ "ScraperDeleted" : {
+ "description" : "Wait until a scraper reaches DELETED status",
+ "delay" : 2,
+ "maxAttempts" : 60,
+ "operation" : "DescribeScraper",
+ "acceptors" : [ {
+ "matcher" : "error",
+ "state" : "success",
+ "expected" : "ResourceNotFoundException"
+ }, {
+ "matcher" : "path",
+ "argument" : "scraper.status.statusCode",
+ "state" : "failure",
+ "expected" : "DELETION_FAILED"
+ } ]
+ },
+ "WorkspaceActive" : {
+ "description" : "Wait until a workspace reaches ACTIVE status",
+ "delay" : 2,
+ "maxAttempts" : 60,
+ "operation" : "DescribeWorkspace",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "workspace.status.statusCode",
+ "state" : "success",
+ "expected" : "ACTIVE"
+ }, {
+ "matcher" : "path",
+ "argument" : "workspace.status.statusCode",
+ "state" : "retry",
+ "expected" : "UPDATING"
+ }, {
+ "matcher" : "path",
+ "argument" : "workspace.status.statusCode",
+ "state" : "retry",
+ "expected" : "CREATING"
+ } ]
+ },
+ "WorkspaceDeleted" : {
+ "description" : "Wait until a workspace reaches DELETED status",
+ "delay" : 2,
+ "maxAttempts" : 60,
+ "operation" : "DescribeWorkspace",
+ "acceptors" : [ {
+ "matcher" : "error",
+ "state" : "success",
+ "expected" : "ResourceNotFoundException"
+ }, {
+ "matcher" : "path",
+ "argument" : "workspace.status.statusCode",
+ "state" : "retry",
+ "expected" : "DELETING"
+ } ]
+ }
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/amplify/2017-07-25/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/amplify/2017-07-25/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..6d6b2970
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/amplify/2017-07-25/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/amplify/2017-07-25/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/amplify/2017-07-25/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/amplify/2017-07-25/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/amplify/2017-07-25/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/amplify/2017-07-25/paginators-1.json
new file mode 100644
index 00000000..f84208e9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/amplify/2017-07-25/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListApps": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "apps"
+ },
+ "ListBranches": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "branches"
+ },
+ "ListDomainAssociations": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "domainAssociations"
+ },
+ "ListJobs": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "jobSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/amplify/2017-07-25/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/amplify/2017-07-25/service-2.json.gz
new file mode 100644
index 00000000..5009b2ab
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/amplify/2017-07-25/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/amplifybackend/2020-08-11/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/amplifybackend/2020-08-11/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..c39dfc54
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/amplifybackend/2020-08-11/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/amplifybackend/2020-08-11/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/amplifybackend/2020-08-11/paginators-1.json
new file mode 100644
index 00000000..40304c7d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/amplifybackend/2020-08-11/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListBackendJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Jobs"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/amplifybackend/2020-08-11/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/amplifybackend/2020-08-11/service-2.json.gz
new file mode 100644
index 00000000..2a920bd5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/amplifybackend/2020-08-11/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/amplifyuibuilder/2021-08-11/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/amplifyuibuilder/2021-08-11/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..247b89a8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/amplifyuibuilder/2021-08-11/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/amplifyuibuilder/2021-08-11/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/amplifyuibuilder/2021-08-11/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/amplifyuibuilder/2021-08-11/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/amplifyuibuilder/2021-08-11/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/amplifyuibuilder/2021-08-11/paginators-1.json
new file mode 100644
index 00000000..d0a02427
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/amplifyuibuilder/2021-08-11/paginators-1.json
@@ -0,0 +1,43 @@
+{
+ "pagination": {
+ "ListComponents": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "entities"
+ },
+ "ListThemes": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "entities"
+ },
+ "ExportComponents": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "entities"
+ },
+ "ExportThemes": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "entities"
+ },
+ "ExportForms": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "entities"
+ },
+ "ListForms": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "entities"
+ },
+ "ListCodegenJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "entities"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/amplifyuibuilder/2021-08-11/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/amplifyuibuilder/2021-08-11/service-2.json.gz
new file mode 100644
index 00000000..69a34f1d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/amplifyuibuilder/2021-08-11/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/amplifyuibuilder/2021-08-11/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/amplifyuibuilder/2021-08-11/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/amplifyuibuilder/2021-08-11/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/apigateway/2015-07-09/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/apigateway/2015-07-09/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..4fd4cf44
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/apigateway/2015-07-09/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/apigateway/2015-07-09/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/apigateway/2015-07-09/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/apigateway/2015-07-09/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/apigateway/2015-07-09/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/apigateway/2015-07-09/paginators-1.json
new file mode 100644
index 00000000..2a875c55
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/apigateway/2015-07-09/paginators-1.json
@@ -0,0 +1,117 @@
+{
+ "pagination": {
+ "GetApiKeys": {
+ "input_token": "position",
+ "output_token": "position",
+ "limit_key": "limit",
+ "result_key": "items"
+ },
+ "GetBasePathMappings": {
+ "input_token": "position",
+ "output_token": "position",
+ "limit_key": "limit",
+ "result_key": "items"
+ },
+ "GetClientCertificates": {
+ "input_token": "position",
+ "output_token": "position",
+ "limit_key": "limit",
+ "result_key": "items"
+ },
+ "GetDeployments": {
+ "input_token": "position",
+ "output_token": "position",
+ "limit_key": "limit",
+ "result_key": "items"
+ },
+ "GetDomainNames": {
+ "input_token": "position",
+ "output_token": "position",
+ "limit_key": "limit",
+ "result_key": "items"
+ },
+ "GetModels": {
+ "input_token": "position",
+ "output_token": "position",
+ "limit_key": "limit",
+ "result_key": "items"
+ },
+ "GetResources": {
+ "input_token": "position",
+ "output_token": "position",
+ "limit_key": "limit",
+ "result_key": "items"
+ },
+ "GetRestApis": {
+ "input_token": "position",
+ "output_token": "position",
+ "limit_key": "limit",
+ "result_key": "items"
+ },
+ "GetUsage": {
+ "input_token": "position",
+ "output_token": "position",
+ "limit_key": "limit",
+ "result_key": "items",
+ "non_aggregate_keys": [
+ "usagePlanId",
+ "startDate",
+ "endDate"
+ ]
+ },
+ "GetUsagePlans": {
+ "input_token": "position",
+ "output_token": "position",
+ "limit_key": "limit",
+ "result_key": "items"
+ },
+ "GetUsagePlanKeys": {
+ "input_token": "position",
+ "output_token": "position",
+ "limit_key": "limit",
+ "result_key": "items"
+ },
+ "GetVpcLinks": {
+ "input_token": "position",
+ "limit_key": "limit",
+ "output_token": "position",
+ "result_key": "items"
+ },
+ "GetAuthorizers": {
+ "input_token": "position",
+ "limit_key": "limit",
+ "output_token": "position",
+ "result_key": "items"
+ },
+ "GetDocumentationParts": {
+ "input_token": "position",
+ "limit_key": "limit",
+ "output_token": "position",
+ "result_key": "items"
+ },
+ "GetDocumentationVersions": {
+ "input_token": "position",
+ "limit_key": "limit",
+ "output_token": "position",
+ "result_key": "items"
+ },
+ "GetGatewayResponses": {
+ "input_token": "position",
+ "limit_key": "limit",
+ "output_token": "position",
+ "result_key": "items"
+ },
+ "GetRequestValidators": {
+ "input_token": "position",
+ "limit_key": "limit",
+ "output_token": "position",
+ "result_key": "items"
+ },
+ "GetSdkTypes": {
+ "input_token": "position",
+ "limit_key": "limit",
+ "output_token": "position",
+ "result_key": "items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/apigateway/2015-07-09/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/apigateway/2015-07-09/service-2.json.gz
new file mode 100644
index 00000000..9e9a85a1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/apigateway/2015-07-09/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/apigatewaymanagementapi/2018-11-29/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/apigatewaymanagementapi/2018-11-29/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..3565d112
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/apigatewaymanagementapi/2018-11-29/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/apigatewaymanagementapi/2018-11-29/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/apigatewaymanagementapi/2018-11-29/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/apigatewaymanagementapi/2018-11-29/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/apigatewaymanagementapi/2018-11-29/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/apigatewaymanagementapi/2018-11-29/service-2.json.gz
new file mode 100644
index 00000000..54e2a975
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/apigatewaymanagementapi/2018-11-29/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/apigatewayv2/2018-11-29/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/apigatewayv2/2018-11-29/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..4fd4cf44
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/apigatewayv2/2018-11-29/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/apigatewayv2/2018-11-29/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/apigatewayv2/2018-11-29/paginators-1.json
new file mode 100644
index 00000000..2f57dd2c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/apigatewayv2/2018-11-29/paginators-1.json
@@ -0,0 +1,64 @@
+{
+ "pagination": {
+ "GetApis": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Items"
+ },
+ "GetAuthorizers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Items"
+ },
+ "GetDeployments": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Items"
+ },
+ "GetDomainNames": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Items"
+ },
+ "GetIntegrationResponses": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Items"
+ },
+ "GetIntegrations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Items"
+ },
+ "GetModels": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Items"
+ },
+ "GetRouteResponses": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Items"
+ },
+ "GetRoutes": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Items"
+ },
+ "GetStages": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/apigatewayv2/2018-11-29/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/apigatewayv2/2018-11-29/service-2.json.gz
new file mode 100644
index 00000000..ffe60c6e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/apigatewayv2/2018-11-29/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appconfig/2019-10-09/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/appconfig/2019-10-09/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..3305a7a3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appconfig/2019-10-09/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appconfig/2019-10-09/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/appconfig/2019-10-09/examples-1.json
new file mode 100644
index 00000000..664e05ef
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appconfig/2019-10-09/examples-1.json
@@ -0,0 +1,720 @@
+{
+ "version": "1.0",
+ "examples": {
+ "CreateApplication": [
+ {
+ "input": {
+ "Description": "An application used for creating an example.",
+ "Name": "example-application"
+ },
+ "output": {
+ "Description": "An application used for creating an example.",
+ "Id": "339ohji",
+ "Name": "example-application"
+ },
+ "comments": {
+ },
+ "description": "The following create-application example creates an application in AWS AppConfig.",
+ "id": "to-create-an-application-1632264511615",
+ "title": "To create an application"
+ }
+ ],
+ "CreateConfigurationProfile": [
+ {
+ "input": {
+ "ApplicationId": "339ohji",
+ "LocationUri": "ssm-parameter://Example-Parameter",
+ "Name": "Example-Configuration-Profile",
+ "RetrievalRoleArn": "arn:aws:iam::111122223333:role/Example-App-Config-Role"
+ },
+ "output": {
+ "ApplicationId": "339ohji",
+ "Id": "ur8hx2f",
+ "LocationUri": "ssm-parameter://Example-Parameter",
+ "Name": "Example-Configuration-Profile",
+ "RetrievalRoleArn": "arn:aws:iam::111122223333:role/Example-App-Config-Role"
+ },
+ "comments": {
+ },
+ "description": "The following create-configuration-profile example creates a configuration profile using a configuration stored in Parameter Store, a capability of Systems Manager.",
+ "id": "to-create-a-configuration-profile-1632264580336",
+ "title": "To create a configuration profile"
+ }
+ ],
+ "CreateDeploymentStrategy": [
+ {
+ "input": {
+ "DeploymentDurationInMinutes": 15,
+ "GrowthFactor": 25,
+ "Name": "Example-Deployment",
+ "ReplicateTo": "SSM_DOCUMENT"
+ },
+ "output": {
+ "DeploymentDurationInMinutes": 15,
+ "FinalBakeTimeInMinutes": 0,
+ "GrowthFactor": 25,
+ "GrowthType": "LINEAR",
+ "Id": "1225qzk",
+ "Name": "Example-Deployment",
+ "ReplicateTo": "SSM_DOCUMENT"
+ },
+ "comments": {
+ },
+ "description": "The following create-deployment-strategy example creates a deployment strategy called Example-Deployment that takes 15 minutes and deploys the configuration to 25% of the application at a time. The strategy is also copied to an SSM Document.",
+ "id": "to-create-a-deployment-strategy-1632264783812",
+ "title": "To create a deployment strategy"
+ }
+ ],
+ "CreateEnvironment": [
+ {
+ "input": {
+ "ApplicationId": "339ohji",
+ "Name": "Example-Environment"
+ },
+ "output": {
+ "ApplicationId": "339ohji",
+ "Id": "54j1r29",
+ "Name": "Example-Environment",
+ "State": "READY_FOR_DEPLOYMENT"
+ },
+ "comments": {
+ },
+ "description": "The following create-environment example creates an AWS AppConfig environment named Example-Environment using the application you created using create-application",
+ "id": "to-create-an-environment-1632265124975",
+ "title": "To create an environment"
+ }
+ ],
+ "CreateHostedConfigurationVersion": [
+ {
+ "input": {
+ "ApplicationId": "339ohji",
+ "ConfigurationProfileId": "ur8hx2f",
+ "Content": "eyAiTmFtZSI6ICJFeGFtcGxlQXBwbGljYXRpb24iLCAiSWQiOiBFeGFtcGxlSUQsICJSYW5rIjogNyB9",
+ "ContentType": "text",
+ "LatestVersionNumber": 1
+ },
+ "output": {
+ "ApplicationId": "339ohji",
+ "ConfigurationProfileId": "ur8hx2f",
+ "ContentType": "text",
+ "VersionNumber": 1
+ },
+ "comments": {
+ },
+ "description": "The following create-hosted-configuration-version example creates a new configuration in the AWS AppConfig configuration store.",
+ "id": "to-create-a-hosted-configuration-version-1632265196980",
+ "title": "To create a hosted configuration version"
+ }
+ ],
+ "DeleteApplication": [
+ {
+ "input": {
+ "ApplicationId": "339ohji"
+ },
+ "comments": {
+ },
+ "description": "The following delete-application example deletes the specified application. \n",
+ "id": "to-delete-an-application-1632265343951",
+ "title": "To delete an application"
+ }
+ ],
+ "DeleteConfigurationProfile": [
+ {
+ "input": {
+ "ApplicationId": "339ohji",
+ "ConfigurationProfileId": "ur8hx2f"
+ },
+ "comments": {
+ },
+ "description": "The following delete-configuration-profile example deletes the specified configuration profile.",
+ "id": "to-delete-a-configuration-profile-1632265401308",
+ "title": "To delete a configuration profile"
+ }
+ ],
+ "DeleteDeploymentStrategy": [
+ {
+ "input": {
+ "DeploymentStrategyId": "1225qzk"
+ },
+ "comments": {
+ },
+ "description": "The following delete-deployment-strategy example deletes the specified deployment strategy.",
+ "id": "to-delete-a-deployment-strategy-1632265473708",
+ "title": "To delete a deployment strategy"
+ }
+ ],
+ "DeleteEnvironment": [
+ {
+ "input": {
+ "ApplicationId": "339ohji",
+ "EnvironmentId": "54j1r29"
+ },
+ "comments": {
+ },
+ "description": "The following delete-environment example deletes the specified application environment.",
+ "id": "to-delete-an-environment-1632265641044",
+ "title": "To delete an environment"
+ }
+ ],
+ "DeleteHostedConfigurationVersion": [
+ {
+ "input": {
+ "ApplicationId": "339ohji",
+ "ConfigurationProfileId": "ur8hx2f",
+ "VersionNumber": 1
+ },
+ "comments": {
+ },
+ "description": "The following delete-hosted-configuration-version example deletes a configuration version hosted in the AWS AppConfig configuration store.",
+ "id": "to-delete-a-hosted-configuration-version-1632265720740",
+ "title": "To delete a hosted configuration version"
+ }
+ ],
+ "GetApplication": [
+ {
+ "input": {
+ "ApplicationId": "339ohji"
+ },
+ "output": {
+ "Id": "339ohji",
+ "Name": "example-application"
+ },
+ "comments": {
+ },
+ "description": "The following get-application example lists the details of the specified application.",
+ "id": "to-list-details-of-an-application-1632265864702",
+ "title": "To list details of an application"
+ }
+ ],
+ "GetConfiguration": [
+ {
+ "input": {
+ "Application": "example-application",
+ "ClientId": "example-id",
+ "Configuration": "Example-Configuration-Profile",
+ "Environment": "Example-Environment"
+ },
+ "output": {
+ "ConfigurationVersion": "1",
+ "ContentType": "application/octet-stream"
+ },
+ "comments": {
+ },
+ "description": "The following get-configuration example returns the configuration details of the example application. On subsequent calls to get-configuration, use the client-configuration-version parameter to only update the configuration of your application if the version has changed. Only updating the configuration when the version has changed avoids excess charges incurred by calling get-configuration.",
+ "id": "to-retrieve-configuration-details-1632265954314",
+ "title": "To retrieve configuration details"
+ }
+ ],
+ "GetConfigurationProfile": [
+ {
+ "input": {
+ "ApplicationId": "339ohji",
+ "ConfigurationProfileId": "ur8hx2f"
+ },
+ "output": {
+ "ApplicationId": "339ohji",
+ "Id": "ur8hx2f",
+ "LocationUri": "ssm-parameter://Example-Parameter",
+ "Name": "Example-Configuration-Profile",
+ "RetrievalRoleArn": "arn:aws:iam::111122223333:role/Example-App-Config-Role"
+ },
+ "comments": {
+ },
+ "description": "The following get-configuration-profile example returns the details of the specified configuration profile.",
+ "id": "to-retrieve-configuration-profile-details-1632266081013",
+ "title": "To retrieve configuration profile details"
+ }
+ ],
+ "GetDeployment": [
+ {
+ "input": {
+ "ApplicationId": "339ohji",
+ "DeploymentNumber": 1,
+ "EnvironmentId": "54j1r29"
+ },
+ "output": {
+ "ApplicationId": "339ohji",
+ "CompletedAt": "2021-09-17T21:59:03.888000+00:00",
+ "ConfigurationLocationUri": "ssm-parameter://Example-Parameter",
+ "ConfigurationName": "Example-Configuration-Profile",
+ "ConfigurationProfileId": "ur8hx2f",
+ "ConfigurationVersion": "1",
+ "DeploymentDurationInMinutes": 15,
+ "DeploymentNumber": 1,
+ "DeploymentStrategyId": "1225qzk",
+ "EnvironmentId": "54j1r29",
+ "EventLog": [
+ {
+ "Description": "Deployment completed",
+ "EventType": "DEPLOYMENT_COMPLETED",
+ "OccurredAt": "2021-09-17T21:59:03.888000+00:00",
+ "TriggeredBy": "APPCONFIG"
+ },
+ {
+ "Description": "Deployment bake time started",
+ "EventType": "BAKE_TIME_STARTED",
+ "OccurredAt": "2021-09-17T21:58:57.722000+00:00",
+ "TriggeredBy": "APPCONFIG"
+ },
+ {
+ "Description": "Configuration available to 100.00% of clients",
+ "EventType": "PERCENTAGE_UPDATED",
+ "OccurredAt": "2021-09-17T21:55:56.816000+00:00",
+ "TriggeredBy": "APPCONFIG"
+ },
+ {
+ "Description": "Configuration available to 75.00% of clients",
+ "EventType": "PERCENTAGE_UPDATED",
+ "OccurredAt": "2021-09-17T21:52:56.567000+00:00",
+ "TriggeredBy": "APPCONFIG"
+ },
+ {
+ "Description": "Configuration available to 50.00% of clients",
+ "EventType": "PERCENTAGE_UPDATED",
+ "OccurredAt": "2021-09-17T21:49:55.737000+00:00",
+ "TriggeredBy": "APPCONFIG"
+ },
+ {
+ "Description": "Configuration available to 25.00% of clients",
+ "EventType": "PERCENTAGE_UPDATED",
+ "OccurredAt": "2021-09-17T21:46:55.187000+00:00",
+ "TriggeredBy": "APPCONFIG"
+ },
+ {
+ "Description": "Deployment started",
+ "EventType": "DEPLOYMENT_STARTED",
+ "OccurredAt": "2021-09-17T21:43:54.205000+00:00",
+ "TriggeredBy": "USER"
+ }
+ ],
+ "FinalBakeTimeInMinutes": 0,
+ "GrowthFactor": 25,
+ "GrowthType": "LINEAR",
+ "PercentageComplete": 100,
+ "StartedAt": "2021-09-17T21:43:54.205000+00:00",
+ "State": "COMPLETE"
+ },
+ "comments": {
+ },
+ "description": "The following get-deployment example lists details of the deployment to the application in the specified environment and deployment.",
+ "id": "to-retrieve-deployment-details-1633976766883",
+ "title": "To retrieve deployment details"
+ }
+ ],
+ "GetDeploymentStrategy": [
+ {
+ "input": {
+ "DeploymentStrategyId": "1225qzk"
+ },
+ "output": {
+ "DeploymentDurationInMinutes": 15,
+ "FinalBakeTimeInMinutes": 0,
+ "GrowthFactor": 25,
+ "GrowthType": "LINEAR",
+ "Id": "1225qzk",
+ "Name": "Example-Deployment",
+ "ReplicateTo": "SSM_DOCUMENT"
+ },
+ "comments": {
+ },
+ "description": "The following get-deployment-strategy example lists the details of the specified deployment strategy.",
+ "id": "to-retrieve-details-of-a-deployment-strategy-1632266385805",
+ "title": "To retrieve details of a deployment strategy"
+ }
+ ],
+ "GetEnvironment": [
+ {
+ "input": {
+ "ApplicationId": "339ohji",
+ "EnvironmentId": "54j1r29"
+ },
+ "output": {
+ "ApplicationId": "339ohji",
+ "Id": "54j1r29",
+ "Name": "Example-Environment",
+ "State": "READY_FOR_DEPLOYMENT"
+ },
+ "comments": {
+ },
+ "description": "The following get-environment example returns the details and state of the specified environment.",
+ "id": "to-retrieve-environment-details-1632266924806",
+ "title": "To retrieve environment details"
+ }
+ ],
+ "GetHostedConfigurationVersion": [
+ {
+ "input": {
+ "ApplicationId": "339ohji",
+ "ConfigurationProfileId": "ur8hx2f",
+ "VersionNumber": 1
+ },
+ "output": {
+ "ApplicationId": "339ohji",
+ "ConfigurationProfileId": "ur8hx2f",
+ "ContentType": "application/json",
+ "VersionNumber": 1
+ },
+ "comments": {
+ },
+ "description": "The following get-hosted-configuration-version example retrieves the configuration details of the AWS AppConfig hosted configuration.",
+ "id": "to-retrieve-hosted-configuration-details-1632267003527",
+ "title": "To retrieve hosted configuration details"
+ }
+ ],
+ "ListApplications": [
+ {
+ "input": {
+ },
+ "output": {
+ "Items": [
+ {
+ "Description": "An application used for creating an example.",
+ "Id": "339ohji",
+ "Name": "test-application"
+ },
+ {
+ "Id": "rwalwu7",
+ "Name": "Test-Application"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "The following list-applications example lists the available applications in your AWS account.",
+ "id": "to-list-the-available-applications-1632267111131",
+ "title": "To list the available applications"
+ }
+ ],
+ "ListConfigurationProfiles": [
+ {
+ "input": {
+ "ApplicationId": "339ohji"
+ },
+ "output": {
+ "Items": [
+ {
+ "ApplicationId": "339ohji",
+ "Id": "ur8hx2f",
+ "LocationUri": "ssm-parameter://Example-Parameter",
+ "Name": "Example-Configuration-Profile"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "The following list-configuration-profiles example lists the available configuration profiles for the specified application.",
+ "id": "to-list-the-available-configuration-profiles-1632267193265",
+ "title": "To list the available configuration profiles"
+ }
+ ],
+ "ListDeploymentStrategies": [
+ {
+ "input": {
+ },
+ "output": {
+ "Items": [
+ {
+ "DeploymentDurationInMinutes": 15,
+ "FinalBakeTimeInMinutes": 0,
+ "GrowthFactor": 25,
+ "GrowthType": "LINEAR",
+ "Id": "1225qzk",
+ "Name": "Example-Deployment",
+ "ReplicateTo": "SSM_DOCUMENT"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "The following list-deployment-strategies example lists the available deployment strategies in your AWS account.",
+ "id": "to-list-the-available-deployment-strategies-1632267364180",
+ "title": "To list the available deployment strategies"
+ }
+ ],
+ "ListDeployments": [
+ {
+ "input": {
+ "ApplicationId": "339ohji",
+ "EnvironmentId": "54j1r29"
+ },
+ "output": {
+ "Items": [
+ {
+ "CompletedAt": "2021-09-17T21:59:03.888000+00:00",
+ "ConfigurationName": "Example-Configuration-Profile",
+ "ConfigurationVersion": "1",
+ "DeploymentDurationInMinutes": 15,
+ "DeploymentNumber": 1,
+ "FinalBakeTimeInMinutes": 0,
+ "GrowthFactor": 25,
+ "GrowthType": "LINEAR",
+ "PercentageComplete": 100,
+ "StartedAt": "2021-09-17T21:43:54.205000+00:00",
+ "State": "COMPLETE"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "The following list-deployments example lists the available deployments in your AWS account for the specified application and environment.",
+ "id": "to-list-the-available-deployments-1632267282025",
+ "title": "To list the available deployments"
+ }
+ ],
+ "ListEnvironments": [
+ {
+ "input": {
+ "ApplicationId": "339ohji"
+ },
+ "output": {
+ "Items": [
+ {
+ "ApplicationId": "339ohji",
+ "Id": "54j1r29",
+ "Name": "Example-Environment",
+ "State": "READY_FOR_DEPLOYMENT"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "The following list-environments example lists the available environments in your AWS account for the specified application.",
+ "id": "to-list-the-available-environments-1632267474389",
+ "title": "To list the available environments"
+ }
+ ],
+ "ListHostedConfigurationVersions": [
+ {
+ "input": {
+ "ApplicationId": "339ohji",
+ "ConfigurationProfileId": "ur8hx2f"
+ },
+ "output": {
+ "Items": [
+ {
+ "ApplicationId": "339ohji",
+ "ConfigurationProfileId": "ur8hx2f",
+ "ContentType": "application/json",
+ "VersionNumber": 1
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "The following list-hosted-configuration-versions example lists the configurations versions hosted in the AWS AppConfig hosted configuration store for the specified application and configuration profile.",
+ "id": "to-list-the-available-hosted-configuration-versions-1632267647667",
+ "title": "To list the available hosted configuration versions"
+ }
+ ],
+ "ListTagsForResource": [
+ {
+ "input": {
+ "ResourceArn": "arn:aws:appconfig:us-east-1:111122223333:application/339ohji"
+ },
+ "output": {
+ "Tags": {
+ "group1": "1"
+ }
+ },
+ "comments": {
+ },
+ "description": "The following list-tags-for-resource example lists the tags of a specified application.",
+ "id": "to-list-the-tags-of-an-application-1632328796560",
+ "title": "To list the tags of an application"
+ }
+ ],
+ "StartDeployment": [
+ {
+ "input": {
+ "ApplicationId": "339ohji",
+ "ConfigurationProfileId": "ur8hx2f",
+ "ConfigurationVersion": "1",
+ "DeploymentStrategyId": "1225qzk",
+ "Description": "",
+ "EnvironmentId": "54j1r29",
+ "Tags": {
+ }
+ },
+ "output": {
+ "ApplicationId": "339ohji",
+ "ConfigurationLocationUri": "ssm-parameter://Example-Parameter",
+ "ConfigurationName": "Example-Configuration-Profile",
+ "ConfigurationProfileId": "ur8hx2f",
+ "ConfigurationVersion": "1",
+ "DeploymentDurationInMinutes": 15,
+ "DeploymentNumber": 1,
+ "DeploymentStrategyId": "1225qzk",
+ "EnvironmentId": "54j1r29",
+ "EventLog": [
+ {
+ "Description": "Deployment started",
+ "EventType": "DEPLOYMENT_STARTED",
+ "OccurredAt": "2021-09-17T21:43:54.205000+00:00",
+ "TriggeredBy": "USER"
+ }
+ ],
+ "FinalBakeTimeInMinutes": 0,
+ "GrowthFactor": 25,
+ "GrowthType": "LINEAR",
+ "PercentageComplete": 1.0,
+ "StartedAt": "2021-09-17T21:43:54.205000+00:00",
+ "State": "DEPLOYING"
+ },
+ "comments": {
+ },
+ "description": "The following start-deployment example starts a deployment to the application using the specified environment, deployment strategy, and configuration profile.",
+ "id": "to-start-a-configuration-deployment-1632328956790",
+ "title": "To start a configuration deployment"
+ }
+ ],
+ "StopDeployment": [
+ {
+ "input": {
+ "ApplicationId": "339ohji",
+ "DeploymentNumber": 2,
+ "EnvironmentId": "54j1r29"
+ },
+ "output": {
+ "DeploymentDurationInMinutes": 15,
+ "DeploymentNumber": 2,
+ "FinalBakeTimeInMinutes": 0,
+ "GrowthFactor": 25.0,
+ "PercentageComplete": 1.0
+ },
+ "comments": {
+ },
+ "description": "The following stop-deployment example stops the deployment of an application configuration to the specified environment.",
+ "id": "to-stop-configuration-deployment-1632329139126",
+ "title": "To stop configuration deployment"
+ }
+ ],
+ "TagResource": [
+ {
+ "input": {
+ "ResourceArn": "arn:aws:appconfig:us-east-1:111122223333:application/339ohji",
+ "Tags": {
+ "group1": "1"
+ }
+ },
+ "comments": {
+ },
+ "description": "The following tag-resource example tags an application resource.",
+ "id": "to-tag-an-application-1632330350645",
+ "title": "To tag an application"
+ }
+ ],
+ "UntagResource": [
+ {
+ "input": {
+ "ResourceArn": "arn:aws:appconfig:us-east-1:111122223333:application/339ohji",
+ "TagKeys": [
+ "group1"
+ ]
+ },
+ "comments": {
+ },
+ "description": "The following untag-resource example removes the group1 tag from the specified application.",
+ "id": "to-remove-a-tag-from-an-application-1632330429881",
+ "title": "To remove a tag from an application"
+ }
+ ],
+ "UpdateApplication": [
+ {
+ "input": {
+ "ApplicationId": "339ohji",
+ "Description": "",
+ "Name": "Example-Application"
+ },
+ "output": {
+ "Description": "An application used for creating an example.",
+ "Id": "339ohji",
+ "Name": "Example-Application"
+ },
+ "comments": {
+ },
+ "description": "The following update-application example updates the name of the specified application.",
+ "id": "to-update-an-application-1632330585893",
+ "title": "To update an application"
+ }
+ ],
+ "UpdateConfigurationProfile": [
+ {
+ "input": {
+ "ApplicationId": "339ohji",
+ "ConfigurationProfileId": "ur8hx2f",
+ "Description": "Configuration profile used for examples."
+ },
+ "output": {
+ "ApplicationId": "339ohji",
+ "Description": "Configuration profile used for examples.",
+ "Id": "ur8hx2f",
+ "LocationUri": "ssm-parameter://Example-Parameter",
+ "Name": "Example-Configuration-Profile",
+ "RetrievalRoleArn": "arn:aws:iam::111122223333:role/Example-App-Config-Role"
+ },
+ "comments": {
+ },
+ "description": "The following update-configuration-profile example updates the description of the specified configuration profile.",
+ "id": "to-update-a-configuration-profile-1632330721974",
+ "title": "To update a configuration profile"
+ }
+ ],
+ "UpdateDeploymentStrategy": [
+ {
+ "input": {
+ "DeploymentStrategyId": "1225qzk",
+ "FinalBakeTimeInMinutes": 20
+ },
+ "output": {
+ "DeploymentDurationInMinutes": 15,
+ "FinalBakeTimeInMinutes": 20,
+ "GrowthFactor": 25,
+ "GrowthType": "LINEAR",
+ "Id": "1225qzk",
+ "Name": "Example-Deployment",
+ "ReplicateTo": "SSM_DOCUMENT"
+ },
+ "comments": {
+ },
+ "description": "The following update-deployment-strategy example updates final bake time to 20 minutes in the specified deployment strategy. ::\n",
+ "id": "to-update-a-deployment-strategy-1632330896602",
+ "title": "To update a deployment strategy"
+ }
+ ],
+ "UpdateEnvironment": [
+ {
+ "input": {
+ "ApplicationId": "339ohji",
+ "Description": "An environment for examples.",
+ "EnvironmentId": "54j1r29"
+ },
+ "output": {
+ "ApplicationId": "339ohji",
+ "Description": "An environment for examples.",
+ "Id": "54j1r29",
+ "Name": "Example-Environment",
+ "State": "ROLLED_BACK"
+ },
+ "comments": {
+ },
+ "description": "The following update-environment example updates an environment's description.",
+ "id": "to-update-an-environment-1632331382428",
+ "title": "To update an environment"
+ }
+ ],
+ "ValidateConfiguration": [
+ {
+ "input": {
+ "ApplicationId": "abc1234",
+ "ConfigurationProfileId": "ur8hx2f",
+ "ConfigurationVersion": "1"
+ },
+ "comments": {
+ },
+ "description": "The following validate-configuration example uses the validators in a configuration profile to validate a configuration.",
+ "id": "to-validate-a-configuration-1632331491365",
+ "title": "To validate a configuration"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appconfig/2019-10-09/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/appconfig/2019-10-09/paginators-1.json
new file mode 100644
index 00000000..f176baba
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appconfig/2019-10-09/paginators-1.json
@@ -0,0 +1,52 @@
+{
+ "pagination": {
+ "ListApplications": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListConfigurationProfiles": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListDeploymentStrategies": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListDeployments": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListEnvironments": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListExtensionAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListExtensions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListHostedConfigurationVersions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appconfig/2019-10-09/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/appconfig/2019-10-09/service-2.json.gz
new file mode 100644
index 00000000..9bedcad6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appconfig/2019-10-09/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appconfigdata/2021-11-11/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/appconfigdata/2021-11-11/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..0c38be5b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appconfigdata/2021-11-11/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appconfigdata/2021-11-11/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/appconfigdata/2021-11-11/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appconfigdata/2021-11-11/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appconfigdata/2021-11-11/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/appconfigdata/2021-11-11/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appconfigdata/2021-11-11/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appconfigdata/2021-11-11/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/appconfigdata/2021-11-11/service-2.json.gz
new file mode 100644
index 00000000..95058a37
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appconfigdata/2021-11-11/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appfabric/2023-05-19/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/appfabric/2023-05-19/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..5f80c868
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appfabric/2023-05-19/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appfabric/2023-05-19/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/appfabric/2023-05-19/paginators-1.json
new file mode 100644
index 00000000..8138e8a2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appfabric/2023-05-19/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListAppAuthorizations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "appAuthorizationSummaryList"
+ },
+ "ListAppBundles": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "appBundleSummaryList"
+ },
+ "ListIngestionDestinations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "ingestionDestinations"
+ },
+ "ListIngestions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "ingestions"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appfabric/2023-05-19/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/appfabric/2023-05-19/service-2.json.gz
new file mode 100644
index 00000000..d9c9334b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appfabric/2023-05-19/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appfabric/2023-05-19/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/appfabric/2023-05-19/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appfabric/2023-05-19/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appflow/2020-08-23/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/appflow/2020-08-23/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..ff595884
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appflow/2020-08-23/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appflow/2020-08-23/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/appflow/2020-08-23/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appflow/2020-08-23/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appflow/2020-08-23/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/appflow/2020-08-23/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appflow/2020-08-23/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appflow/2020-08-23/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/appflow/2020-08-23/service-2.json.gz
new file mode 100644
index 00000000..96366da9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appflow/2020-08-23/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appintegrations/2020-07-29/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/appintegrations/2020-07-29/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..74ff20dd
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appintegrations/2020-07-29/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appintegrations/2020-07-29/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/appintegrations/2020-07-29/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appintegrations/2020-07-29/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appintegrations/2020-07-29/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/appintegrations/2020-07-29/paginators-1.json
new file mode 100644
index 00000000..64b4b5cb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appintegrations/2020-07-29/paginators-1.json
@@ -0,0 +1,40 @@
+{
+ "pagination": {
+ "ListApplications": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Applications"
+ },
+ "ListDataIntegrationAssociations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "DataIntegrationAssociations"
+ },
+ "ListDataIntegrations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "DataIntegrations"
+ },
+ "ListEventIntegrationAssociations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "EventIntegrationAssociations"
+ },
+ "ListEventIntegrations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "EventIntegrations"
+ },
+ "ListApplicationAssociations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ApplicationAssociations"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appintegrations/2020-07-29/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/appintegrations/2020-07-29/service-2.json.gz
new file mode 100644
index 00000000..e8e8d57a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appintegrations/2020-07-29/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/application-autoscaling/2016-02-06/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/application-autoscaling/2016-02-06/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..1c338c14
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/application-autoscaling/2016-02-06/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/application-autoscaling/2016-02-06/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/application-autoscaling/2016-02-06/examples-1.json
new file mode 100644
index 00000000..5abcd554
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/application-autoscaling/2016-02-06/examples-1.json
@@ -0,0 +1,221 @@
+{
+ "version": "1.0",
+ "examples": {
+ "DeleteScalingPolicy": [
+ {
+ "input": {
+ "PolicyName": "web-app-cpu-lt-25",
+ "ResourceId": "service/default/web-app",
+ "ScalableDimension": "ecs:service:DesiredCount",
+ "ServiceNamespace": "ecs"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes a scaling policy for the Amazon ECS service called web-app, which is running in the default cluster.",
+ "id": "to-delete-a-scaling-policy-1470863892689",
+ "title": "To delete a scaling policy"
+ }
+ ],
+ "DeregisterScalableTarget": [
+ {
+ "input": {
+ "ResourceId": "service/default/web-app",
+ "ScalableDimension": "ecs:service:DesiredCount",
+ "ServiceNamespace": "ecs"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deregisters a scalable target for an Amazon ECS service called web-app that is running in the default cluster.",
+ "id": "to-deregister-a-scalable-target-1470864164895",
+ "title": "To deregister a scalable target"
+ }
+ ],
+ "DescribeScalableTargets": [
+ {
+ "input": {
+ "ServiceNamespace": "ecs"
+ },
+ "output": {
+ "ScalableTargets": [
+ {
+ "CreationTime": "2019-05-06T11:21:46.199Z",
+ "MaxCapacity": 10,
+ "MinCapacity": 1,
+ "ResourceId": "service/default/web-app",
+ "RoleARN": "arn:aws:iam::012345678910:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService",
+ "ScalableDimension": "ecs:service:DesiredCount",
+ "ServiceNamespace": "ecs",
+ "SuspendedState": {
+ "DynamicScalingInSuspended": false,
+ "DynamicScalingOutSuspended": false,
+ "ScheduledScalingSuspended": false
+ }
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the scalable targets for the ECS service namespace.",
+ "id": "to-describe-scalable-targets-1470864286961",
+ "title": "To describe scalable targets"
+ }
+ ],
+ "DescribeScalingActivities": [
+ {
+ "input": {
+ "ResourceId": "service/default/web-app",
+ "ScalableDimension": "ecs:service:DesiredCount",
+ "ServiceNamespace": "ecs"
+ },
+ "output": {
+ "ScalingActivities": [
+ {
+ "ActivityId": "e6c5f7d1-dbbb-4a3f-89b2-51f33e766399",
+ "Cause": "monitor alarm web-app-cpu-lt-25 in state ALARM triggered policy web-app-cpu-lt-25",
+ "Description": "Setting desired count to 1.",
+ "EndTime": "2019-05-06T16:04:32.111Z",
+ "ResourceId": "service/default/web-app",
+ "ScalableDimension": "ecs:service:DesiredCount",
+ "ServiceNamespace": "ecs",
+ "StartTime": "2019-05-06T16:03:58.171Z",
+ "StatusCode": "Successful",
+ "StatusMessage": "Successfully set desired count to 1. Change successfully fulfilled by ecs."
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the scaling activities for an Amazon ECS service called web-app that is running in the default cluster.",
+ "id": "to-describe-scaling-activities-for-a-scalable-target-1470864398629",
+ "title": "To describe scaling activities for a scalable target"
+ }
+ ],
+ "DescribeScalingPolicies": [
+ {
+ "input": {
+ "ServiceNamespace": "ecs"
+ },
+ "output": {
+ "NextToken": "",
+ "ScalingPolicies": [
+ {
+ "Alarms": [
+ {
+ "AlarmARN": "arn:aws:cloudwatch:us-west-2:012345678910:alarm:web-app-cpu-gt-75",
+ "AlarmName": "web-app-cpu-gt-75"
+ }
+ ],
+ "CreationTime": "2019-05-06T12:11:39.230Z",
+ "PolicyARN": "arn:aws:autoscaling:us-west-2:012345678910:scalingPolicy:6d8972f3-efc8-437c-92d1-6270f29a66e7:resource/ecs/service/default/web-app:policyName/web-app-cpu-gt-75",
+ "PolicyName": "web-app-cpu-gt-75",
+ "PolicyType": "StepScaling",
+ "ResourceId": "service/default/web-app",
+ "ScalableDimension": "ecs:service:DesiredCount",
+ "ServiceNamespace": "ecs",
+ "StepScalingPolicyConfiguration": {
+ "AdjustmentType": "PercentChangeInCapacity",
+ "Cooldown": 60,
+ "StepAdjustments": [
+ {
+ "MetricIntervalLowerBound": 0,
+ "ScalingAdjustment": 200
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the scaling policies for the ECS service namespace.",
+ "id": "to-describe-scaling-policies-1470864609734",
+ "title": "To describe scaling policies"
+ }
+ ],
+ "PutScalingPolicy": [
+ {
+ "input": {
+ "PolicyName": "cpu75-target-tracking-scaling-policy",
+ "PolicyType": "TargetTrackingScaling",
+ "ResourceId": "service/default/web-app",
+ "ScalableDimension": "ecs:service:DesiredCount",
+ "ServiceNamespace": "ecs",
+ "TargetTrackingScalingPolicyConfiguration": {
+ "PredefinedMetricSpecification": {
+ "PredefinedMetricType": "ECSServiceAverageCPUUtilization"
+ },
+ "ScaleInCooldown": 60,
+ "ScaleOutCooldown": 60,
+ "TargetValue": 75
+ }
+ },
+ "output": {
+ "Alarms": [
+ {
+ "AlarmARN": "arn:aws:cloudwatch:us-west-2:012345678910:alarm:TargetTracking-service/default/web-app-AlarmHigh-d4f0770c-b46e-434a-a60f-3b36d653feca",
+ "AlarmName": "TargetTracking-service/default/web-app-AlarmHigh-d4f0770c-b46e-434a-a60f-3b36d653feca"
+ },
+ {
+ "AlarmARN": "arn:aws:cloudwatch:us-west-2:012345678910:alarm:TargetTracking-service/default/web-app-AlarmLow-1b437334-d19b-4a63-a812-6c67aaf2910d",
+ "AlarmName": "TargetTracking-service/default/web-app-AlarmLow-1b437334-d19b-4a63-a812-6c67aaf2910d"
+ }
+ ],
+ "PolicyARN": "arn:aws:autoscaling:us-west-2:012345678910:scalingPolicy:6d8972f3-efc8-437c-92d1-6270f29a66e7:resource/ecs/service/default/web-app:policyName/cpu75-target-tracking-scaling-policy"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example applies a target tracking scaling policy with a predefined metric specification to an Amazon ECS service called web-app in the default cluster. The policy keeps the average CPU utilization of the service at 75 percent, with scale-out and scale-in cooldown periods of 60 seconds.",
+ "id": "to-apply-a-target-tracking-scaling-policy-with-a-predefined-metric-specification-1569364247984",
+ "title": "To apply a target tracking scaling policy with a predefined metric specification"
+ }
+ ],
+ "RegisterScalableTarget": [
+ {
+ "input": {
+ "MaxCapacity": 10,
+ "MinCapacity": 1,
+ "ResourceId": "service/default/web-app",
+ "ScalableDimension": "ecs:service:DesiredCount",
+ "ServiceNamespace": "ecs"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example registers a scalable target from an Amazon ECS service called web-app that is running on the default cluster, with a minimum desired count of 1 task and a maximum desired count of 10 tasks.",
+ "id": "to-register-a-new-scalable-target-1470864910380",
+ "title": "To register an ECS service as a scalable target"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/application-autoscaling/2016-02-06/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/application-autoscaling/2016-02-06/paginators-1.json
new file mode 100644
index 00000000..7ec8f3af
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/application-autoscaling/2016-02-06/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "DescribeScalableTargets": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ScalableTargets"
+ },
+ "DescribeScalingActivities": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ScalingActivities"
+ },
+ "DescribeScalingPolicies": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ScalingPolicies"
+ },
+ "DescribeScheduledActions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ScheduledActions"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/application-autoscaling/2016-02-06/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/application-autoscaling/2016-02-06/service-2.json.gz
new file mode 100644
index 00000000..813b1dc7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/application-autoscaling/2016-02-06/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/application-insights/2018-11-25/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/application-insights/2018-11-25/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..2bd1007c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/application-insights/2018-11-25/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/application-insights/2018-11-25/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/application-insights/2018-11-25/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/application-insights/2018-11-25/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/application-insights/2018-11-25/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/application-insights/2018-11-25/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/application-insights/2018-11-25/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/application-insights/2018-11-25/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/application-insights/2018-11-25/service-2.json.gz
new file mode 100644
index 00000000..36f7b365
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/application-insights/2018-11-25/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/application-signals/2024-04-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/application-signals/2024-04-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..0ad74006
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/application-signals/2024-04-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/application-signals/2024-04-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/application-signals/2024-04-15/paginators-1.json
new file mode 100644
index 00000000..187c23fd
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/application-signals/2024-04-15/paginators-1.json
@@ -0,0 +1,40 @@
+{
+ "pagination": {
+ "ListServiceDependencies": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ServiceDependencies"
+ },
+ "ListServiceDependents": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ServiceDependents"
+ },
+ "ListServiceLevelObjectives": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SloSummaries"
+ },
+ "ListServiceOperations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ServiceOperations"
+ },
+ "ListServices": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ServiceSummaries"
+ },
+ "ListServiceLevelObjectiveExclusionWindows": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ExclusionWindows"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/application-signals/2024-04-15/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/application-signals/2024-04-15/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..d6fcd514
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/application-signals/2024-04-15/paginators-1.sdk-extras.json
@@ -0,0 +1,31 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "ListServiceDependencies": {
+ "non_aggregate_keys": [
+ "StartTime",
+ "EndTime"
+ ]
+ },
+ "ListServiceDependents": {
+ "non_aggregate_keys": [
+ "StartTime",
+ "EndTime"
+ ]
+ },
+ "ListServiceOperations": {
+ "non_aggregate_keys": [
+ "StartTime",
+ "EndTime"
+ ]
+ },
+ "ListServices": {
+ "non_aggregate_keys": [
+ "StartTime",
+ "EndTime"
+ ]
+ }
+ }
+ }
+ }
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/application-signals/2024-04-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/application-signals/2024-04-15/service-2.json.gz
new file mode 100644
index 00000000..e8eb1d3a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/application-signals/2024-04-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/applicationcostprofiler/2020-09-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/applicationcostprofiler/2020-09-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..66bb7f0c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/applicationcostprofiler/2020-09-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/applicationcostprofiler/2020-09-10/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/applicationcostprofiler/2020-09-10/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/applicationcostprofiler/2020-09-10/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/applicationcostprofiler/2020-09-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/applicationcostprofiler/2020-09-10/paginators-1.json
new file mode 100644
index 00000000..adffd06f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/applicationcostprofiler/2020-09-10/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListReportDefinitions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "reportDefinitions"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/applicationcostprofiler/2020-09-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/applicationcostprofiler/2020-09-10/service-2.json.gz
new file mode 100644
index 00000000..48827ea5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/applicationcostprofiler/2020-09-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2018-10-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2018-10-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..dfd68a63
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2018-10-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2018-10-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2018-10-01/examples-1.json
new file mode 100644
index 00000000..752e89e0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2018-10-01/examples-1.json
@@ -0,0 +1,4 @@
+{
+ "version": "1.0",
+ "examples": { }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2018-10-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2018-10-01/paginators-1.json
new file mode 100644
index 00000000..162b8b96
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2018-10-01/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListMeshes": {
+ "input_token": "nextToken",
+ "limit_key": "limit",
+ "output_token": "nextToken",
+ "result_key": "meshes"
+ },
+ "ListRoutes": {
+ "input_token": "nextToken",
+ "limit_key": "limit",
+ "output_token": "nextToken",
+ "result_key": "routes"
+ },
+ "ListVirtualNodes": {
+ "input_token": "nextToken",
+ "limit_key": "limit",
+ "output_token": "nextToken",
+ "result_key": "virtualNodes"
+ },
+ "ListVirtualRouters": {
+ "input_token": "nextToken",
+ "limit_key": "limit",
+ "output_token": "nextToken",
+ "result_key": "virtualRouters"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2018-10-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2018-10-01/service-2.json.gz
new file mode 100644
index 00000000..0ed0dcf9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2018-10-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2019-01-25/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2019-01-25/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..a0826501
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2019-01-25/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2019-01-25/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2019-01-25/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2019-01-25/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2019-01-25/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2019-01-25/paginators-1.json
new file mode 100644
index 00000000..5a79b5b5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2019-01-25/paginators-1.json
@@ -0,0 +1,52 @@
+{
+ "pagination": {
+ "ListMeshes": {
+ "input_token": "nextToken",
+ "limit_key": "limit",
+ "output_token": "nextToken",
+ "result_key": "meshes"
+ },
+ "ListRoutes": {
+ "input_token": "nextToken",
+ "limit_key": "limit",
+ "output_token": "nextToken",
+ "result_key": "routes"
+ },
+ "ListVirtualNodes": {
+ "input_token": "nextToken",
+ "limit_key": "limit",
+ "output_token": "nextToken",
+ "result_key": "virtualNodes"
+ },
+ "ListVirtualRouters": {
+ "input_token": "nextToken",
+ "limit_key": "limit",
+ "output_token": "nextToken",
+ "result_key": "virtualRouters"
+ },
+ "ListVirtualServices": {
+ "input_token": "nextToken",
+ "limit_key": "limit",
+ "output_token": "nextToken",
+ "result_key": "virtualServices"
+ },
+ "ListTagsForResource": {
+ "input_token": "nextToken",
+ "limit_key": "limit",
+ "output_token": "nextToken",
+ "result_key": "tags"
+ },
+ "ListGatewayRoutes": {
+ "input_token": "nextToken",
+ "limit_key": "limit",
+ "output_token": "nextToken",
+ "result_key": "gatewayRoutes"
+ },
+ "ListVirtualGateways": {
+ "input_token": "nextToken",
+ "limit_key": "limit",
+ "output_token": "nextToken",
+ "result_key": "virtualGateways"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2019-01-25/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2019-01-25/service-2.json.gz
new file mode 100644
index 00000000..bcd30676
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appmesh/2019-01-25/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/apprunner/2020-05-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/apprunner/2020-05-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..d94b812f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/apprunner/2020-05-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/apprunner/2020-05-15/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/apprunner/2020-05-15/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/apprunner/2020-05-15/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/apprunner/2020-05-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/apprunner/2020-05-15/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/apprunner/2020-05-15/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/apprunner/2020-05-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/apprunner/2020-05-15/service-2.json.gz
new file mode 100644
index 00000000..41175f38
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/apprunner/2020-05-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appstream/2016-12-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/appstream/2016-12-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..4cca0621
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appstream/2016-12-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appstream/2016-12-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/appstream/2016-12-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appstream/2016-12-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appstream/2016-12-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/appstream/2016-12-01/paginators-1.json
new file mode 100644
index 00000000..40cbf4ba
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appstream/2016-12-01/paginators-1.json
@@ -0,0 +1,60 @@
+{
+ "pagination": {
+ "DescribeDirectoryConfigs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "DirectoryConfigs"
+ },
+ "DescribeFleets": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Fleets"
+ },
+ "DescribeImageBuilders": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ImageBuilders"
+ },
+ "DescribeImages": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Images"
+ },
+ "DescribeSessions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "Sessions"
+ },
+ "DescribeStacks": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Stacks"
+ },
+ "DescribeUserStackAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "UserStackAssociations"
+ },
+ "DescribeUsers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Users"
+ },
+ "ListAssociatedFleets": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Names"
+ },
+ "ListAssociatedStacks": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Names"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appstream/2016-12-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/appstream/2016-12-01/service-2.json.gz
new file mode 100644
index 00000000..23a367b5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appstream/2016-12-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appstream/2016-12-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/appstream/2016-12-01/waiters-2.json
new file mode 100644
index 00000000..1c8dea0d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appstream/2016-12-01/waiters-2.json
@@ -0,0 +1,55 @@
+{
+ "version": 2,
+ "waiters": {
+ "FleetStarted": {
+ "delay": 30,
+ "maxAttempts": 40,
+ "operation": "DescribeFleets",
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "Fleets[].State",
+ "expected": "RUNNING"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "Fleets[].State",
+ "expected": "STOPPING"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "Fleets[].State",
+ "expected": "STOPPED"
+ }
+ ]
+ },
+ "FleetStopped": {
+ "delay": 30,
+ "maxAttempts": 40,
+ "operation": "DescribeFleets",
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "Fleets[].State",
+ "expected": "STOPPED"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "Fleets[].State",
+ "expected": "STARTING"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "Fleets[].State",
+ "expected": "RUNNING"
+ }
+ ]
+ }
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appsync/2017-07-25/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/appsync/2017-07-25/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b7fcd469
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appsync/2017-07-25/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appsync/2017-07-25/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/appsync/2017-07-25/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appsync/2017-07-25/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appsync/2017-07-25/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/appsync/2017-07-25/paginators-1.json
new file mode 100644
index 00000000..fbb7de0b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appsync/2017-07-25/paginators-1.json
@@ -0,0 +1,76 @@
+{
+ "pagination": {
+ "ListApiKeys": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "apiKeys"
+ },
+ "ListDataSources": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "dataSources"
+ },
+ "ListFunctions": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "functions"
+ },
+ "ListGraphqlApis": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "graphqlApis"
+ },
+ "ListResolvers": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "resolvers"
+ },
+ "ListResolversByFunction": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "resolvers"
+ },
+ "ListTypes": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "types"
+ },
+ "ListDomainNames": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "domainNameConfigs"
+ },
+ "ListSourceApiAssociations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "sourceApiAssociationSummaries"
+ },
+ "ListTypesByAssociation": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "types"
+ },
+ "ListApis": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "apis"
+ },
+ "ListChannelNamespaces": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "channelNamespaces"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/appsync/2017-07-25/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/appsync/2017-07-25/service-2.json.gz
new file mode 100644
index 00000000..aa4d73f5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/appsync/2017-07-25/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/apptest/2022-12-06/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/apptest/2022-12-06/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..6d7050f6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/apptest/2022-12-06/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/apptest/2022-12-06/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/apptest/2022-12-06/paginators-1.json
new file mode 100644
index 00000000..56c715f6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/apptest/2022-12-06/paginators-1.json
@@ -0,0 +1,40 @@
+{
+ "pagination": {
+ "ListTestCases": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "testCases"
+ },
+ "ListTestConfigurations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "testConfigurations"
+ },
+ "ListTestRunSteps": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "testRunSteps"
+ },
+ "ListTestRunTestCases": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "testRunTestCases"
+ },
+ "ListTestRuns": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "testRuns"
+ },
+ "ListTestSuites": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "testSuites"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/apptest/2022-12-06/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/apptest/2022-12-06/service-2.json.gz
new file mode 100644
index 00000000..b773a1dc
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/apptest/2022-12-06/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/apptest/2022-12-06/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/apptest/2022-12-06/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/apptest/2022-12-06/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/arc-zonal-shift/2022-10-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/arc-zonal-shift/2022-10-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..e89aba08
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/arc-zonal-shift/2022-10-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/arc-zonal-shift/2022-10-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/arc-zonal-shift/2022-10-30/paginators-1.json
new file mode 100644
index 00000000..9fcfc565
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/arc-zonal-shift/2022-10-30/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListManagedResources": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListZonalShifts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListAutoshifts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/arc-zonal-shift/2022-10-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/arc-zonal-shift/2022-10-30/service-2.json.gz
new file mode 100644
index 00000000..117b5e54
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/arc-zonal-shift/2022-10-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/artifact/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/artifact/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..9168ce9e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/artifact/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/artifact/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/artifact/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..ba4271a9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/artifact/2018-05-10/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "ListReports": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "reports"
+ },
+ "ListCustomerAgreements": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "customerAgreements"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/artifact/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/artifact/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..f2f10ae8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/artifact/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/artifact/2018-05-10/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/artifact/2018-05-10/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/artifact/2018-05-10/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/athena/2017-05-18/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/athena/2017-05-18/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..2b04de18
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/athena/2017-05-18/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/athena/2017-05-18/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/athena/2017-05-18/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/athena/2017-05-18/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/athena/2017-05-18/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/athena/2017-05-18/paginators-1.json
new file mode 100644
index 00000000..3b126bab
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/athena/2017-05-18/paginators-1.json
@@ -0,0 +1,50 @@
+{
+ "pagination": {
+ "ListNamedQueries": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "NamedQueryIds"
+ },
+ "ListQueryExecutions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "QueryExecutionIds"
+ },
+ "GetQueryResults": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ResultSet.Rows",
+ "non_aggregate_keys": [
+ "ResultSet.ResultSetMetadata",
+ "UpdateCount"
+ ]
+ },
+ "ListDataCatalogs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "DataCatalogsSummary"
+ },
+ "ListDatabases": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "DatabaseList"
+ },
+ "ListTableMetadata": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TableMetadataList"
+ },
+ "ListTagsForResource": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Tags"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/athena/2017-05-18/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/athena/2017-05-18/service-2.json.gz
new file mode 100644
index 00000000..66d5aae2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/athena/2017-05-18/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/auditmanager/2017-07-25/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/auditmanager/2017-07-25/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..cb935917
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/auditmanager/2017-07-25/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/auditmanager/2017-07-25/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/auditmanager/2017-07-25/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/auditmanager/2017-07-25/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/auditmanager/2017-07-25/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/auditmanager/2017-07-25/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/auditmanager/2017-07-25/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/auditmanager/2017-07-25/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/auditmanager/2017-07-25/service-2.json.gz
new file mode 100644
index 00000000..59e90cf0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/auditmanager/2017-07-25/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/autoscaling-plans/2018-01-06/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/autoscaling-plans/2018-01-06/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..a2e52919
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/autoscaling-plans/2018-01-06/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/autoscaling-plans/2018-01-06/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/autoscaling-plans/2018-01-06/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/autoscaling-plans/2018-01-06/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/autoscaling-plans/2018-01-06/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/autoscaling-plans/2018-01-06/paginators-1.json
new file mode 100644
index 00000000..e3f812a1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/autoscaling-plans/2018-01-06/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "DescribeScalingPlanResources": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ScalingPlanResources"
+ },
+ "DescribeScalingPlans": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ScalingPlans"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/autoscaling-plans/2018-01-06/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/autoscaling-plans/2018-01-06/service-2.json.gz
new file mode 100644
index 00000000..6a835ded
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/autoscaling-plans/2018-01-06/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/autoscaling/2011-01-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/autoscaling/2011-01-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..ac422e11
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/autoscaling/2011-01-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/autoscaling/2011-01-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/autoscaling/2011-01-01/examples-1.json
new file mode 100644
index 00000000..af6929b4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/autoscaling/2011-01-01/examples-1.json
@@ -0,0 +1,1696 @@
+{
+ "version": "1.0",
+ "examples": {
+ "AttachInstances": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "InstanceIds": [
+ "i-93633f9b"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example attaches the specified instance to the specified Auto Scaling group.",
+ "id": "autoscaling-attach-instances-1",
+ "title": "To attach an instance to an Auto Scaling group"
+ }
+ ],
+ "AttachLoadBalancerTargetGroups": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "TargetGroupARNs": [
+ "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example attaches the specified target group to the specified Auto Scaling group.",
+ "id": "autoscaling-attach-load-balancer-target-groups-1",
+ "title": "To attach a target group to an Auto Scaling group"
+ }
+ ],
+ "AttachLoadBalancers": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "LoadBalancerNames": [
+ "my-load-balancer"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example attaches the specified load balancer to the specified Auto Scaling group.",
+ "id": "autoscaling-attach-load-balancers-1",
+ "title": "To attach a load balancer to an Auto Scaling group"
+ }
+ ],
+ "AttachTrafficSources": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "TrafficSources": [
+ {
+ "Identifier": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067"
+ }
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example attaches the specified target group to the specified Auto Scaling group.",
+ "id": "to-attach-a-target-group-to-an-auto-scaling-group-1680036570089",
+ "title": "To attach a target group to an Auto Scaling group"
+ }
+ ],
+ "CancelInstanceRefresh": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group"
+ },
+ "output": {
+ "InstanceRefreshId": "08b91cf7-8fa6-48af-b6a6-d227f40f1b9b"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example cancels an instance refresh operation in progress.",
+ "id": "to-cancel-an-instance-refresh-1592960979817",
+ "title": "To cancel an instance refresh"
+ }
+ ],
+ "CompleteLifecycleAction": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "LifecycleActionResult": "CONTINUE",
+ "LifecycleActionToken": "bcd2f1b8-9a78-44d3-8a7a-4dd07d7cf635",
+ "LifecycleHookName": "my-lifecycle-hook"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example notifies Auto Scaling that the specified lifecycle action is complete so that it can finish launching or terminating the instance.",
+ "id": "autoscaling-complete-lifecycle-action-1",
+ "title": "To complete the lifecycle action"
+ }
+ ],
+ "CreateAutoScalingGroup": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "DefaultInstanceWarmup": 120,
+ "LaunchTemplate": {
+ "LaunchTemplateName": "my-template-for-auto-scaling",
+ "Version": "$Default"
+ },
+ "MaxInstanceLifetime": 2592000,
+ "MaxSize": 3,
+ "MinSize": 1,
+ "VPCZoneIdentifier": "subnet-057fa0918fEXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an Auto Scaling group.",
+ "id": "autoscaling-create-auto-scaling-group-1",
+ "title": "To create an Auto Scaling group"
+ },
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "HealthCheckGracePeriod": 300,
+ "HealthCheckType": "ELB",
+ "LaunchTemplate": {
+ "LaunchTemplateName": "my-template-for-auto-scaling",
+ "Version": "$Default"
+ },
+ "MaxSize": 3,
+ "MinSize": 1,
+ "TargetGroupARNs": [
+ "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067"
+ ],
+ "VPCZoneIdentifier": "subnet-057fa0918fEXAMPLE, subnet-610acd08EXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an Auto Scaling group and attaches the specified target group.",
+ "id": "autoscaling-create-auto-scaling-group-2",
+ "title": "To create an Auto Scaling group with an attached target group"
+ },
+ {
+ "input": {
+ "AutoScalingGroupName": "my-asg",
+ "DesiredCapacity": 3,
+ "MaxSize": 5,
+ "MinSize": 1,
+ "MixedInstancesPolicy": {
+ "InstancesDistribution": {
+ "OnDemandBaseCapacity": 1,
+ "OnDemandPercentageAboveBaseCapacity": 50,
+ "SpotAllocationStrategy": "price-capacity-optimized"
+ },
+ "LaunchTemplate": {
+ "LaunchTemplateSpecification": {
+ "LaunchTemplateName": "my-launch-template-for-x86",
+ "Version": "$Default"
+ },
+ "Overrides": [
+ {
+ "InstanceType": "c6g.large",
+ "LaunchTemplateSpecification": {
+ "LaunchTemplateName": "my-launch-template-for-arm",
+ "Version": "$Default"
+ }
+ },
+ {
+ "InstanceType": "c5.large"
+ },
+ {
+ "InstanceType": "c5a.large"
+ }
+ ]
+ }
+ },
+ "VPCZoneIdentifier": "subnet-057fa0918fEXAMPLE, subnet-610acd08EXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an Auto Scaling group with a mixed instances policy. It specifies the c5.large, c5a.large, and c6g.large instance types and defines a different launch template for the c6g.large instance type.",
+ "id": "autoscaling-create-auto-scaling-group-3",
+ "title": "To create an Auto Scaling group with a mixed instances policy"
+ },
+ {
+ "input": {
+ "AutoScalingGroupName": "my-asg",
+ "DesiredCapacity": 4,
+ "DesiredCapacityType": "units",
+ "MaxSize": 100,
+ "MinSize": 0,
+ "MixedInstancesPolicy": {
+ "InstancesDistribution": {
+ "OnDemandPercentageAboveBaseCapacity": 50,
+ "SpotAllocationStrategy": "price-capacity-optimized"
+ },
+ "LaunchTemplate": {
+ "LaunchTemplateSpecification": {
+ "LaunchTemplateName": "my-template-for-auto-scaling",
+ "Version": "$Default"
+ },
+ "Overrides": [
+ {
+ "InstanceRequirements": {
+ "CpuManufacturers": [
+ "intel"
+ ],
+ "MemoryMiB": {
+ "Min": 16384
+ },
+ "VCpuCount": {
+ "Max": 8,
+ "Min": 4
+ }
+ }
+ }
+ ]
+ }
+ },
+ "VPCZoneIdentifier": "subnet-057fa0918fEXAMPLE, subnet-610acd08EXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an Auto Scaling group using attribute-based instance type selection. It requires the instance types to have a minimum of four vCPUs and a maximum of eight vCPUs, a minimum of 16,384 MiB of memory, and an Intel manufactured CPU.",
+ "id": "autoscaling-create-auto-scaling-group-4",
+ "title": "To create an Auto Scaling group using attribute-based instance type selection"
+ }
+ ],
+ "CreateLaunchConfiguration": [
+ {
+ "input": {
+ "IamInstanceProfile": "my-iam-role",
+ "ImageId": "ami-12345678",
+ "InstanceType": "m3.medium",
+ "LaunchConfigurationName": "my-launch-config",
+ "SecurityGroups": [
+ "sg-eb2af88e"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a launch configuration.",
+ "id": "autoscaling-create-launch-configuration-1",
+ "title": "To create a launch configuration"
+ }
+ ],
+ "CreateOrUpdateTags": [
+ {
+ "input": {
+ "Tags": [
+ {
+ "Key": "Role",
+ "PropagateAtLaunch": true,
+ "ResourceId": "my-auto-scaling-group",
+ "ResourceType": "auto-scaling-group",
+ "Value": "WebServer"
+ },
+ {
+ "Key": "Dept",
+ "PropagateAtLaunch": true,
+ "ResourceId": "my-auto-scaling-group",
+ "ResourceType": "auto-scaling-group",
+ "Value": "Research"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example adds two tags to the specified Auto Scaling group.",
+ "id": "autoscaling-create-or-update-tags-1",
+ "title": "To create or update tags for an Auto Scaling group"
+ }
+ ],
+ "DeleteAutoScalingGroup": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified Auto Scaling group.",
+ "id": "autoscaling-delete-auto-scaling-group-1",
+ "title": "To delete an Auto Scaling group"
+ },
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "ForceDelete": true
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified Auto Scaling group and all its instances.",
+ "id": "autoscaling-delete-auto-scaling-group-2",
+ "title": "To delete an Auto Scaling group and all its instances"
+ }
+ ],
+ "DeleteLaunchConfiguration": [
+ {
+ "input": {
+ "LaunchConfigurationName": "my-launch-config"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified launch configuration.",
+ "id": "autoscaling-delete-launch-configuration-1",
+ "title": "To delete a launch configuration"
+ }
+ ],
+ "DeleteLifecycleHook": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "LifecycleHookName": "my-lifecycle-hook"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified lifecycle hook.",
+ "id": "autoscaling-delete-lifecycle-hook-1",
+ "title": "To delete a lifecycle hook"
+ }
+ ],
+ "DeleteNotificationConfiguration": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "TopicARN": "arn:aws:sns:us-west-2:123456789012:my-sns-topic"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified notification from the specified Auto Scaling group.",
+ "id": "autoscaling-delete-notification-configuration-1",
+ "title": "To delete an Auto Scaling notification"
+ }
+ ],
+ "DeletePolicy": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "PolicyName": "my-step-scale-out-policy"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified Auto Scaling policy.",
+ "id": "autoscaling-delete-policy-1",
+ "title": "To delete an Auto Scaling policy"
+ }
+ ],
+ "DeleteScheduledAction": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "ScheduledActionName": "my-scheduled-action"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified scheduled action from the specified Auto Scaling group.",
+ "id": "autoscaling-delete-scheduled-action-1",
+ "title": "To delete a scheduled action from an Auto Scaling group"
+ }
+ ],
+ "DeleteTags": [
+ {
+ "input": {
+ "Tags": [
+ {
+ "Key": "Dept",
+ "ResourceId": "my-auto-scaling-group",
+ "ResourceType": "auto-scaling-group",
+ "Value": "Research"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified tag from the specified Auto Scaling group.",
+ "id": "autoscaling-delete-tags-1",
+ "title": "To delete a tag from an Auto Scaling group"
+ }
+ ],
+ "DescribeAccountLimits": [
+ {
+ "output": {
+ "MaxNumberOfAutoScalingGroups": 20,
+ "MaxNumberOfLaunchConfigurations": 100,
+ "NumberOfAutoScalingGroups": 3,
+ "NumberOfLaunchConfigurations": 5
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the Amazon EC2 Auto Scaling service quotas for your account.",
+ "id": "autoscaling-describe-account-limits-1",
+ "title": "To describe your Auto Scaling account limits"
+ }
+ ],
+ "DescribeAdjustmentTypes": [
+ {
+ "output": {
+ "AdjustmentTypes": [
+ {
+ "AdjustmentType": "ChangeInCapacity"
+ },
+ {
+ "AdjustmentType": "ExactCapcity"
+ },
+ {
+ "AdjustmentType": "PercentChangeInCapacity"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the available adjustment types.",
+ "id": "autoscaling-describe-adjustment-types-1",
+ "title": "To describe the Amazon EC2 Auto Scaling adjustment types"
+ }
+ ],
+ "DescribeAutoScalingGroups": [
+ {
+ "input": {
+ "AutoScalingGroupNames": [
+ "my-auto-scaling-group"
+ ]
+ },
+ "output": {
+ "AutoScalingGroups": [
+ {
+ "AutoScalingGroupARN": "arn:aws:autoscaling:us-west-1:123456789012:autoScalingGroup:12345678-1234-1234-1234-123456789012:autoScalingGroupName/my-auto-scaling-group",
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "AvailabilityZones": [
+ "us-west-2a",
+ "us-west-2b",
+ "us-west-2c"
+ ],
+ "CreatedTime": "2023-03-09T22:15:11.611Z",
+ "DefaultCooldown": 300,
+ "DesiredCapacity": 2,
+ "EnabledMetrics": [
+
+ ],
+ "HealthCheckGracePeriod": 300,
+ "HealthCheckType": "EC2",
+ "Instances": [
+ {
+ "AvailabilityZone": "us-west-2c",
+ "HealthStatus": "Healthy",
+ "InstanceId": "i-05b4f7d5be44822a6",
+ "InstanceType": "t3.micro",
+ "LaunchConfigurationName": "my-launch-config",
+ "LifecycleState": "InService",
+ "ProtectedFromScaleIn": false
+ },
+ {
+ "AvailabilityZone": "us-west-2b",
+ "HealthStatus": "Healthy",
+ "InstanceId": "i-0c20ac468fa3049e8",
+ "InstanceType": "t3.micro",
+ "LaunchConfigurationName": "my-launch-config",
+ "LifecycleState": "InService",
+ "ProtectedFromScaleIn": false
+ }
+ ],
+ "LaunchConfigurationName": "my-launch-config",
+ "LoadBalancerNames": [
+
+ ],
+ "MaxSize": 5,
+ "MinSize": 1,
+ "NewInstancesProtectedFromScaleIn": false,
+ "ServiceLinkedRoleARN": "arn:aws:iam::123456789012:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling",
+ "SuspendedProcesses": [
+
+ ],
+ "Tags": [
+
+ ],
+ "TargetGroupARNs": [
+
+ ],
+ "TerminationPolicies": [
+ "Default"
+ ],
+ "TrafficSources": [
+
+ ],
+ "VPCZoneIdentifier": "subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified Auto Scaling group.",
+ "id": "autoscaling-describe-auto-scaling-groups-1",
+ "title": "To describe an Auto Scaling group"
+ }
+ ],
+ "DescribeAutoScalingInstances": [
+ {
+ "input": {
+ "InstanceIds": [
+ "i-05b4f7d5be44822a6"
+ ]
+ },
+ "output": {
+ "AutoScalingInstances": [
+ {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "AvailabilityZone": "us-west-2c",
+ "HealthStatus": "HEALTHY",
+ "InstanceId": "i-05b4f7d5be44822a6",
+ "InstanceType": "t3.micro",
+ "LaunchConfigurationName": "my-launch-config",
+ "LifecycleState": "InService",
+ "ProtectedFromScaleIn": false
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified Auto Scaling instance.",
+ "id": "autoscaling-describe-auto-scaling-instances-1",
+ "title": "To describe one or more Auto Scaling instances"
+ }
+ ],
+ "DescribeAutoScalingNotificationTypes": [
+ {
+ "output": {
+ "AutoScalingNotificationTypes": [
+ "autoscaling:EC2_INSTANCE_LAUNCH",
+ "autoscaling:EC2_INSTANCE_LAUNCH_ERROR",
+ "autoscaling:EC2_INSTANCE_TERMINATE",
+ "autoscaling:EC2_INSTANCE_TERMINATE_ERROR",
+ "autoscaling:TEST_NOTIFICATION"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the available notification types.",
+ "id": "autoscaling-describe-auto-scaling-notification-types-1",
+ "title": "To describe the Auto Scaling notification types"
+ }
+ ],
+ "DescribeInstanceRefreshes": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group"
+ },
+ "output": {
+ "InstanceRefreshes": [
+ {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "InstanceRefreshId": "08b91cf7-8fa6-48af-b6a6-d227f40f1b9b",
+ "InstancesToUpdate": 0,
+ "PercentageComplete": 50,
+ "Preferences": {
+ "AlarmSpecification": {
+ "Alarms": [
+ "my-alarm"
+ ]
+ },
+ "AutoRollback": true,
+ "InstanceWarmup": 200,
+ "MinHealthyPercentage": 90,
+ "ScaleInProtectedInstances": "Ignore",
+ "SkipMatching": false,
+ "StandbyInstances": "Ignore"
+ },
+ "StartTime": "2023-06-13T16:46:52+00:00",
+ "Status": "InProgress",
+ "StatusReason": "Waiting for instances to warm up before continuing. For example: i-0645704820a8e83ff is warming up."
+ },
+ {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "EndTime": "2023-06-02T13:59:45+00:00",
+ "InstanceRefreshId": "0e151305-1e57-4a32-a256-1fd14157c5ec",
+ "InstancesToUpdate": 0,
+ "PercentageComplete": 100,
+ "Preferences": {
+ "AlarmSpecification": {
+ "Alarms": [
+ "my-alarm"
+ ]
+ },
+ "AutoRollback": true,
+ "InstanceWarmup": 200,
+ "MinHealthyPercentage": 90,
+ "ScaleInProtectedInstances": "Ignore",
+ "SkipMatching": false,
+ "StandbyInstances": "Ignore"
+ },
+ "StartTime": "2023-06-02T13:53:37+00:00",
+ "Status": "Successful"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the instance refreshes for the specified Auto Scaling group.",
+ "id": "to-list-instance-refreshes-1592959593746",
+ "title": "To list instance refreshes"
+ }
+ ],
+ "DescribeLaunchConfigurations": [
+ {
+ "input": {
+ "LaunchConfigurationNames": [
+ "my-launch-config"
+ ]
+ },
+ "output": {
+ "LaunchConfigurations": [
+ {
+ "AssociatePublicIpAddress": true,
+ "BlockDeviceMappings": [
+
+ ],
+ "CreatedTime": "2014-05-07T17:39:28.599Z",
+ "EbsOptimized": false,
+ "ImageId": "ami-043a5034",
+ "InstanceMonitoring": {
+ "Enabled": true
+ },
+ "InstanceType": "t1.micro",
+ "LaunchConfigurationARN": "arn:aws:autoscaling:us-west-2:123456789012:launchConfiguration:98d3b196-4cf9-4e88-8ca1-8547c24ced8b:launchConfigurationName/my-launch-config",
+ "LaunchConfigurationName": "my-launch-config",
+ "SecurityGroups": [
+ "sg-67ef0308"
+ ]
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified launch configuration.",
+ "id": "autoscaling-describe-launch-configurations-1",
+ "title": "To describe Auto Scaling launch configurations"
+ }
+ ],
+ "DescribeLifecycleHookTypes": [
+ {
+ "output": {
+ "LifecycleHookTypes": [
+ "autoscaling:EC2_INSTANCE_LAUNCHING",
+ "autoscaling:EC2_INSTANCE_TERMINATING"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the available lifecycle hook types.",
+ "id": "autoscaling-describe-lifecycle-hook-types-1",
+ "title": "To describe the available types of lifecycle hooks"
+ }
+ ],
+ "DescribeLifecycleHooks": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group"
+ },
+ "output": {
+ "LifecycleHooks": [
+ {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "DefaultResult": "ABANDON",
+ "GlobalTimeout": 172800,
+ "HeartbeatTimeout": 3600,
+ "LifecycleHookName": "my-lifecycle-hook",
+ "LifecycleTransition": "autoscaling:EC2_INSTANCE_LAUNCHING",
+ "NotificationTargetARN": "arn:aws:sns:us-west-2:123456789012:my-sns-topic",
+ "RoleARN": "arn:aws:iam::123456789012:role/my-auto-scaling-role"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the lifecycle hooks for the specified Auto Scaling group.",
+ "id": "autoscaling-describe-lifecycle-hooks-1",
+ "title": "To describe your lifecycle hooks"
+ }
+ ],
+ "DescribeLoadBalancerTargetGroups": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group"
+ },
+ "output": {
+ "LoadBalancerTargetGroups": [
+ {
+ "LoadBalancerTargetGroupARN": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
+ "State": "Added"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the target groups attached to the specified Auto Scaling group.",
+ "id": "autoscaling-describe-load-balancer-target-groups-1",
+ "title": "To describe the target groups for an Auto Scaling group"
+ }
+ ],
+ "DescribeLoadBalancers": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group"
+ },
+ "output": {
+ "LoadBalancers": [
+ {
+ "LoadBalancerName": "my-load-balancer",
+ "State": "Added"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the load balancers attached to the specified Auto Scaling group.",
+ "id": "autoscaling-describe-load-balancers-1",
+ "title": "To describe the load balancers for an Auto Scaling group"
+ }
+ ],
+ "DescribeMetricCollectionTypes": [
+ {
+ "output": {
+ "Granularities": [
+ {
+ "Granularity": "1Minute"
+ }
+ ],
+ "Metrics": [
+ {
+ "Metric": "GroupMinSize"
+ },
+ {
+ "Metric": "GroupMaxSize"
+ },
+ {
+ "Metric": "GroupDesiredCapacity"
+ },
+ {
+ "Metric": "GroupInServiceInstances"
+ },
+ {
+ "Metric": "GroupPendingInstances"
+ },
+ {
+ "Metric": "GroupTerminatingInstances"
+ },
+ {
+ "Metric": "GroupStandbyInstances"
+ },
+ {
+ "Metric": "GroupTotalInstances"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the available metric collection types.",
+ "id": "autoscaling-describe-metric-collection-types-1",
+ "title": "To describe the Auto Scaling metric collection types"
+ }
+ ],
+ "DescribeNotificationConfigurations": [
+ {
+ "input": {
+ "AutoScalingGroupNames": [
+ "my-auto-scaling-group"
+ ]
+ },
+ "output": {
+ "NotificationConfigurations": [
+ {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "NotificationType": "autoscaling:TEST_NOTIFICATION",
+ "TopicARN": "arn:aws:sns:us-west-2:123456789012:my-sns-topic-2"
+ },
+ {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "NotificationType": "autoscaling:TEST_NOTIFICATION",
+ "TopicARN": "arn:aws:sns:us-west-2:123456789012:my-sns-topic"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the notification configurations for the specified Auto Scaling group.",
+ "id": "autoscaling-describe-notification-configurations-1",
+ "title": "To describe Auto Scaling notification configurations"
+ }
+ ],
+ "DescribePolicies": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group"
+ },
+ "output": {
+ "ScalingPolicies": [
+ {
+ "AdjustmentType": "ChangeInCapacity",
+ "Alarms": [
+
+ ],
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "PolicyARN": "arn:aws:autoscaling:us-west-2:123456789012:scalingPolicy:2233f3d7-6290-403b-b632-93c553560106:autoScalingGroupName/my-auto-scaling-group:policyName/ScaleIn",
+ "PolicyName": "ScaleIn",
+ "ScalingAdjustment": -1
+ },
+ {
+ "AdjustmentType": "PercentChangeInCapacity",
+ "Alarms": [
+
+ ],
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "Cooldown": 60,
+ "MinAdjustmentStep": 2,
+ "PolicyARN": "arn:aws:autoscaling:us-west-2:123456789012:scalingPolicy:2b435159-cf77-4e89-8c0e-d63b497baad7:autoScalingGroupName/my-auto-scaling-group:policyName/ScalePercentChange",
+ "PolicyName": "ScalePercentChange",
+ "ScalingAdjustment": 25
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the policies for the specified Auto Scaling group.",
+ "id": "autoscaling-describe-policies-1",
+ "title": "To describe scaling policies"
+ }
+ ],
+ "DescribeScalingActivities": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group"
+ },
+ "output": {
+ "Activities": [
+ {
+ "ActivityId": "f9f2d65b-f1f2-43e7-b46d-d86756459699",
+ "AutoScalingGroupARN": "arn:aws:autoscaling:us-east-1:123456789012:autoScalingGroup:12345678-1234-1234-1234-123456789012:autoScalingGroupName/my-auto-scaling-group",
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "Cause": "At 2013-08-19T20:53:25Z a user request created an AutoScalingGroup changing the desired capacity from 0 to 1. At 2013-08-19T20:53:29Z an instance was started in response to a difference between desired and actual capacity, increasing the capacity from 0 to 1.",
+ "Description": "Launching a new EC2 instance: i-4ba0837f",
+ "Details": "details",
+ "EndTime": "2013-08-19T20:54:02Z",
+ "Progress": 100,
+ "StartTime": "2013-08-19T20:53:29.930Z",
+ "StatusCode": "Successful"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the scaling activities for the specified Auto Scaling group.",
+ "id": "autoscaling-describe-scaling-activities-1",
+ "title": "To describe the scaling activities for an Auto Scaling group"
+ }
+ ],
+ "DescribeScalingProcessTypes": [
+ {
+ "output": {
+ "Processes": [
+ {
+ "ProcessName": "AZRebalance"
+ },
+ {
+ "ProcessName": "AddToLoadBalancer"
+ },
+ {
+ "ProcessName": "AlarmNotification"
+ },
+ {
+ "ProcessName": "HealthCheck"
+ },
+ {
+ "ProcessName": "Launch"
+ },
+ {
+ "ProcessName": "ReplaceUnhealthy"
+ },
+ {
+ "ProcessName": "ScheduledActions"
+ },
+ {
+ "ProcessName": "Terminate"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the Auto Scaling process types.",
+ "id": "autoscaling-describe-scaling-process-types-1",
+ "title": "To describe the Auto Scaling process types"
+ }
+ ],
+ "DescribeScheduledActions": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group"
+ },
+ "output": {
+ "ScheduledUpdateGroupActions": [
+ {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "DesiredCapacity": 4,
+ "MaxSize": 6,
+ "MinSize": 2,
+ "Recurrence": "30 0 1 12 0",
+ "ScheduledActionARN": "arn:aws:autoscaling:us-west-2:123456789012:scheduledUpdateGroupAction:8e86b655-b2e6-4410-8f29-b4f094d6871c:autoScalingGroupName/my-auto-scaling-group:scheduledActionName/my-scheduled-action",
+ "ScheduledActionName": "my-scheduled-action",
+ "StartTime": "2016-12-01T00:30:00Z",
+ "Time": "2016-12-01T00:30:00Z"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the scheduled actions for the specified Auto Scaling group.",
+ "id": "autoscaling-describe-scheduled-actions-1",
+ "title": "To describe scheduled actions"
+ }
+ ],
+ "DescribeTags": [
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "auto-scaling-group",
+ "Values": [
+ "my-auto-scaling-group"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "Tags": [
+ {
+ "Key": "Dept",
+ "PropagateAtLaunch": true,
+ "ResourceId": "my-auto-scaling-group",
+ "ResourceType": "auto-scaling-group",
+ "Value": "Research"
+ },
+ {
+ "Key": "Role",
+ "PropagateAtLaunch": true,
+ "ResourceId": "my-auto-scaling-group",
+ "ResourceType": "auto-scaling-group",
+ "Value": "WebServer"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the tags for the specified Auto Scaling group.",
+ "id": "autoscaling-describe-tags-1",
+ "title": "To describe tags"
+ }
+ ],
+ "DescribeTerminationPolicyTypes": [
+ {
+ "output": {
+ "TerminationPolicyTypes": [
+ "ClosestToNextInstanceHour",
+ "Default",
+ "NewestInstance",
+ "OldestInstance",
+ "OldestLaunchConfiguration"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the available termination policy types.",
+ "id": "autoscaling-describe-termination-policy-types-1",
+ "title": "To describe termination policy types"
+ }
+ ],
+ "DescribeTrafficSources": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group"
+ },
+ "output": {
+ "NextToken": "",
+ "TrafficSources": [
+ {
+ "Identifier": "arn:aws:vpc-lattice:us-west-2:123456789012:targetgroup/tg-0e2f2665eEXAMPLE",
+ "State": "InService",
+ "Type": "vpc-lattice"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the target groups attached to the specified Auto Scaling group.",
+ "id": "to-describe-the-target-groups-for-an-auto-scaling-group-1680040714521",
+ "title": "To describe the target groups for an Auto Scaling group"
+ }
+ ],
+ "DetachInstances": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "InstanceIds": [
+ "i-93633f9b"
+ ],
+ "ShouldDecrementDesiredCapacity": true
+ },
+ "output": {
+ "Activities": [
+ {
+ "ActivityId": "5091cb52-547a-47ce-a236-c9ccbc2cb2c9",
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "Cause": "At 2015-04-12T15:02:16Z instance i-93633f9b was detached in response to a user request, shrinking the capacity from 2 to 1.",
+ "Description": "Detaching EC2 instance: i-93633f9b",
+ "Details": "details",
+ "Progress": 50,
+ "StartTime": "2015-04-12T15:02:16.179Z",
+ "StatusCode": "InProgress"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example detaches the specified instance from the specified Auto Scaling group.",
+ "id": "autoscaling-detach-instances-1",
+ "title": "To detach an instance from an Auto Scaling group"
+ }
+ ],
+ "DetachLoadBalancerTargetGroups": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "TargetGroupARNs": [
+ "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example detaches the specified target group from the specified Auto Scaling group",
+ "id": "autoscaling-detach-load-balancer-target-groups-1",
+ "title": "To detach a target group from an Auto Scaling group"
+ }
+ ],
+ "DetachLoadBalancers": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "LoadBalancerNames": [
+ "my-load-balancer"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example detaches the specified load balancer from the specified Auto Scaling group.",
+ "id": "autoscaling-detach-load-balancers-1",
+ "title": "To detach a load balancer from an Auto Scaling group"
+ }
+ ],
+ "DetachTrafficSources": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "TrafficSources": [
+ {
+ "Identifier": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067"
+ }
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example detaches the specified target group from the specified Auto Scaling group.",
+ "id": "to-detach-a-target-group-from-an-auto-scaling-group-1680040404169",
+ "title": "To detach a target group from an Auto Scaling group"
+ }
+ ],
+ "DisableMetricsCollection": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "Metrics": [
+ "GroupDesiredCapacity"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example disables collecting data for the GroupDesiredCapacity metric for the specified Auto Scaling group.",
+ "id": "autoscaling-disable-metrics-collection-1",
+ "title": "To disable metrics collection for an Auto Scaling group"
+ }
+ ],
+ "EnableMetricsCollection": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "Granularity": "1Minute"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example enables data collection for the specified Auto Scaling group.",
+ "id": "autoscaling-enable-metrics-collection-1",
+ "title": "To enable metrics collection for an Auto Scaling group"
+ }
+ ],
+ "EnterStandby": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "InstanceIds": [
+ "i-93633f9b"
+ ],
+ "ShouldDecrementDesiredCapacity": true
+ },
+ "output": {
+ "Activities": [
+ {
+ "ActivityId": "ffa056b4-6ed3-41ba-ae7c-249dfae6eba1",
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "Cause": "At 2015-04-12T15:10:23Z instance i-93633f9b was moved to standby in response to a user request, shrinking the capacity from 2 to 1.",
+ "Description": "Moving EC2 instance to Standby: i-93633f9b",
+ "Details": "details",
+ "Progress": 50,
+ "StartTime": "2015-04-12T15:10:23.640Z",
+ "StatusCode": "InProgress"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example puts the specified instance into standby mode.",
+ "id": "autoscaling-enter-standby-1",
+ "title": "To move instances into standby mode"
+ }
+ ],
+ "ExecutePolicy": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "BreachThreshold": 50.0,
+ "MetricValue": 59.0,
+ "PolicyName": "my-step-scale-out-policy"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example executes the specified policy.",
+ "id": "autoscaling-execute-policy-1",
+ "title": "To execute a scaling policy"
+ }
+ ],
+ "ExitStandby": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "InstanceIds": [
+ "i-93633f9b"
+ ]
+ },
+ "output": {
+ "Activities": [
+ {
+ "ActivityId": "142928e1-a2dc-453a-9b24-b85ad6735928",
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "Cause": "At 2015-04-12T15:14:29Z instance i-93633f9b was moved out of standby in response to a user request, increasing the capacity from 1 to 2.",
+ "Description": "Moving EC2 instance out of Standby: i-93633f9b",
+ "Details": "details",
+ "Progress": 30,
+ "StartTime": "2015-04-12T15:14:29.886Z",
+ "StatusCode": "PreInService"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example moves the specified instance out of standby mode.",
+ "id": "autoscaling-exit-standby-1",
+ "title": "To move instances out of standby mode"
+ }
+ ],
+ "PutLifecycleHook": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "DefaultResult": "CONTINUE",
+ "HeartbeatTimeout": 300,
+ "LifecycleHookName": "my-launch-lifecycle-hook",
+ "LifecycleTransition": "autoscaling:EC2_INSTANCE_LAUNCHING"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a lifecycle hook for instance launch.",
+ "id": "autoscaling-put-lifecycle-hook-1",
+ "title": "To create a launch lifecycle hook"
+ }
+ ],
+ "PutNotificationConfiguration": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "NotificationTypes": [
+ "autoscaling:TEST_NOTIFICATION"
+ ],
+ "TopicARN": "arn:aws:sns:us-west-2:123456789012:my-sns-topic"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example adds the specified notification to the specified Auto Scaling group.",
+ "id": "autoscaling-put-notification-configuration-1",
+ "title": "To add an Auto Scaling notification"
+ }
+ ],
+ "PutScalingPolicy": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "PolicyName": "alb1000-target-tracking-scaling-policy",
+ "PolicyType": "TargetTrackingScaling",
+ "TargetTrackingConfiguration": {
+ "PredefinedMetricSpecification": {
+ "PredefinedMetricType": "ALBRequestCountPerTarget",
+ "ResourceLabel": "app/my-alb/778d41231b141a0f/targetgroup/my-alb-target-group/943f017f100becff"
+ },
+ "TargetValue": 1000.0
+ }
+ },
+ "output": {
+ "Alarms": [
+ {
+ "AlarmARN": "arn:aws:cloudwatch:us-west-2:123456789012:alarm:TargetTracking-my-asg-AlarmHigh-fc0e4183-23ac-497e-9992-691c9980c38e",
+ "AlarmName": "TargetTracking-my-asg-AlarmHigh-fc0e4183-23ac-497e-9992-691c9980c38e"
+ },
+ {
+ "AlarmARN": "arn:aws:cloudwatch:us-west-2:123456789012:alarm:TargetTracking-my-asg-AlarmLow-61a39305-ed0c-47af-bd9e-471a352ee1a2",
+ "AlarmName": "TargetTracking-my-asg-AlarmLow-61a39305-ed0c-47af-bd9e-471a352ee1a2"
+ }
+ ],
+ "PolicyARN": "arn:aws:autoscaling:us-west-2:123456789012:scalingPolicy:228f02c2-c665-4bfd-aaac-8b04080bea3c:autoScalingGroupName/my-auto-scaling-group:policyName/alb1000-target-tracking-scaling-policy"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example adds the specified policy to the specified Auto Scaling group.",
+ "id": "autoscaling-put-scaling-policy-1",
+ "title": "To add a scaling policy to an Auto Scaling group"
+ }
+ ],
+ "PutScheduledUpdateGroupAction": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "DesiredCapacity": 4,
+ "EndTime": "2014-05-12T08:00:00Z",
+ "MaxSize": 6,
+ "MinSize": 2,
+ "ScheduledActionName": "my-scheduled-action",
+ "StartTime": "2014-05-12T08:00:00Z"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example adds the specified scheduled action to the specified Auto Scaling group.",
+ "id": "autoscaling-put-scheduled-update-group-action-1",
+ "title": "To add a scheduled action to an Auto Scaling group"
+ }
+ ],
+ "PutWarmPool": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "InstanceReusePolicy": {
+ "ReuseOnScaleIn": true
+ },
+ "MinSize": 30,
+ "PoolState": "Hibernated"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a warm pool for the specified Auto Scaling group.",
+ "id": "to-add-a-warm-pool-to-an-auto-scaling-group-1617818810383",
+ "title": "To create a warm pool for an Auto Scaling group"
+ }
+ ],
+ "RecordLifecycleActionHeartbeat": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "LifecycleActionToken": "bcd2f1b8-9a78-44d3-8a7a-4dd07d7cf635",
+ "LifecycleHookName": "my-lifecycle-hook"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example records a lifecycle action heartbeat to keep the instance in a pending state.",
+ "id": "autoscaling-record-lifecycle-action-heartbeat-1",
+ "title": "To record a lifecycle action heartbeat"
+ }
+ ],
+ "ResumeProcesses": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "ScalingProcesses": [
+ "AlarmNotification"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example resumes the specified suspended scaling process for the specified Auto Scaling group.",
+ "id": "autoscaling-resume-processes-1",
+ "title": "To resume Auto Scaling processes"
+ }
+ ],
+ "SetDesiredCapacity": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "DesiredCapacity": 2,
+ "HonorCooldown": true
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example sets the desired capacity for the specified Auto Scaling group.",
+ "id": "autoscaling-set-desired-capacity-1",
+ "title": "To set the desired capacity for an Auto Scaling group"
+ }
+ ],
+ "SetInstanceHealth": [
+ {
+ "input": {
+ "HealthStatus": "Unhealthy",
+ "InstanceId": "i-93633f9b"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example sets the health status of the specified instance to Unhealthy.",
+ "id": "autoscaling-set-instance-health-1",
+ "title": "To set the health status of an instance"
+ }
+ ],
+ "SetInstanceProtection": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "InstanceIds": [
+ "i-93633f9b"
+ ],
+ "ProtectedFromScaleIn": true
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example enables instance protection for the specified instance.",
+ "id": "autoscaling-set-instance-protection-1",
+ "title": "To enable instance protection for an instance"
+ },
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "InstanceIds": [
+ "i-93633f9b"
+ ],
+ "ProtectedFromScaleIn": false
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example disables instance protection for the specified instance.",
+ "id": "autoscaling-set-instance-protection-2",
+ "title": "To disable instance protection for an instance"
+ }
+ ],
+ "StartInstanceRefresh": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "DesiredConfiguration": {
+ "LaunchTemplate": {
+ "LaunchTemplateName": "my-template-for-auto-scaling",
+ "Version": "$Latest"
+ }
+ },
+ "Preferences": {
+ "AlarmSpecification": {
+ "Alarms": [
+ "my-alarm"
+ ]
+ },
+ "AutoRollback": true,
+ "InstanceWarmup": 200,
+ "MinHealthyPercentage": 90
+ }
+ },
+ "output": {
+ "InstanceRefreshId": "08b91cf7-8fa6-48af-b6a6-d227f40f1b9b"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example starts an instance refresh for the specified Auto Scaling group.",
+ "id": "to-start-an-instance-refresh-1592957271522",
+ "title": "To start an instance refresh"
+ }
+ ],
+ "SuspendProcesses": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "ScalingProcesses": [
+ "AlarmNotification"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example suspends the specified scaling process for the specified Auto Scaling group.",
+ "id": "autoscaling-suspend-processes-1",
+ "title": "To suspend Auto Scaling processes"
+ }
+ ],
+ "TerminateInstanceInAutoScalingGroup": [
+ {
+ "input": {
+ "InstanceId": "i-93633f9b",
+ "ShouldDecrementDesiredCapacity": false
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example terminates the specified instance from the specified Auto Scaling group without updating the size of the group. Auto Scaling launches a replacement instance after the specified instance terminates.",
+ "id": "autoscaling-terminate-instance-in-auto-scaling-group-1",
+ "title": "To terminate an instance in an Auto Scaling group"
+ }
+ ],
+ "UpdateAutoScalingGroup": [
+ {
+ "input": {
+ "AutoScalingGroupName": "my-auto-scaling-group",
+ "LaunchTemplate": {
+ "LaunchTemplateName": "my-template-for-auto-scaling",
+ "Version": "2"
+ },
+ "MaxSize": 5,
+ "MinSize": 1,
+ "NewInstancesProtectedFromScaleIn": true
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example updates multiple properties at the same time.",
+ "id": "autoscaling-update-auto-scaling-group-1",
+ "title": "To update an Auto Scaling group"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/autoscaling/2011-01-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/autoscaling/2011-01-01/paginators-1.json
new file mode 100644
index 00000000..ac5939df
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/autoscaling/2011-01-01/paginators-1.json
@@ -0,0 +1,70 @@
+{
+ "pagination": {
+ "DescribeAutoScalingGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxRecords",
+ "result_key": "AutoScalingGroups"
+ },
+ "DescribeAutoScalingInstances": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxRecords",
+ "result_key": "AutoScalingInstances"
+ },
+ "DescribeLaunchConfigurations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxRecords",
+ "result_key": "LaunchConfigurations"
+ },
+ "DescribeNotificationConfigurations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxRecords",
+ "result_key": "NotificationConfigurations"
+ },
+ "DescribePolicies": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxRecords",
+ "result_key": "ScalingPolicies"
+ },
+ "DescribeScalingActivities": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxRecords",
+ "result_key": "Activities"
+ },
+ "DescribeScheduledActions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxRecords",
+ "result_key": "ScheduledUpdateGroupActions"
+ },
+ "DescribeTags": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxRecords",
+ "result_key": "Tags"
+ },
+ "DescribeLoadBalancerTargetGroups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxRecords",
+ "output_token": "NextToken",
+ "result_key": "LoadBalancerTargetGroups"
+ },
+ "DescribeLoadBalancers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxRecords",
+ "output_token": "NextToken",
+ "result_key": "LoadBalancers"
+ },
+ "DescribeWarmPool": {
+ "input_token": "NextToken",
+ "limit_key": "MaxRecords",
+ "output_token": "NextToken",
+ "result_key": "Instances"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/autoscaling/2011-01-01/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/autoscaling/2011-01-01/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..1c634992
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/autoscaling/2011-01-01/paginators-1.sdk-extras.json
@@ -0,0 +1,12 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "DescribeWarmPool": {
+ "non_aggregate_keys": [
+ "WarmPoolConfiguration"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/autoscaling/2011-01-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/autoscaling/2011-01-01/service-2.json.gz
new file mode 100644
index 00000000..70c28e72
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/autoscaling/2011-01-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/b2bi/2022-06-23/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/b2bi/2022-06-23/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..c0b07fe1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/b2bi/2022-06-23/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/b2bi/2022-06-23/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/b2bi/2022-06-23/paginators-1.json
new file mode 100644
index 00000000..5f3b0d24
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/b2bi/2022-06-23/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListCapabilities": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "capabilities"
+ },
+ "ListPartnerships": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "partnerships"
+ },
+ "ListProfiles": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "profiles"
+ },
+ "ListTransformers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "transformers"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/b2bi/2022-06-23/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/b2bi/2022-06-23/service-2.json.gz
new file mode 100644
index 00000000..591e7a3d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/b2bi/2022-06-23/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/backup-gateway/2021-01-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/backup-gateway/2021-01-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..84d7b9fb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/backup-gateway/2021-01-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/backup-gateway/2021-01-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/backup-gateway/2021-01-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/backup-gateway/2021-01-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/backup-gateway/2021-01-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/backup-gateway/2021-01-01/paginators-1.json
new file mode 100644
index 00000000..462aacd0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/backup-gateway/2021-01-01/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListGateways": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Gateways"
+ },
+ "ListHypervisors": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Hypervisors"
+ },
+ "ListVirtualMachines": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "VirtualMachines"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/backup-gateway/2021-01-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/backup-gateway/2021-01-01/service-2.json.gz
new file mode 100644
index 00000000..969c0f9f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/backup-gateway/2021-01-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/backup/2018-11-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/backup/2018-11-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..ba1a6708
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/backup/2018-11-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/backup/2018-11-15/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/backup/2018-11-15/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/backup/2018-11-15/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/backup/2018-11-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/backup/2018-11-15/paginators-1.json
new file mode 100644
index 00000000..f19ea3db
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/backup/2018-11-15/paginators-1.json
@@ -0,0 +1,112 @@
+{
+ "pagination": {
+ "ListBackupJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "BackupJobs"
+ },
+ "ListBackupPlanTemplates": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "BackupPlanTemplatesList"
+ },
+ "ListBackupPlanVersions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "BackupPlanVersionsList"
+ },
+ "ListBackupPlans": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "BackupPlansList"
+ },
+ "ListBackupSelections": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "BackupSelectionsList"
+ },
+ "ListBackupVaults": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "BackupVaultList"
+ },
+ "ListCopyJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "CopyJobs"
+ },
+ "ListProtectedResources": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Results"
+ },
+ "ListRecoveryPointsByBackupVault": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RecoveryPoints"
+ },
+ "ListRecoveryPointsByResource": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RecoveryPoints"
+ },
+ "ListRestoreJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RestoreJobs"
+ },
+ "ListLegalHolds": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "LegalHolds"
+ },
+ "ListRecoveryPointsByLegalHold": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RecoveryPoints"
+ },
+ "ListProtectedResourcesByBackupVault": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Results"
+ },
+ "ListRestoreJobsByProtectedResource": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RestoreJobs"
+ },
+ "ListRestoreTestingPlans": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RestoreTestingPlans"
+ },
+ "ListRestoreTestingSelections": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RestoreTestingSelections"
+ },
+ "ListIndexedRecoveryPoints": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "IndexedRecoveryPoints"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/backup/2018-11-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/backup/2018-11-15/service-2.json.gz
new file mode 100644
index 00000000..323229e1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/backup/2018-11-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/backupsearch/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/backupsearch/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..11903912
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/backupsearch/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/backupsearch/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/backupsearch/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..bc482fde
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/backupsearch/2018-05-10/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListSearchJobBackups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Results"
+ },
+ "ListSearchJobResults": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Results"
+ },
+ "ListSearchJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SearchJobs"
+ },
+ "ListSearchResultExportJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ExportJobs"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/backupsearch/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/backupsearch/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..e10ec2d4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/backupsearch/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/backupsearch/2018-05-10/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/backupsearch/2018-05-10/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/backupsearch/2018-05-10/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/batch/2016-08-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/batch/2016-08-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..36a3fc45
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/batch/2016-08-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/batch/2016-08-10/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/batch/2016-08-10/examples-1.json
new file mode 100644
index 00000000..18203dc8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/batch/2016-08-10/examples-1.json
@@ -0,0 +1,711 @@
+{
+ "version": "1.0",
+ "examples": {
+ "CancelJob": [
+ {
+ "input": {
+ "jobId": "1d828f65-7a4d-42e8-996d-3b900ed59dc4",
+ "reason": "Cancelling job."
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example cancels a job with the specified job ID.",
+ "id": "to-cancel-a-job-1481152314733",
+ "title": "To cancel a job"
+ }
+ ],
+ "CreateComputeEnvironment": [
+ {
+ "input": {
+ "type": "MANAGED",
+ "computeEnvironmentName": "C4OnDemand",
+ "computeResources": {
+ "type": "EC2",
+ "desiredvCpus": 48,
+ "ec2KeyPair": "id_rsa",
+ "instanceRole": "ecsInstanceRole",
+ "instanceTypes": [
+ "c4.large",
+ "c4.xlarge",
+ "c4.2xlarge",
+ "c4.4xlarge",
+ "c4.8xlarge"
+ ],
+ "maxvCpus": 128,
+ "minvCpus": 0,
+ "securityGroupIds": [
+ "sg-cf5093b2"
+ ],
+ "subnets": [
+ "subnet-220c0e0a",
+ "subnet-1a95556d",
+ "subnet-978f6dce"
+ ],
+ "tags": {
+ "Name": "Batch Instance - C4OnDemand"
+ }
+ },
+ "serviceRole": "arn:aws:iam::012345678910:role/AWSBatchServiceRole",
+ "state": "ENABLED"
+ },
+ "output": {
+ "computeEnvironmentArn": "arn:aws:batch:us-east-1:012345678910:compute-environment/C4OnDemand",
+ "computeEnvironmentName": "C4OnDemand"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a managed compute environment with specific C4 instance types that are launched on demand. The compute environment is called C4OnDemand.",
+ "id": "to-create-a-managed-ec2-compute-environment-1481152600017",
+ "title": "To create a managed EC2 compute environment"
+ },
+ {
+ "input": {
+ "type": "MANAGED",
+ "computeEnvironmentName": "M4Spot",
+ "computeResources": {
+ "type": "SPOT",
+ "bidPercentage": 20,
+ "desiredvCpus": 4,
+ "ec2KeyPair": "id_rsa",
+ "instanceRole": "ecsInstanceRole",
+ "instanceTypes": [
+ "m4"
+ ],
+ "maxvCpus": 128,
+ "minvCpus": 0,
+ "securityGroupIds": [
+ "sg-cf5093b2"
+ ],
+ "spotIamFleetRole": "arn:aws:iam::012345678910:role/aws-ec2-spot-fleet-role",
+ "subnets": [
+ "subnet-220c0e0a",
+ "subnet-1a95556d",
+ "subnet-978f6dce"
+ ],
+ "tags": {
+ "Name": "Batch Instance - M4Spot"
+ }
+ },
+ "serviceRole": "arn:aws:iam::012345678910:role/AWSBatchServiceRole",
+ "state": "ENABLED"
+ },
+ "output": {
+ "computeEnvironmentArn": "arn:aws:batch:us-east-1:012345678910:compute-environment/M4Spot",
+ "computeEnvironmentName": "M4Spot"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a managed compute environment with the M4 instance type that is launched when the Spot bid price is at or below 20% of the On-Demand price for the instance type. The compute environment is called M4Spot.",
+ "id": "to-create-a-managed-ec2-spot-compute-environment-1481152844190",
+ "title": "To create a managed EC2 Spot compute environment"
+ }
+ ],
+ "CreateJobQueue": [
+ {
+ "input": {
+ "computeEnvironmentOrder": [
+ {
+ "computeEnvironment": "M4Spot",
+ "order": 1
+ }
+ ],
+ "jobQueueName": "LowPriority",
+ "priority": 1,
+ "state": "ENABLED"
+ },
+ "output": {
+ "jobQueueArn": "arn:aws:batch:us-east-1:012345678910:job-queue/LowPriority",
+ "jobQueueName": "LowPriority"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a job queue called LowPriority that uses the M4Spot compute environment.",
+ "id": "to-create-a-job-queue-with-a-single-compute-environment-1481152967946",
+ "title": "To create a job queue with a single compute environment"
+ },
+ {
+ "input": {
+ "computeEnvironmentOrder": [
+ {
+ "computeEnvironment": "C4OnDemand",
+ "order": 1
+ },
+ {
+ "computeEnvironment": "M4Spot",
+ "order": 2
+ }
+ ],
+ "jobQueueName": "HighPriority",
+ "priority": 10,
+ "state": "ENABLED"
+ },
+ "output": {
+ "jobQueueArn": "arn:aws:batch:us-east-1:012345678910:job-queue/HighPriority",
+ "jobQueueName": "HighPriority"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a job queue called HighPriority that uses the C4OnDemand compute environment with an order of 1 and the M4Spot compute environment with an order of 2.",
+ "id": "to-create-a-job-queue-with-multiple-compute-environments-1481153027051",
+ "title": "To create a job queue with multiple compute environments"
+ }
+ ],
+ "DeleteComputeEnvironment": [
+ {
+ "input": {
+ "computeEnvironment": "P2OnDemand"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the P2OnDemand compute environment.",
+ "id": "to-delete-a-compute-environment-1481153105644",
+ "title": "To delete a compute environment"
+ }
+ ],
+ "DeleteJobQueue": [
+ {
+ "input": {
+ "jobQueue": "GPGPU"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the GPGPU job queue.",
+ "id": "to-delete-a-job-queue-1481153508134",
+ "title": "To delete a job queue"
+ }
+ ],
+ "DeregisterJobDefinition": [
+ {
+ "input": {
+ "jobDefinition": "sleep10"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deregisters a job definition called sleep10.",
+ "id": "to-deregister-a-job-definition-1481153579565",
+ "title": "To deregister a job definition"
+ }
+ ],
+ "DescribeComputeEnvironments": [
+ {
+ "input": {
+ "computeEnvironments": [
+ "P2OnDemand"
+ ]
+ },
+ "output": {
+ "computeEnvironments": [
+ {
+ "type": "MANAGED",
+ "computeEnvironmentArn": "arn:aws:batch:us-east-1:012345678910:compute-environment/P2OnDemand",
+ "computeEnvironmentName": "P2OnDemand",
+ "computeResources": {
+ "type": "EC2",
+ "desiredvCpus": 48,
+ "ec2KeyPair": "id_rsa",
+ "instanceRole": "ecsInstanceRole",
+ "instanceTypes": [
+ "p2"
+ ],
+ "maxvCpus": 128,
+ "minvCpus": 0,
+ "securityGroupIds": [
+ "sg-cf5093b2"
+ ],
+ "subnets": [
+ "subnet-220c0e0a",
+ "subnet-1a95556d",
+ "subnet-978f6dce"
+ ],
+ "tags": {
+ "Name": "Batch Instance - P2OnDemand"
+ }
+ },
+ "ecsClusterArn": "arn:aws:ecs:us-east-1:012345678910:cluster/P2OnDemand_Batch_2c06f29d-d1fe-3a49-879d-42394c86effc",
+ "serviceRole": "arn:aws:iam::012345678910:role/AWSBatchServiceRole",
+ "state": "ENABLED",
+ "status": "VALID",
+ "statusReason": "ComputeEnvironment Healthy"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the P2OnDemand compute environment.",
+ "id": "to-describe-a-compute-environment-1481153713334",
+ "title": "To describe a compute environment"
+ }
+ ],
+ "DescribeJobDefinitions": [
+ {
+ "input": {
+ "status": "ACTIVE"
+ },
+ "output": {
+ "jobDefinitions": [
+ {
+ "type": "container",
+ "containerProperties": {
+ "command": [
+ "sleep",
+ "60"
+ ],
+ "environment": [
+
+ ],
+ "image": "busybox",
+ "mountPoints": [
+
+ ],
+ "resourceRequirements": [
+ {
+ "type": "MEMORY",
+ "value": "128"
+ },
+ {
+ "type": "VCPU",
+ "value": "1"
+ }
+ ],
+ "ulimits": [
+
+ ],
+ "volumes": [
+
+ ]
+ },
+ "jobDefinitionArn": "arn:aws:batch:us-east-1:012345678910:job-definition/sleep60:1",
+ "jobDefinitionName": "sleep60",
+ "revision": 1,
+ "status": "ACTIVE"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes all of your active job definitions.",
+ "id": "to-describe-active-job-definitions-1481153895831",
+ "title": "To describe active job definitions"
+ }
+ ],
+ "DescribeJobQueues": [
+ {
+ "input": {
+ "jobQueues": [
+ "HighPriority"
+ ]
+ },
+ "output": {
+ "jobQueues": [
+ {
+ "computeEnvironmentOrder": [
+ {
+ "computeEnvironment": "arn:aws:batch:us-east-1:012345678910:compute-environment/C4OnDemand",
+ "order": 1
+ }
+ ],
+ "jobQueueArn": "arn:aws:batch:us-east-1:012345678910:job-queue/HighPriority",
+ "jobQueueName": "HighPriority",
+ "priority": 1,
+ "state": "ENABLED",
+ "status": "VALID",
+ "statusReason": "JobQueue Healthy"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the HighPriority job queue.",
+ "id": "to-describe-a-job-queue-1481153995804",
+ "title": "To describe a job queue"
+ }
+ ],
+ "DescribeJobs": [
+ {
+ "input": {
+ "jobs": [
+ "24fa2d7a-64c4-49d2-8b47-f8da4fbde8e9"
+ ]
+ },
+ "output": {
+ "jobs": [
+ {
+ "container": {
+ "command": [
+ "sleep",
+ "60"
+ ],
+ "containerInstanceArn": "arn:aws:ecs:us-east-1:012345678910:container-instance/5406d7cd-58bd-4b8f-9936-48d7c6b1526c",
+ "environment": [
+
+ ],
+ "exitCode": 0,
+ "image": "busybox",
+ "memory": 128,
+ "mountPoints": [
+
+ ],
+ "ulimits": [
+
+ ],
+ "vcpus": 1,
+ "volumes": [
+
+ ]
+ },
+ "createdAt": 1480460782010,
+ "dependsOn": [
+
+ ],
+ "jobDefinition": "sleep60",
+ "jobId": "24fa2d7a-64c4-49d2-8b47-f8da4fbde8e9",
+ "jobName": "example",
+ "jobQueue": "arn:aws:batch:us-east-1:012345678910:job-queue/HighPriority",
+ "parameters": {
+ },
+ "startedAt": 1480460816500,
+ "status": "SUCCEEDED",
+ "stoppedAt": 1480460880699
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes a job with the specified job ID.",
+ "id": "to-describe-a-specific-job-1481154090490",
+ "title": "To describe a specific job"
+ }
+ ],
+ "ListJobs": [
+ {
+ "input": {
+ "jobQueue": "HighPriority"
+ },
+ "output": {
+ "jobSummaryList": [
+ {
+ "jobId": "e66ff5fd-a1ff-4640-b1a2-0b0a142f49bb",
+ "jobName": "example"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists the running jobs in the HighPriority job queue.",
+ "id": "to-list-running-jobs-1481154202164",
+ "title": "To list running jobs"
+ },
+ {
+ "input": {
+ "jobQueue": "HighPriority",
+ "jobStatus": "SUBMITTED"
+ },
+ "output": {
+ "jobSummaryList": [
+ {
+ "jobId": "68f0c163-fbd4-44e6-9fd1-25b14a434786",
+ "jobName": "example"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists jobs in the HighPriority job queue that are in the SUBMITTED job status.",
+ "id": "to-list-submitted-jobs-1481154251623",
+ "title": "To list submitted jobs"
+ }
+ ],
+ "ListTagsForResource": [
+ {
+ "input": {
+ "resourceArn": "arn:aws:batch:us-east-1:123456789012:job-definition/sleep30:1"
+ },
+ "output": {
+ "tags": {
+ "Department": "Engineering",
+ "Stage": "Alpha",
+ "User": "JaneDoe"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This demonstrates calling the ListTagsForResource action.",
+ "id": "listtagsforresource-example-1591293003710",
+ "title": "ListTagsForResource Example"
+ }
+ ],
+ "RegisterJobDefinition": [
+ {
+ "input": {
+ "type": "container",
+ "containerProperties": {
+ "command": [
+ "sleep",
+ "10"
+ ],
+ "image": "busybox",
+ "resourceRequirements": [
+ {
+ "type": "MEMORY",
+ "value": "128"
+ },
+ {
+ "type": "VCPU",
+ "value": "1"
+ }
+ ]
+ },
+ "jobDefinitionName": "sleep10"
+ },
+ "output": {
+ "jobDefinitionArn": "arn:aws:batch:us-east-1:012345678910:job-definition/sleep10:1",
+ "jobDefinitionName": "sleep10",
+ "revision": 1
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example registers a job definition for a simple container job.",
+ "id": "to-register-a-job-definition-1481154325325",
+ "title": "To register a job definition"
+ },
+ {
+ "input": {
+ "type": "container",
+ "containerProperties": {
+ "command": [
+ "sleep",
+ "30"
+ ],
+ "image": "busybox",
+ "resourceRequirements": [
+ {
+ "type": "MEMORY",
+ "value": "128"
+ },
+ {
+ "type": "VCPU",
+ "value": "1"
+ }
+ ]
+ },
+ "jobDefinitionName": "sleep30",
+ "tags": {
+ "Department": "Engineering",
+ "User": "JaneDoe"
+ }
+ },
+ "output": {
+ "jobDefinitionArn": "arn:aws:batch:us-east-1:012345678910:job-definition/sleep30:1",
+ "jobDefinitionName": "sleep30",
+ "revision": 1
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This demonstrates calling the RegisterJobDefinition action, including tags.",
+ "id": "registerjobdefinition-with-tags-1591290509028",
+ "title": "RegisterJobDefinition with tags"
+ }
+ ],
+ "SubmitJob": [
+ {
+ "input": {
+ "jobDefinition": "sleep60",
+ "jobName": "example",
+ "jobQueue": "HighPriority"
+ },
+ "output": {
+ "jobId": "876da822-4198-45f2-a252-6cea32512ea8",
+ "jobName": "example"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example submits a simple container job called example to the HighPriority job queue.",
+ "id": "to-submit-a-job-to-a-queue-1481154481673",
+ "title": "To submit a job to a queue"
+ }
+ ],
+ "TagResource": [
+ {
+ "input": {
+ "resourceArn": "arn:aws:batch:us-east-1:123456789012:job-definition/sleep30:1",
+ "tags": {
+ "Stage": "Alpha"
+ }
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This demonstrates calling the TagResource action.",
+ "id": "tagresource-example-1591291959952",
+ "title": "TagResource Example"
+ }
+ ],
+ "TerminateJob": [
+ {
+ "input": {
+ "jobId": "61e743ed-35e4-48da-b2de-5c8333821c84",
+ "reason": "Terminating job."
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example terminates a job with the specified job ID.",
+ "id": "to-terminate-a-job-1481154558276",
+ "title": "To terminate a job"
+ }
+ ],
+ "UntagResource": [
+ {
+ "input": {
+ "resourceArn": "arn:aws:batch:us-east-1:123456789012:job-definition/sleep30:1",
+ "tagKeys": [
+ "Stage"
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This demonstrates calling the UntagResource action.",
+ "id": "untagresource-example-1591292811042",
+ "title": "UntagResource Example"
+ }
+ ],
+ "UpdateComputeEnvironment": [
+ {
+ "input": {
+ "computeEnvironment": "P2OnDemand",
+ "state": "DISABLED"
+ },
+ "output": {
+ "computeEnvironmentArn": "arn:aws:batch:us-east-1:012345678910:compute-environment/P2OnDemand",
+ "computeEnvironmentName": "P2OnDemand"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example disables the P2OnDemand compute environment so it can be deleted.",
+ "id": "to-update-a-compute-environment-1481154702731",
+ "title": "To update a compute environment"
+ }
+ ],
+ "UpdateJobQueue": [
+ {
+ "input": {
+ "jobQueue": "GPGPU",
+ "state": "DISABLED"
+ },
+ "output": {
+ "jobQueueArn": "arn:aws:batch:us-east-1:012345678910:job-queue/GPGPU",
+ "jobQueueName": "GPGPU"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example disables a job queue so that it can be deleted.",
+ "id": "to-update-a-job-queue-1481154806981",
+ "title": "To update a job queue"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/batch/2016-08-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/batch/2016-08-10/paginators-1.json
new file mode 100644
index 00000000..0181c2c8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/batch/2016-08-10/paginators-1.json
@@ -0,0 +1,46 @@
+{
+ "pagination": {
+ "DescribeComputeEnvironments": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "computeEnvironments"
+ },
+ "DescribeJobDefinitions": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "jobDefinitions"
+ },
+ "DescribeJobQueues": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "jobQueues"
+ },
+ "ListJobs": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "jobSummaryList"
+ },
+ "ListSchedulingPolicies": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "schedulingPolicies"
+ },
+ "ListConsumableResources": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "consumableResources"
+ },
+ "ListJobsByConsumableResource": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "jobs"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/batch/2016-08-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/batch/2016-08-10/service-2.json.gz
new file mode 100644
index 00000000..5a71427b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/batch/2016-08-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bcm-data-exports/2023-11-26/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/bcm-data-exports/2023-11-26/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..2a7e1cc4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bcm-data-exports/2023-11-26/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bcm-data-exports/2023-11-26/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/bcm-data-exports/2023-11-26/paginators-1.json
new file mode 100644
index 00000000..3d03805c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bcm-data-exports/2023-11-26/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListExecutions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Executions"
+ },
+ "ListExports": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Exports"
+ },
+ "ListTables": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Tables"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bcm-data-exports/2023-11-26/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/bcm-data-exports/2023-11-26/service-2.json.gz
new file mode 100644
index 00000000..89daa054
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bcm-data-exports/2023-11-26/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bcm-pricing-calculator/2024-06-19/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/bcm-pricing-calculator/2024-06-19/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..dfdc9c54
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bcm-pricing-calculator/2024-06-19/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bcm-pricing-calculator/2024-06-19/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/bcm-pricing-calculator/2024-06-19/paginators-1.json
new file mode 100644
index 00000000..678b04a9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bcm-pricing-calculator/2024-06-19/paginators-1.json
@@ -0,0 +1,64 @@
+{
+ "pagination": {
+ "ListBillEstimateCommitments": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListBillEstimateInputCommitmentModifications": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListBillEstimateInputUsageModifications": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListBillEstimateLineItems": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListBillEstimates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListBillScenarioCommitmentModifications": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListBillScenarioUsageModifications": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListBillScenarios": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListWorkloadEstimateUsage": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListWorkloadEstimates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bcm-pricing-calculator/2024-06-19/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/bcm-pricing-calculator/2024-06-19/service-2.json.gz
new file mode 100644
index 00000000..03560d81
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bcm-pricing-calculator/2024-06-19/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bcm-pricing-calculator/2024-06-19/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/bcm-pricing-calculator/2024-06-19/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bcm-pricing-calculator/2024-06-19/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent-runtime/2023-07-26/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent-runtime/2023-07-26/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..68b4f4bf
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent-runtime/2023-07-26/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent-runtime/2023-07-26/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent-runtime/2023-07-26/paginators-1.json
new file mode 100644
index 00000000..b31af0b7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent-runtime/2023-07-26/paginators-1.json
@@ -0,0 +1,38 @@
+{
+ "pagination": {
+ "Retrieve": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "retrievalResults"
+ },
+ "GetAgentMemory": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxItems",
+ "result_key": "memoryContents"
+ },
+ "Rerank": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "results"
+ },
+ "ListInvocationSteps": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "invocationStepSummaries"
+ },
+ "ListInvocations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "invocationSummaries"
+ },
+ "ListSessions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "sessionSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent-runtime/2023-07-26/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent-runtime/2023-07-26/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..30da00d1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent-runtime/2023-07-26/paginators-1.sdk-extras.json
@@ -0,0 +1,12 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "Retrieve": {
+ "non_aggregate_keys": [
+ "guardrailAction"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent-runtime/2023-07-26/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent-runtime/2023-07-26/service-2.json.gz
new file mode 100644
index 00000000..5e96ac95
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent-runtime/2023-07-26/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent/2023-06-05/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent/2023-06-05/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..05404a61
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent/2023-06-05/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent/2023-06-05/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent/2023-06-05/paginators-1.json
new file mode 100644
index 00000000..0daea1de
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent/2023-06-05/paginators-1.json
@@ -0,0 +1,88 @@
+{
+ "pagination": {
+ "ListAgentActionGroups": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "actionGroupSummaries"
+ },
+ "ListAgentAliases": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "agentAliasSummaries"
+ },
+ "ListAgentKnowledgeBases": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "agentKnowledgeBaseSummaries"
+ },
+ "ListAgentVersions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "agentVersionSummaries"
+ },
+ "ListAgents": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "agentSummaries"
+ },
+ "ListDataSources": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "dataSourceSummaries"
+ },
+ "ListIngestionJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "ingestionJobSummaries"
+ },
+ "ListKnowledgeBases": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "knowledgeBaseSummaries"
+ },
+ "ListFlowAliases": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "flowAliasSummaries"
+ },
+ "ListFlowVersions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "flowVersionSummaries"
+ },
+ "ListFlows": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "flowSummaries"
+ },
+ "ListPrompts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "promptSummaries"
+ },
+ "ListKnowledgeBaseDocuments": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "documentDetails"
+ },
+ "ListAgentCollaborators": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "agentCollaboratorSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent/2023-06-05/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent/2023-06-05/service-2.json.gz
new file mode 100644
index 00000000..d6e0deaa
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-agent/2023-06-05/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation-runtime/2024-06-13/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation-runtime/2024-06-13/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..18b11409
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation-runtime/2024-06-13/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation-runtime/2024-06-13/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation-runtime/2024-06-13/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation-runtime/2024-06-13/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation-runtime/2024-06-13/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation-runtime/2024-06-13/service-2.json.gz
new file mode 100644
index 00000000..f2196844
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation-runtime/2024-06-13/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation/2023-07-26/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation/2023-07-26/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..0d2e59f4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation/2023-07-26/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation/2023-07-26/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation/2023-07-26/paginators-1.json
new file mode 100644
index 00000000..741799cc
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation/2023-07-26/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "ListBlueprints": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "blueprints"
+ },
+ "ListDataAutomationProjects": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "projects"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation/2023-07-26/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation/2023-07-26/service-2.json.gz
new file mode 100644
index 00000000..d835fd66
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-data-automation/2023-07-26/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bedrock-runtime/2023-09-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-runtime/2023-09-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..cfd8e67c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-runtime/2023-09-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bedrock-runtime/2023-09-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-runtime/2023-09-30/paginators-1.json
new file mode 100644
index 00000000..b6c3d8b5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-runtime/2023-09-30/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListAsyncInvokes": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "asyncInvokeSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bedrock-runtime/2023-09-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-runtime/2023-09-30/service-2.json.gz
new file mode 100644
index 00000000..805d228b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-runtime/2023-09-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bedrock-runtime/2023-09-30/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-runtime/2023-09-30/waiters-2.json
new file mode 100644
index 00000000..4b20636a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bedrock-runtime/2023-09-30/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bedrock/2023-04-20/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/bedrock/2023-04-20/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..4ed3145d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bedrock/2023-04-20/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bedrock/2023-04-20/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/bedrock/2023-04-20/paginators-1.json
new file mode 100644
index 00000000..561133f3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bedrock/2023-04-20/paginators-1.json
@@ -0,0 +1,76 @@
+{
+ "pagination": {
+ "ListCustomModels": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "modelSummaries"
+ },
+ "ListModelCustomizationJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "modelCustomizationJobSummaries"
+ },
+ "ListProvisionedModelThroughputs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "provisionedModelSummaries"
+ },
+ "ListEvaluationJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "jobSummaries"
+ },
+ "ListGuardrails": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "guardrails"
+ },
+ "ListModelCopyJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "modelCopyJobSummaries"
+ },
+ "ListModelInvocationJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "invocationJobSummaries"
+ },
+ "ListImportedModels": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "modelSummaries"
+ },
+ "ListModelImportJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "modelImportJobSummaries"
+ },
+ "ListInferenceProfiles": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "inferenceProfileSummaries"
+ },
+ "ListMarketplaceModelEndpoints": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "marketplaceModelEndpoints"
+ },
+ "ListPromptRouters": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "promptRouterSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bedrock/2023-04-20/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/bedrock/2023-04-20/service-2.json.gz
new file mode 100644
index 00000000..0f23ac1e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bedrock/2023-04-20/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/bedrock/2023-04-20/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/bedrock/2023-04-20/waiters-2.json
new file mode 100644
index 00000000..4b20636a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/bedrock/2023-04-20/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/billing/2023-09-07/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/billing/2023-09-07/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..cfb28e3d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/billing/2023-09-07/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/billing/2023-09-07/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/billing/2023-09-07/paginators-1.json
new file mode 100644
index 00000000..bc778918
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/billing/2023-09-07/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "ListBillingViews": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "billingViews"
+ },
+ "ListSourceViewsForBillingView": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "sourceViews"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/billing/2023-09-07/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/billing/2023-09-07/service-2.json.gz
new file mode 100644
index 00000000..21bfbe09
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/billing/2023-09-07/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/billing/2023-09-07/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/billing/2023-09-07/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/billing/2023-09-07/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/billingconductor/2021-07-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/billingconductor/2021-07-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..0a4cac26
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/billingconductor/2021-07-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/billingconductor/2021-07-30/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/billingconductor/2021-07-30/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/billingconductor/2021-07-30/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/billingconductor/2021-07-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/billingconductor/2021-07-30/paginators-1.json
new file mode 100644
index 00000000..2ca4d75f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/billingconductor/2021-07-30/paginators-1.json
@@ -0,0 +1,80 @@
+{
+ "pagination": {
+ "ListAccountAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "LinkedAccounts"
+ },
+ "ListBillingGroupCostReports": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "BillingGroupCostReports"
+ },
+ "ListBillingGroups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "BillingGroups"
+ },
+ "ListCustomLineItems": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "CustomLineItems"
+ },
+ "ListPricingPlans": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "BillingPeriod"
+ ],
+ "output_token": "NextToken",
+ "result_key": "PricingPlans"
+ },
+ "ListPricingPlansAssociatedWithPricingRule": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "BillingPeriod",
+ "PricingRuleArn"
+ ],
+ "output_token": "NextToken",
+ "result_key": "PricingPlanArns"
+ },
+ "ListPricingRules": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "BillingPeriod"
+ ],
+ "output_token": "NextToken",
+ "result_key": "PricingRules"
+ },
+ "ListPricingRulesAssociatedToPricingPlan": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "BillingPeriod",
+ "PricingPlanArn"
+ ],
+ "output_token": "NextToken",
+ "result_key": "PricingRuleArns"
+ },
+ "ListResourcesAssociatedToCustomLineItem": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "Arn"
+ ],
+ "output_token": "NextToken",
+ "result_key": "AssociatedResources"
+ },
+ "ListCustomLineItemVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "CustomLineItemVersions"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/billingconductor/2021-07-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/billingconductor/2021-07-30/service-2.json.gz
new file mode 100644
index 00000000..2fbed575
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/billingconductor/2021-07-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/billingconductor/2021-07-30/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/billingconductor/2021-07-30/waiters-2.json
new file mode 100644
index 00000000..ee5023dc
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/billingconductor/2021-07-30/waiters-2.json
@@ -0,0 +1,4 @@
+{
+ "version": 2,
+ "waiters": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/braket/2019-09-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/braket/2019-09-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..04fb0722
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/braket/2019-09-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/braket/2019-09-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/braket/2019-09-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/braket/2019-09-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/braket/2019-09-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/braket/2019-09-01/paginators-1.json
new file mode 100644
index 00000000..a5be3333
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/braket/2019-09-01/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "SearchDevices": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "devices"
+ },
+ "SearchQuantumTasks": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "quantumTasks"
+ },
+ "SearchJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "jobs"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/braket/2019-09-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/braket/2019-09-01/service-2.json.gz
new file mode 100644
index 00000000..19426198
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/braket/2019-09-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/budgets/2016-10-20/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/budgets/2016-10-20/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..dcab930b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/budgets/2016-10-20/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/budgets/2016-10-20/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/budgets/2016-10-20/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/budgets/2016-10-20/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/budgets/2016-10-20/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/budgets/2016-10-20/paginators-1.json
new file mode 100644
index 00000000..15f7a63e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/budgets/2016-10-20/paginators-1.json
@@ -0,0 +1,52 @@
+{
+ "pagination": {
+ "DescribeBudgets": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Budgets"
+ },
+ "DescribeNotificationsForBudget": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Notifications"
+ },
+ "DescribeSubscribersForNotification": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Subscribers"
+ },
+ "DescribeBudgetPerformanceHistory": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "BudgetPerformanceHistory"
+ },
+ "DescribeBudgetActionHistories": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ActionHistories"
+ },
+ "DescribeBudgetActionsForAccount": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Actions"
+ },
+ "DescribeBudgetActionsForBudget": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Actions"
+ },
+ "DescribeBudgetNotificationsForAccount": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "BudgetNotificationsForAccount"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/budgets/2016-10-20/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/budgets/2016-10-20/service-2.json.gz
new file mode 100644
index 00000000..46e3fd3b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/budgets/2016-10-20/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ce/2017-10-25/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ce/2017-10-25/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..5d2f4fa8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ce/2017-10-25/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ce/2017-10-25/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ce/2017-10-25/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ce/2017-10-25/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ce/2017-10-25/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ce/2017-10-25/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ce/2017-10-25/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ce/2017-10-25/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ce/2017-10-25/service-2.json.gz
new file mode 100644
index 00000000..9c54ca1b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ce/2017-10-25/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chatbot/2017-10-11/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/chatbot/2017-10-11/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..74df08b4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chatbot/2017-10-11/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chatbot/2017-10-11/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/chatbot/2017-10-11/paginators-1.json
new file mode 100644
index 00000000..5e4b7646
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chatbot/2017-10-11/paginators-1.json
@@ -0,0 +1,58 @@
+{
+ "pagination": {
+ "DescribeChimeWebhookConfigurations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "WebhookConfigurations"
+ },
+ "DescribeSlackChannelConfigurations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SlackChannelConfigurations"
+ },
+ "DescribeSlackUserIdentities": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SlackUserIdentities"
+ },
+ "DescribeSlackWorkspaces": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SlackWorkspaces"
+ },
+ "ListMicrosoftTeamsChannelConfigurations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "TeamChannelConfigurations"
+ },
+ "ListMicrosoftTeamsConfiguredTeams": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ConfiguredTeams"
+ },
+ "ListMicrosoftTeamsUserIdentities": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "TeamsUserIdentities"
+ },
+ "ListAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Associations"
+ },
+ "ListCustomActions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "CustomActions"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chatbot/2017-10-11/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/chatbot/2017-10-11/service-2.json.gz
new file mode 100644
index 00000000..68216ef8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chatbot/2017-10-11/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-identity/2021-04-20/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-identity/2021-04-20/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..4ce6a564
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-identity/2021-04-20/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-identity/2021-04-20/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-identity/2021-04-20/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-identity/2021-04-20/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-identity/2021-04-20/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-identity/2021-04-20/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-identity/2021-04-20/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-identity/2021-04-20/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-identity/2021-04-20/service-2.json.gz
new file mode 100644
index 00000000..35976f03
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-identity/2021-04-20/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-media-pipelines/2021-07-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-media-pipelines/2021-07-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..7da722bf
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-media-pipelines/2021-07-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-media-pipelines/2021-07-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-media-pipelines/2021-07-15/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-media-pipelines/2021-07-15/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-media-pipelines/2021-07-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-media-pipelines/2021-07-15/service-2.json.gz
new file mode 100644
index 00000000..7f85ced2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-media-pipelines/2021-07-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-meetings/2021-07-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-meetings/2021-07-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..28948655
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-meetings/2021-07-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-meetings/2021-07-15/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-meetings/2021-07-15/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-meetings/2021-07-15/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-meetings/2021-07-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-meetings/2021-07-15/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-meetings/2021-07-15/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-meetings/2021-07-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-meetings/2021-07-15/service-2.json.gz
new file mode 100644
index 00000000..9858eb2e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-meetings/2021-07-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-messaging/2021-05-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-messaging/2021-05-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..753acce5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-messaging/2021-05-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-messaging/2021-05-15/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-messaging/2021-05-15/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-messaging/2021-05-15/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-messaging/2021-05-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-messaging/2021-05-15/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-messaging/2021-05-15/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-messaging/2021-05-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-messaging/2021-05-15/service-2.json.gz
new file mode 100644
index 00000000..98df0f80
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-messaging/2021-05-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-voice/2022-08-03/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-voice/2022-08-03/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..41608087
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-voice/2022-08-03/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-voice/2022-08-03/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-voice/2022-08-03/paginators-1.json
new file mode 100644
index 00000000..648f71ee
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-voice/2022-08-03/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "ListSipMediaApplications": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SipMediaApplications"
+ },
+ "ListSipRules": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SipRules"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-voice/2022-08-03/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-voice/2022-08-03/service-2.json.gz
new file mode 100644
index 00000000..6b618ab0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime-sdk-voice/2022-08-03/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime/2018-05-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/chime/2018-05-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..812c317f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime/2018-05-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime/2018-05-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/chime/2018-05-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime/2018-05-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime/2018-05-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/chime/2018-05-01/paginators-1.json
new file mode 100644
index 00000000..617b1149
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime/2018-05-01/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "ListAccounts": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Accounts"
+ },
+ "ListUsers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Users"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/chime/2018-05-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/chime/2018-05-01/service-2.json.gz
new file mode 100644
index 00000000..53f084ee
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/chime/2018-05-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cleanrooms/2022-02-17/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cleanrooms/2022-02-17/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..c3e0b1a4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cleanrooms/2022-02-17/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cleanrooms/2022-02-17/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cleanrooms/2022-02-17/paginators-1.json
new file mode 100644
index 00000000..cfead018
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cleanrooms/2022-02-17/paginators-1.json
@@ -0,0 +1,118 @@
+{
+ "pagination": {
+ "ListCollaborations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "collaborationList"
+ },
+ "ListConfiguredTableAssociations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "configuredTableAssociationSummaries"
+ },
+ "ListConfiguredTables": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "configuredTableSummaries"
+ },
+ "ListMembers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "memberSummaries"
+ },
+ "ListMemberships": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "membershipSummaries"
+ },
+ "ListProtectedQueries": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "protectedQueries"
+ },
+ "ListSchemas": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "schemaSummaries"
+ },
+ "ListAnalysisTemplates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "analysisTemplateSummaries"
+ },
+ "ListCollaborationAnalysisTemplates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "collaborationAnalysisTemplateSummaries"
+ },
+ "ListCollaborationConfiguredAudienceModelAssociations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "collaborationConfiguredAudienceModelAssociationSummaries"
+ },
+ "ListCollaborationPrivacyBudgetTemplates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "collaborationPrivacyBudgetTemplateSummaries"
+ },
+ "ListCollaborationPrivacyBudgets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "collaborationPrivacyBudgetSummaries"
+ },
+ "ListConfiguredAudienceModelAssociations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "configuredAudienceModelAssociationSummaries"
+ },
+ "ListPrivacyBudgetTemplates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "privacyBudgetTemplateSummaries"
+ },
+ "ListPrivacyBudgets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "privacyBudgetSummaries"
+ },
+ "ListCollaborationIdNamespaceAssociations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "collaborationIdNamespaceAssociationSummaries"
+ },
+ "ListIdMappingTables": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "idMappingTableSummaries"
+ },
+ "ListIdNamespaceAssociations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "idNamespaceAssociationSummaries"
+ },
+ "ListProtectedJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "protectedJobs"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cleanrooms/2022-02-17/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cleanrooms/2022-02-17/service-2.json.gz
new file mode 100644
index 00000000..7d7ac0db
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cleanrooms/2022-02-17/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cleanrooms/2022-02-17/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cleanrooms/2022-02-17/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cleanrooms/2022-02-17/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cleanroomsml/2023-09-06/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cleanroomsml/2023-09-06/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..7522bb06
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cleanroomsml/2023-09-06/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cleanroomsml/2023-09-06/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cleanroomsml/2023-09-06/paginators-1.json
new file mode 100644
index 00000000..79215c55
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cleanroomsml/2023-09-06/paginators-1.json
@@ -0,0 +1,94 @@
+{
+ "pagination": {
+ "ListAudienceExportJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "audienceExportJobs"
+ },
+ "ListAudienceGenerationJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "audienceGenerationJobs"
+ },
+ "ListAudienceModels": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "audienceModels"
+ },
+ "ListConfiguredAudienceModels": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "configuredAudienceModels"
+ },
+ "ListTrainingDatasets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "trainingDatasets"
+ },
+ "ListCollaborationConfiguredModelAlgorithmAssociations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "collaborationConfiguredModelAlgorithmAssociations"
+ },
+ "ListCollaborationMLInputChannels": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "collaborationMLInputChannelsList"
+ },
+ "ListCollaborationTrainedModelExportJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "collaborationTrainedModelExportJobs"
+ },
+ "ListCollaborationTrainedModelInferenceJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "collaborationTrainedModelInferenceJobs"
+ },
+ "ListCollaborationTrainedModels": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "collaborationTrainedModels"
+ },
+ "ListConfiguredModelAlgorithmAssociations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "configuredModelAlgorithmAssociations"
+ },
+ "ListConfiguredModelAlgorithms": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "configuredModelAlgorithms"
+ },
+ "ListMLInputChannels": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "mlInputChannelsList"
+ },
+ "ListTrainedModelInferenceJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "trainedModelInferenceJobs"
+ },
+ "ListTrainedModels": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "trainedModels"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cleanroomsml/2023-09-06/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cleanroomsml/2023-09-06/service-2.json.gz
new file mode 100644
index 00000000..ca68c9fa
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cleanroomsml/2023-09-06/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cleanroomsml/2023-09-06/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cleanroomsml/2023-09-06/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cleanroomsml/2023-09-06/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloud9/2017-09-23/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloud9/2017-09-23/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..dddb787c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloud9/2017-09-23/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloud9/2017-09-23/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloud9/2017-09-23/examples-1.json
new file mode 100644
index 00000000..fdef2700
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloud9/2017-09-23/examples-1.json
@@ -0,0 +1,315 @@
+{
+ "version": "1.0",
+ "examples": {
+ "CreateEnvironmentEC2": [
+ {
+ "input": {
+ "name": "my-demo-environment",
+ "automaticStopTimeMinutes": 60,
+ "description": "This is my demonstration environment.",
+ "instanceType": "t2.micro",
+ "ownerArn": "arn:aws:iam::123456789012:user/MyDemoUser",
+ "subnetId": "subnet-6300cd1b"
+ },
+ "output": {
+ "environmentId": "8d9967e2f0624182b74e7690ad69ebEX"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "",
+ "id": "createenvironmentec2-1516821730547",
+ "title": "CreateEnvironmentEC2"
+ }
+ ],
+ "CreateEnvironmentMembership": [
+ {
+ "input": {
+ "environmentId": "8d9967e2f0624182b74e7690ad69ebEX",
+ "permissions": "read-write",
+ "userArn": "arn:aws:iam::123456789012:user/AnotherDemoUser"
+ },
+ "output": {
+ "membership": {
+ "environmentId": "8d9967e2f0624182b74e7690ad69ebEX",
+ "permissions": "read-write",
+ "userArn": "arn:aws:iam::123456789012:user/AnotherDemoUser",
+ "userId": "AIDAJ3BA6O2FMJWCWXHEX"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "",
+ "id": "createenvironmentmembership-1516822583452",
+ "title": "CreateEnvironmentMembership"
+ }
+ ],
+ "DeleteEnvironment": [
+ {
+ "input": {
+ "environmentId": "8d9967e2f0624182b74e7690ad69ebEX"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "",
+ "id": "deleteenvironment-1516822903149",
+ "title": "DeleteEnvironment"
+ }
+ ],
+ "DeleteEnvironmentMembership": [
+ {
+ "input": {
+ "environmentId": "8d9967e2f0624182b74e7690ad69ebEX",
+ "userArn": "arn:aws:iam::123456789012:user/AnotherDemoUser"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "",
+ "id": "deleteenvironmentmembership-1516822975655",
+ "title": "DeleteEnvironmentMembership"
+ }
+ ],
+ "DescribeEnvironmentMemberships": [
+ {
+ "input": {
+ "environmentId": "8d9967e2f0624182b74e7690ad69ebEX"
+ },
+ "output": {
+ "memberships": [
+ {
+ "environmentId": "8d9967e2f0624182b74e7690ad69ebEX",
+ "permissions": "read-write",
+ "userArn": "arn:aws:iam::123456789012:user/AnotherDemoUser",
+ "userId": "AIDAJ3BA6O2FMJWCWXHEX"
+ },
+ {
+ "environmentId": "8d9967e2f0624182b74e7690ad69ebEX",
+ "permissions": "owner",
+ "userArn": "arn:aws:iam::123456789012:user/MyDemoUser",
+ "userId": "AIDAJNUEDQAQWFELJDLEX"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example gets information about all of the environment members for the specified development environment.",
+ "id": "describeenvironmentmemberships1-1516823070453",
+ "title": "DescribeEnvironmentMemberships1"
+ },
+ {
+ "input": {
+ "environmentId": "8d9967e2f0624182b74e7690ad69ebEX",
+ "permissions": [
+ "owner"
+ ]
+ },
+ "output": {
+ "memberships": [
+ {
+ "environmentId": "8d9967e2f0624182b74e7690ad69ebEX",
+ "permissions": "owner",
+ "userArn": "arn:aws:iam::123456789012:user/MyDemoUser",
+ "userId": "AIDAJNUEDQAQWFELJDLEX"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example gets information about the owner of the specified development environment.",
+ "id": "describeenvironmentmemberships2-1516823191355",
+ "title": "DescribeEnvironmentMemberships2"
+ },
+ {
+ "input": {
+ "userArn": "arn:aws:iam::123456789012:user/MyDemoUser"
+ },
+ "output": {
+ "memberships": [
+ {
+ "environmentId": "10a75714bd494714929e7f5ec4125aEX",
+ "lastAccess": "2018-01-19T11:06:13Z",
+ "permissions": "owner",
+ "userArn": "arn:aws:iam::123456789012:user/MyDemoUser",
+ "userId": "AIDAJNUEDQAQWFELJDLEX"
+ },
+ {
+ "environmentId": "12bfc3cd537f41cb9776f8af5525c9EX",
+ "lastAccess": "2018-01-19T11:39:19Z",
+ "permissions": "owner",
+ "userArn": "arn:aws:iam::123456789012:user/MyDemoUser",
+ "userId": "AIDAJNUEDQAQWFELJDLEX"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example gets development environment membership information for the specified user.",
+ "id": "describeenvironmentmemberships3-1516823268793",
+ "title": "DescribeEnvironmentMemberships3"
+ }
+ ],
+ "DescribeEnvironmentStatus": [
+ {
+ "input": {
+ "environmentId": "8d9967e2f0624182b74e7690ad69ebEX"
+ },
+ "output": {
+ "message": "Environment is ready to use",
+ "status": "ready"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "",
+ "id": "describeenvironmentstatus-1516823462133",
+ "title": "DescribeEnvironmentStatus"
+ }
+ ],
+ "DescribeEnvironments": [
+ {
+ "input": {
+ "environmentIds": [
+ "8d9967e2f0624182b74e7690ad69ebEX",
+ "349c86d4579e4e7298d500ff57a6b2EX"
+ ]
+ },
+ "output": {
+ "environments": [
+ {
+ "name": "my-demo-environment",
+ "type": "ec2",
+ "arn": "arn:aws:cloud9:us-east-2:123456789012:environment:8d9967e2f0624182b74e7690ad69ebEX",
+ "description": "This is my demonstration environment.",
+ "id": "8d9967e2f0624182b74e7690ad69ebEX",
+ "lifecycle": {
+ "status": "CREATED"
+ },
+ "ownerArn": "arn:aws:iam::123456789012:user/MyDemoUser"
+ },
+ {
+ "name": "another-demo-environment",
+ "type": "ssh",
+ "arn": "arn:aws:cloud9:us-east-2:123456789012:environment:349c86d4579e4e7298d500ff57a6b2EX",
+ "description": "",
+ "id": "349c86d4579e4e7298d500ff57a6b2EX",
+ "lifecycle": {
+ "status": "CREATED"
+ },
+ "ownerArn": "arn:aws:sts::123456789012:assumed-role/AnotherDemoUser/AnotherDemoUser"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "",
+ "id": "describeenvironments-1516823568291",
+ "title": "DescribeEnvironments"
+ }
+ ],
+ "ListEnvironments": [
+ {
+ "input": {
+ },
+ "output": {
+ "environmentIds": [
+ "349c86d4579e4e7298d500ff57a6b2EX",
+ "45a3da47af0840f2b0c0824f5ee232EX"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "",
+ "id": "listenvironments-1516823687205",
+ "title": "ListEnvironments"
+ }
+ ],
+ "UpdateEnvironment": [
+ {
+ "input": {
+ "name": "my-changed-demo-environment",
+ "description": "This is my changed demonstration environment.",
+ "environmentId": "8d9967e2f0624182b74e7690ad69ebEX"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "",
+ "id": "updateenvironment-1516823781910",
+ "title": "UpdateEnvironment"
+ }
+ ],
+ "UpdateEnvironmentMembership": [
+ {
+ "input": {
+ "environmentId": "8d9967e2f0624182b74e7690ad69ebEX",
+ "permissions": "read-only",
+ "userArn": "arn:aws:iam::123456789012:user/AnotherDemoUser"
+ },
+ "output": {
+ "membership": {
+ "environmentId": "8d9967e2f0624182b74e7690ad69eb31",
+ "permissions": "read-only",
+ "userArn": "arn:aws:iam::123456789012:user/AnotherDemoUser",
+ "userId": "AIDAJ3BA6O2FMJWCWXHEX"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "",
+ "id": "updateenvironmentmembership-1516823876645",
+ "title": "UpdateEnvironmentMembership"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloud9/2017-09-23/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloud9/2017-09-23/paginators-1.json
new file mode 100644
index 00000000..1c4c2ff5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloud9/2017-09-23/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "DescribeEnvironmentMemberships": {
+ "result_key": "memberships",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "ListEnvironments": {
+ "result_key": "environmentIds",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloud9/2017-09-23/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloud9/2017-09-23/service-2.json.gz
new file mode 100644
index 00000000..85b72dba
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloud9/2017-09-23/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..3d227cf1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/paginators-1.json
new file mode 100644
index 00000000..14380b07
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "ListResourceRequests": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ResourceRequestStatusSummaries"
+ },
+ "ListResources": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ResourceDescriptions"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..d0d47fb7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/paginators-1.sdk-extras.json
@@ -0,0 +1,12 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "ListResources": {
+ "non_aggregate_keys": [
+ "TypeName"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/service-2.json.gz
new file mode 100644
index 00000000..c92f0d07
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/waiters-2.json
new file mode 100644
index 00000000..e5f82acb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudcontrol/2021-09-30/waiters-2.json
@@ -0,0 +1,27 @@
+{
+ "version" : 2,
+ "waiters" : {
+ "ResourceRequestSuccess" : {
+ "description" : "Wait until resource operation request is successful",
+ "delay" : 5,
+ "maxAttempts" : 24,
+ "operation" : "GetResourceRequestStatus",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "ProgressEvent.OperationStatus",
+ "state" : "success",
+ "expected" : "SUCCESS"
+ }, {
+ "matcher" : "path",
+ "argument" : "ProgressEvent.OperationStatus",
+ "state" : "failure",
+ "expected" : "FAILED"
+ }, {
+ "matcher" : "path",
+ "argument" : "ProgressEvent.OperationStatus",
+ "state" : "failure",
+ "expected" : "CANCEL_COMPLETE"
+ } ]
+ }
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2016-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2016-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..2ad4ee63
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2016-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2016-05-10/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2016-05-10/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2016-05-10/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2016-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2016-05-10/paginators-1.json
new file mode 100644
index 00000000..22cc439e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2016-05-10/paginators-1.json
@@ -0,0 +1,100 @@
+{
+ "pagination": {
+ "ListObjectParentPaths": {
+ "result_key": "PathToObjectIdentifiersList",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListFacetNames": {
+ "result_key": "FacetNames",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListPublishedSchemaArns": {
+ "result_key": "SchemaArns",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListDirectories": {
+ "result_key": "Directories",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListDevelopmentSchemaArns": {
+ "result_key": "SchemaArns",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListTypedLinkFacetNames": {
+ "result_key": "FacetNames",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListIndex": {
+ "result_key": "IndexAttachments",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListFacetAttributes": {
+ "result_key": "Attributes",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListObjectPolicies": {
+ "result_key": "AttachedPolicyIds",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListTagsForResource": {
+ "result_key": "Tags",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListAttachedIndices": {
+ "result_key": "IndexAttachments",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "LookupPolicy": {
+ "result_key": "PolicyToPathList",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListPolicyAttachments": {
+ "result_key": "ObjectIdentifiers",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListObjectAttributes": {
+ "result_key": "Attributes",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListAppliedSchemaArns": {
+ "result_key": "SchemaArns",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListTypedLinkFacetAttributes": {
+ "result_key": "Attributes",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2016-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2016-05-10/service-2.json.gz
new file mode 100644
index 00000000..6c8334d9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2016-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2017-01-11/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2017-01-11/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..21ee3a94
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2017-01-11/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2017-01-11/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2017-01-11/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2017-01-11/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2017-01-11/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2017-01-11/paginators-1.json
new file mode 100644
index 00000000..5a06fb0b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2017-01-11/paginators-1.json
@@ -0,0 +1,118 @@
+{
+ "pagination": {
+ "ListObjectParentPaths": {
+ "result_key": "PathToObjectIdentifiersList",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListFacetNames": {
+ "result_key": "FacetNames",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListPublishedSchemaArns": {
+ "result_key": "SchemaArns",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListDirectories": {
+ "result_key": "Directories",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListDevelopmentSchemaArns": {
+ "result_key": "SchemaArns",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListTypedLinkFacetNames": {
+ "result_key": "FacetNames",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListIndex": {
+ "result_key": "IndexAttachments",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListFacetAttributes": {
+ "result_key": "Attributes",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListObjectPolicies": {
+ "result_key": "AttachedPolicyIds",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListTagsForResource": {
+ "result_key": "Tags",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListAttachedIndices": {
+ "result_key": "IndexAttachments",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "LookupPolicy": {
+ "result_key": "PolicyToPathList",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListPolicyAttachments": {
+ "result_key": "ObjectIdentifiers",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListObjectAttributes": {
+ "result_key": "Attributes",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListAppliedSchemaArns": {
+ "result_key": "SchemaArns",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListTypedLinkFacetAttributes": {
+ "result_key": "Attributes",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListIncomingTypedLinks": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LinkSpecifiers"
+ },
+ "ListManagedSchemaArns": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "SchemaArns"
+ },
+ "ListOutgoingTypedLinks": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TypedLinkSpecifiers"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2017-01-11/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2017-01-11/service-2.json.gz
new file mode 100644
index 00000000..df693434
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/clouddirectory/2017-01-11/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudformation/2010-05-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudformation/2010-05-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..6108d20d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudformation/2010-05-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudformation/2010-05-15/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudformation/2010-05-15/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudformation/2010-05-15/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudformation/2010-05-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudformation/2010-05-15/paginators-1.json
new file mode 100644
index 00000000..f7aa541b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudformation/2010-05-15/paginators-1.json
@@ -0,0 +1,136 @@
+{
+ "pagination": {
+ "DescribeAccountLimits": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "AccountLimits"
+ },
+ "DescribeChangeSet": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Changes",
+ "non_aggregate_keys": [
+ "ChangeSetName",
+ "ChangeSetId",
+ "StackId",
+ "StackName",
+ "Description",
+ "Parameters",
+ "CreationTime",
+ "ExecutionStatus",
+ "Status",
+ "StatusReason",
+ "NotificationARNs",
+ "RollbackConfiguration",
+ "Capabilities",
+ "Tags",
+ "ParentChangeSetId",
+ "IncludeNestedStacks",
+ "RootChangeSetId",
+ "OnStackFailure",
+ "ImportExistingResources"
+ ]
+ },
+ "DescribeStackEvents": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "StackEvents"
+ },
+ "DescribeStacks": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Stacks"
+ },
+ "ListChangeSets": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Summaries"
+ },
+ "ListStackInstances": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Summaries"
+ },
+ "ListStackResources": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "StackResourceSummaries"
+ },
+ "ListStacks": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "StackSummaries"
+ },
+ "ListStackSetOperationResults": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Summaries"
+ },
+ "ListStackSetOperations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Summaries"
+ },
+ "ListStackSets": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Summaries"
+ },
+ "ListExports": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Exports"
+ },
+ "ListImports": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Imports"
+ },
+ "ListTypes": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TypeSummaries"
+ },
+ "ListGeneratedTemplates": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Summaries"
+ },
+ "ListResourceScanRelatedResources": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "RelatedResources"
+ },
+ "ListResourceScanResources": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Resources"
+ },
+ "ListResourceScans": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ResourceScanSummaries"
+ },
+ "ListStackRefactorActions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "StackRefactorActions"
+ },
+ "ListStackRefactors": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "StackRefactorSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudformation/2010-05-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudformation/2010-05-15/service-2.json.gz
new file mode 100644
index 00000000..5737145d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudformation/2010-05-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudformation/2010-05-15/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudformation/2010-05-15/waiters-2.json
new file mode 100644
index 00000000..0bfa9b00
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudformation/2010-05-15/waiters-2.json
@@ -0,0 +1,404 @@
+{
+ "version": 2,
+ "waiters": {
+ "StackExists": {
+ "delay": 5,
+ "operation": "DescribeStacks",
+ "maxAttempts": 20,
+ "acceptors": [
+ {
+ "matcher": "status",
+ "expected": 200,
+ "state": "success"
+ },
+ {
+ "matcher": "error",
+ "expected": "ValidationError",
+ "state": "retry"
+ }
+ ]
+ },
+ "StackCreateComplete": {
+ "delay": 30,
+ "operation": "DescribeStacks",
+ "maxAttempts": 120,
+ "description": "Wait until stack status is CREATE_COMPLETE.",
+ "acceptors": [
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "CREATE_COMPLETE",
+ "matcher": "pathAll",
+ "state": "success"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "UPDATE_COMPLETE",
+ "matcher": "pathAll",
+ "state": "success"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "UPDATE_IN_PROGRESS",
+ "matcher": "pathAll",
+ "state": "success"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "UPDATE_COMPLETE_CLEANUP_IN_PROGRESS",
+ "matcher": "pathAll",
+ "state": "success"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "UPDATE_FAILED",
+ "matcher": "pathAll",
+ "state": "success"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "UPDATE_ROLLBACK_IN_PROGRESS",
+ "matcher": "pathAll",
+ "state": "success"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "UPDATE_ROLLBACK_FAILED",
+ "matcher": "pathAll",
+ "state": "success"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS",
+ "matcher": "pathAll",
+ "state": "success"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "UPDATE_ROLLBACK_COMPLETE",
+ "matcher": "pathAll",
+ "state": "success"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "CREATE_FAILED",
+ "matcher": "pathAny",
+ "state": "failure"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "DELETE_COMPLETE",
+ "matcher": "pathAny",
+ "state": "failure"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "DELETE_FAILED",
+ "matcher": "pathAny",
+ "state": "failure"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "ROLLBACK_FAILED",
+ "matcher": "pathAny",
+ "state": "failure"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "ROLLBACK_COMPLETE",
+ "matcher": "pathAny",
+ "state": "failure"
+ },
+ {
+ "expected": "ValidationError",
+ "matcher": "error",
+ "state": "failure"
+ }
+ ]
+ },
+ "StackDeleteComplete": {
+ "delay": 30,
+ "operation": "DescribeStacks",
+ "maxAttempts": 120,
+ "description": "Wait until stack status is DELETE_COMPLETE.",
+ "acceptors": [
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "DELETE_COMPLETE",
+ "matcher": "pathAll",
+ "state": "success"
+ },
+ {
+ "expected": "ValidationError",
+ "matcher": "error",
+ "state": "success"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "DELETE_FAILED",
+ "matcher": "pathAny",
+ "state": "failure"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "CREATE_FAILED",
+ "matcher": "pathAny",
+ "state": "failure"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "ROLLBACK_FAILED",
+ "matcher": "pathAny",
+ "state": "failure"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "UPDATE_ROLLBACK_IN_PROGRESS",
+ "matcher": "pathAny",
+ "state": "failure"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "UPDATE_ROLLBACK_FAILED",
+ "matcher": "pathAny",
+ "state": "failure"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "UPDATE_ROLLBACK_COMPLETE",
+ "matcher": "pathAny",
+ "state": "failure"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "UPDATE_COMPLETE",
+ "matcher": "pathAny",
+ "state": "failure"
+ }
+ ]
+ },
+ "StackUpdateComplete": {
+ "delay": 30,
+ "maxAttempts": 120,
+ "operation": "DescribeStacks",
+ "description": "Wait until stack status is UPDATE_COMPLETE.",
+ "acceptors": [
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "UPDATE_COMPLETE",
+ "matcher": "pathAll",
+ "state": "success"
+ },
+ {
+ "expected": "UPDATE_FAILED",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Stacks[].StackStatus"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "UPDATE_ROLLBACK_FAILED",
+ "matcher": "pathAny",
+ "state": "failure"
+ },
+ {
+ "expected": "UPDATE_ROLLBACK_COMPLETE",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Stacks[].StackStatus"
+ },
+ {
+ "expected": "ValidationError",
+ "matcher": "error",
+ "state": "failure"
+ }
+ ]
+ },
+ "StackImportComplete": {
+ "delay": 30,
+ "maxAttempts": 120,
+ "operation": "DescribeStacks",
+ "description": "Wait until stack status is IMPORT_COMPLETE.",
+ "acceptors": [
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "IMPORT_COMPLETE",
+ "matcher": "pathAll",
+ "state": "success"
+ },
+ {
+ "expected": "ROLLBACK_COMPLETE",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Stacks[].StackStatus"
+ },
+ {
+ "expected": "ROLLBACK_FAILED",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Stacks[].StackStatus"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "IMPORT_ROLLBACK_IN_PROGRESS",
+ "matcher": "pathAny",
+ "state": "failure"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "IMPORT_ROLLBACK_FAILED",
+ "matcher": "pathAny",
+ "state": "failure"
+ },
+ {
+ "expected": "IMPORT_ROLLBACK_COMPLETE",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Stacks[].StackStatus"
+ },
+ {
+ "expected": "ValidationError",
+ "matcher": "error",
+ "state": "failure"
+ }
+ ]
+ },
+ "StackRollbackComplete": {
+ "delay": 30,
+ "operation": "DescribeStacks",
+ "maxAttempts": 120,
+ "description": "Wait until stack status is UPDATE_ROLLBACK_COMPLETE.",
+ "acceptors": [
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "UPDATE_ROLLBACK_COMPLETE",
+ "matcher": "pathAll",
+ "state": "success"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "UPDATE_FAILED",
+ "matcher": "pathAny",
+ "state": "failure"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "UPDATE_ROLLBACK_FAILED",
+ "matcher": "pathAny",
+ "state": "failure"
+ },
+ {
+ "argument": "Stacks[].StackStatus",
+ "expected": "DELETE_FAILED",
+ "matcher": "pathAny",
+ "state": "failure"
+ },
+ {
+ "expected": "ValidationError",
+ "matcher": "error",
+ "state": "failure"
+ }
+ ]
+ },
+ "ChangeSetCreateComplete": {
+ "delay": 30,
+ "operation": "DescribeChangeSet",
+ "maxAttempts": 120,
+ "description": "Wait until change set status is CREATE_COMPLETE.",
+ "acceptors": [
+ {
+ "argument": "Status",
+ "expected": "CREATE_COMPLETE",
+ "matcher": "path",
+ "state": "success"
+ },
+ {
+ "argument": "Status",
+ "expected": "FAILED",
+ "matcher": "path",
+ "state": "failure"
+ },
+ {
+ "expected": "ValidationError",
+ "matcher": "error",
+ "state": "failure"
+ }
+ ]
+ },
+ "StackRefactorCreateComplete": {
+ "delay": 5,
+ "operation": "DescribeStackRefactor",
+ "maxAttempts": 120,
+ "description": "Wait until the stack refactor status is CREATE_COMPLETE.",
+ "acceptors": [
+ {
+ "argument": "Status",
+ "expected": "CREATE_COMPLETE",
+ "matcher": "path",
+ "state": "success"
+ },
+ {
+ "argument": "Status",
+ "expected": "CREATE_FAILED",
+ "matcher": "path",
+ "state": "failure"
+ },
+ {
+ "expected": "ValidationError",
+ "matcher": "error",
+ "state": "failure"
+ }
+ ]
+ },
+ "StackRefactorExecuteComplete": {
+ "delay": 15,
+ "operation": "DescribeStackRefactor",
+ "maxAttempts": 120,
+ "description": "Wait until the stack refactor status is EXECUTE_COMPLETE.",
+ "acceptors": [
+ {
+ "argument": "ExecutionStatus",
+ "expected": "EXECUTE_COMPLETE",
+ "matcher": "path",
+ "state": "success"
+ },
+ {
+ "argument": "ExecutionStatus",
+ "expected": "EXECUTE_FAILED",
+ "matcher": "path",
+ "state": "failure"
+ },
+ {
+ "argument": "ExecutionStatus",
+ "expected": "ROLLBACK_COMPLETE",
+ "matcher": "path",
+ "state": "failure"
+ },
+ {
+ "expected": "ValidationError",
+ "matcher": "error",
+ "state": "failure"
+ }
+ ]
+ },
+ "TypeRegistrationComplete": {
+ "delay": 30,
+ "operation": "DescribeTypeRegistration",
+ "maxAttempts": 120,
+ "description": "Wait until type registration is COMPLETE.",
+ "acceptors": [
+ {
+ "argument": "ProgressStatus",
+ "expected": "COMPLETE",
+ "matcher": "path",
+ "state": "success"
+ },
+ {
+ "argument": "ProgressStatus",
+ "expected": "FAILED",
+ "matcher": "path",
+ "state": "failure"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront-keyvaluestore/2022-07-26/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront-keyvaluestore/2022-07-26/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..4259c972
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront-keyvaluestore/2022-07-26/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront-keyvaluestore/2022-07-26/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront-keyvaluestore/2022-07-26/paginators-1.json
new file mode 100644
index 00000000..8fda57a3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront-keyvaluestore/2022-07-26/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListKeys": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront-keyvaluestore/2022-07-26/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront-keyvaluestore/2022-07-26/service-2.json.gz
new file mode 100644
index 00000000..314b8143
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront-keyvaluestore/2022-07-26/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-05-31/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-05-31/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..28b21e97
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-05-31/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-05-31/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-05-31/paginators-1.json
new file mode 100644
index 00000000..51fbb907
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-05-31/paginators-1.json
@@ -0,0 +1,32 @@
+{
+ "pagination": {
+ "ListCloudFrontOriginAccessIdentities": {
+ "input_token": "Marker",
+ "output_token": "CloudFrontOriginAccessIdentityList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "CloudFrontOriginAccessIdentityList.IsTruncated",
+ "result_key": "CloudFrontOriginAccessIdentityList.Items"
+ },
+ "ListDistributions": {
+ "input_token": "Marker",
+ "output_token": "DistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "DistributionList.IsTruncated",
+ "result_key": "DistributionList.Items"
+ },
+ "ListInvalidations": {
+ "input_token": "Marker",
+ "output_token": "InvalidationList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "InvalidationList.IsTruncated",
+ "result_key": "InvalidationList.Items"
+ },
+ "ListStreamingDistributions": {
+ "input_token": "Marker",
+ "output_token": "StreamingDistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "StreamingDistributionList.IsTruncated",
+ "result_key": "StreamingDistributionList.Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-05-31/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-05-31/service-2.json.gz
new file mode 100644
index 00000000..07d2e774
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-05-31/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-05-31/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-05-31/waiters-2.json
new file mode 100644
index 00000000..6e044bc5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-05-31/waiters-2.json
@@ -0,0 +1,47 @@
+{
+ "version": 2,
+ "waiters": {
+ "DistributionDeployed": {
+ "delay": 60,
+ "operation": "GetDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Distribution.Status"
+ }
+ ]
+ },
+ "InvalidationCompleted": {
+ "delay": 20,
+ "operation": "GetInvalidation",
+ "maxAttempts": 60,
+ "description": "Wait until an invalidation has completed.",
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Invalidation.Status"
+ }
+ ]
+ },
+ "StreamingDistributionDeployed": {
+ "delay": 60,
+ "operation": "GetStreamingDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a streaming distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "StreamingDistribution.Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-10-21/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-10-21/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..28b21e97
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-10-21/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-10-21/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-10-21/paginators-1.json
new file mode 100644
index 00000000..51fbb907
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-10-21/paginators-1.json
@@ -0,0 +1,32 @@
+{
+ "pagination": {
+ "ListCloudFrontOriginAccessIdentities": {
+ "input_token": "Marker",
+ "output_token": "CloudFrontOriginAccessIdentityList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "CloudFrontOriginAccessIdentityList.IsTruncated",
+ "result_key": "CloudFrontOriginAccessIdentityList.Items"
+ },
+ "ListDistributions": {
+ "input_token": "Marker",
+ "output_token": "DistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "DistributionList.IsTruncated",
+ "result_key": "DistributionList.Items"
+ },
+ "ListInvalidations": {
+ "input_token": "Marker",
+ "output_token": "InvalidationList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "InvalidationList.IsTruncated",
+ "result_key": "InvalidationList.Items"
+ },
+ "ListStreamingDistributions": {
+ "input_token": "Marker",
+ "output_token": "StreamingDistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "StreamingDistributionList.IsTruncated",
+ "result_key": "StreamingDistributionList.Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-10-21/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-10-21/service-2.json.gz
new file mode 100644
index 00000000..dd84a5d6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-10-21/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-10-21/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-10-21/waiters-2.json
new file mode 100644
index 00000000..6e044bc5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-10-21/waiters-2.json
@@ -0,0 +1,47 @@
+{
+ "version": 2,
+ "waiters": {
+ "DistributionDeployed": {
+ "delay": 60,
+ "operation": "GetDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Distribution.Status"
+ }
+ ]
+ },
+ "InvalidationCompleted": {
+ "delay": 20,
+ "operation": "GetInvalidation",
+ "maxAttempts": 60,
+ "description": "Wait until an invalidation has completed.",
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Invalidation.Status"
+ }
+ ]
+ },
+ "StreamingDistributionDeployed": {
+ "delay": 60,
+ "operation": "GetStreamingDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a streaming distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "StreamingDistribution.Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-11-06/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-11-06/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..28b21e97
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-11-06/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-11-06/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-11-06/paginators-1.json
new file mode 100644
index 00000000..51fbb907
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-11-06/paginators-1.json
@@ -0,0 +1,32 @@
+{
+ "pagination": {
+ "ListCloudFrontOriginAccessIdentities": {
+ "input_token": "Marker",
+ "output_token": "CloudFrontOriginAccessIdentityList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "CloudFrontOriginAccessIdentityList.IsTruncated",
+ "result_key": "CloudFrontOriginAccessIdentityList.Items"
+ },
+ "ListDistributions": {
+ "input_token": "Marker",
+ "output_token": "DistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "DistributionList.IsTruncated",
+ "result_key": "DistributionList.Items"
+ },
+ "ListInvalidations": {
+ "input_token": "Marker",
+ "output_token": "InvalidationList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "InvalidationList.IsTruncated",
+ "result_key": "InvalidationList.Items"
+ },
+ "ListStreamingDistributions": {
+ "input_token": "Marker",
+ "output_token": "StreamingDistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "StreamingDistributionList.IsTruncated",
+ "result_key": "StreamingDistributionList.Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-11-06/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-11-06/service-2.json.gz
new file mode 100644
index 00000000..ae4cd73e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-11-06/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-11-06/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-11-06/waiters-2.json
new file mode 100644
index 00000000..6e044bc5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2014-11-06/waiters-2.json
@@ -0,0 +1,47 @@
+{
+ "version": 2,
+ "waiters": {
+ "DistributionDeployed": {
+ "delay": 60,
+ "operation": "GetDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Distribution.Status"
+ }
+ ]
+ },
+ "InvalidationCompleted": {
+ "delay": 20,
+ "operation": "GetInvalidation",
+ "maxAttempts": 60,
+ "description": "Wait until an invalidation has completed.",
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Invalidation.Status"
+ }
+ ]
+ },
+ "StreamingDistributionDeployed": {
+ "delay": 60,
+ "operation": "GetStreamingDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a streaming distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "StreamingDistribution.Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-04-17/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-04-17/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..28b21e97
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-04-17/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-04-17/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-04-17/paginators-1.json
new file mode 100644
index 00000000..51fbb907
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-04-17/paginators-1.json
@@ -0,0 +1,32 @@
+{
+ "pagination": {
+ "ListCloudFrontOriginAccessIdentities": {
+ "input_token": "Marker",
+ "output_token": "CloudFrontOriginAccessIdentityList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "CloudFrontOriginAccessIdentityList.IsTruncated",
+ "result_key": "CloudFrontOriginAccessIdentityList.Items"
+ },
+ "ListDistributions": {
+ "input_token": "Marker",
+ "output_token": "DistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "DistributionList.IsTruncated",
+ "result_key": "DistributionList.Items"
+ },
+ "ListInvalidations": {
+ "input_token": "Marker",
+ "output_token": "InvalidationList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "InvalidationList.IsTruncated",
+ "result_key": "InvalidationList.Items"
+ },
+ "ListStreamingDistributions": {
+ "input_token": "Marker",
+ "output_token": "StreamingDistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "StreamingDistributionList.IsTruncated",
+ "result_key": "StreamingDistributionList.Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-04-17/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-04-17/service-2.json.gz
new file mode 100644
index 00000000..cb6d2d25
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-04-17/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-04-17/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-04-17/waiters-2.json
new file mode 100644
index 00000000..6e044bc5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-04-17/waiters-2.json
@@ -0,0 +1,47 @@
+{
+ "version": 2,
+ "waiters": {
+ "DistributionDeployed": {
+ "delay": 60,
+ "operation": "GetDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Distribution.Status"
+ }
+ ]
+ },
+ "InvalidationCompleted": {
+ "delay": 20,
+ "operation": "GetInvalidation",
+ "maxAttempts": 60,
+ "description": "Wait until an invalidation has completed.",
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Invalidation.Status"
+ }
+ ]
+ },
+ "StreamingDistributionDeployed": {
+ "delay": 60,
+ "operation": "GetStreamingDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a streaming distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "StreamingDistribution.Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-07-27/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-07-27/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..28b21e97
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-07-27/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-07-27/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-07-27/paginators-1.json
new file mode 100644
index 00000000..51fbb907
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-07-27/paginators-1.json
@@ -0,0 +1,32 @@
+{
+ "pagination": {
+ "ListCloudFrontOriginAccessIdentities": {
+ "input_token": "Marker",
+ "output_token": "CloudFrontOriginAccessIdentityList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "CloudFrontOriginAccessIdentityList.IsTruncated",
+ "result_key": "CloudFrontOriginAccessIdentityList.Items"
+ },
+ "ListDistributions": {
+ "input_token": "Marker",
+ "output_token": "DistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "DistributionList.IsTruncated",
+ "result_key": "DistributionList.Items"
+ },
+ "ListInvalidations": {
+ "input_token": "Marker",
+ "output_token": "InvalidationList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "InvalidationList.IsTruncated",
+ "result_key": "InvalidationList.Items"
+ },
+ "ListStreamingDistributions": {
+ "input_token": "Marker",
+ "output_token": "StreamingDistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "StreamingDistributionList.IsTruncated",
+ "result_key": "StreamingDistributionList.Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-07-27/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-07-27/service-2.json.gz
new file mode 100644
index 00000000..bde1a302
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-07-27/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-07-27/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-07-27/waiters-2.json
new file mode 100644
index 00000000..6e044bc5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-07-27/waiters-2.json
@@ -0,0 +1,47 @@
+{
+ "version": 2,
+ "waiters": {
+ "DistributionDeployed": {
+ "delay": 60,
+ "operation": "GetDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Distribution.Status"
+ }
+ ]
+ },
+ "InvalidationCompleted": {
+ "delay": 20,
+ "operation": "GetInvalidation",
+ "maxAttempts": 60,
+ "description": "Wait until an invalidation has completed.",
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Invalidation.Status"
+ }
+ ]
+ },
+ "StreamingDistributionDeployed": {
+ "delay": 60,
+ "operation": "GetStreamingDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a streaming distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "StreamingDistribution.Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-09-17/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-09-17/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..28b21e97
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-09-17/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-09-17/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-09-17/paginators-1.json
new file mode 100644
index 00000000..51fbb907
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-09-17/paginators-1.json
@@ -0,0 +1,32 @@
+{
+ "pagination": {
+ "ListCloudFrontOriginAccessIdentities": {
+ "input_token": "Marker",
+ "output_token": "CloudFrontOriginAccessIdentityList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "CloudFrontOriginAccessIdentityList.IsTruncated",
+ "result_key": "CloudFrontOriginAccessIdentityList.Items"
+ },
+ "ListDistributions": {
+ "input_token": "Marker",
+ "output_token": "DistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "DistributionList.IsTruncated",
+ "result_key": "DistributionList.Items"
+ },
+ "ListInvalidations": {
+ "input_token": "Marker",
+ "output_token": "InvalidationList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "InvalidationList.IsTruncated",
+ "result_key": "InvalidationList.Items"
+ },
+ "ListStreamingDistributions": {
+ "input_token": "Marker",
+ "output_token": "StreamingDistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "StreamingDistributionList.IsTruncated",
+ "result_key": "StreamingDistributionList.Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-09-17/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-09-17/service-2.json.gz
new file mode 100644
index 00000000..28797fda
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-09-17/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-09-17/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-09-17/waiters-2.json
new file mode 100644
index 00000000..6e044bc5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2015-09-17/waiters-2.json
@@ -0,0 +1,47 @@
+{
+ "version": 2,
+ "waiters": {
+ "DistributionDeployed": {
+ "delay": 60,
+ "operation": "GetDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Distribution.Status"
+ }
+ ]
+ },
+ "InvalidationCompleted": {
+ "delay": 20,
+ "operation": "GetInvalidation",
+ "maxAttempts": 60,
+ "description": "Wait until an invalidation has completed.",
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Invalidation.Status"
+ }
+ ]
+ },
+ "StreamingDistributionDeployed": {
+ "delay": 60,
+ "operation": "GetStreamingDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a streaming distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "StreamingDistribution.Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-13/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-13/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..28b21e97
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-13/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-13/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-13/paginators-1.json
new file mode 100644
index 00000000..51fbb907
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-13/paginators-1.json
@@ -0,0 +1,32 @@
+{
+ "pagination": {
+ "ListCloudFrontOriginAccessIdentities": {
+ "input_token": "Marker",
+ "output_token": "CloudFrontOriginAccessIdentityList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "CloudFrontOriginAccessIdentityList.IsTruncated",
+ "result_key": "CloudFrontOriginAccessIdentityList.Items"
+ },
+ "ListDistributions": {
+ "input_token": "Marker",
+ "output_token": "DistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "DistributionList.IsTruncated",
+ "result_key": "DistributionList.Items"
+ },
+ "ListInvalidations": {
+ "input_token": "Marker",
+ "output_token": "InvalidationList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "InvalidationList.IsTruncated",
+ "result_key": "InvalidationList.Items"
+ },
+ "ListStreamingDistributions": {
+ "input_token": "Marker",
+ "output_token": "StreamingDistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "StreamingDistributionList.IsTruncated",
+ "result_key": "StreamingDistributionList.Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-13/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-13/service-2.json.gz
new file mode 100644
index 00000000..1240ca91
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-13/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-13/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-13/waiters-2.json
new file mode 100644
index 00000000..6e044bc5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-13/waiters-2.json
@@ -0,0 +1,47 @@
+{
+ "version": 2,
+ "waiters": {
+ "DistributionDeployed": {
+ "delay": 60,
+ "operation": "GetDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Distribution.Status"
+ }
+ ]
+ },
+ "InvalidationCompleted": {
+ "delay": 20,
+ "operation": "GetInvalidation",
+ "maxAttempts": 60,
+ "description": "Wait until an invalidation has completed.",
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Invalidation.Status"
+ }
+ ]
+ },
+ "StreamingDistributionDeployed": {
+ "delay": 60,
+ "operation": "GetStreamingDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a streaming distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "StreamingDistribution.Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-28/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-28/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..17ee2644
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-28/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-28/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-28/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-28/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-28/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-28/paginators-1.json
new file mode 100644
index 00000000..51fbb907
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-28/paginators-1.json
@@ -0,0 +1,32 @@
+{
+ "pagination": {
+ "ListCloudFrontOriginAccessIdentities": {
+ "input_token": "Marker",
+ "output_token": "CloudFrontOriginAccessIdentityList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "CloudFrontOriginAccessIdentityList.IsTruncated",
+ "result_key": "CloudFrontOriginAccessIdentityList.Items"
+ },
+ "ListDistributions": {
+ "input_token": "Marker",
+ "output_token": "DistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "DistributionList.IsTruncated",
+ "result_key": "DistributionList.Items"
+ },
+ "ListInvalidations": {
+ "input_token": "Marker",
+ "output_token": "InvalidationList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "InvalidationList.IsTruncated",
+ "result_key": "InvalidationList.Items"
+ },
+ "ListStreamingDistributions": {
+ "input_token": "Marker",
+ "output_token": "StreamingDistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "StreamingDistributionList.IsTruncated",
+ "result_key": "StreamingDistributionList.Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-28/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-28/service-2.json.gz
new file mode 100644
index 00000000..a227abb2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-28/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-28/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-28/waiters-2.json
new file mode 100644
index 00000000..6e044bc5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-01-28/waiters-2.json
@@ -0,0 +1,47 @@
+{
+ "version": 2,
+ "waiters": {
+ "DistributionDeployed": {
+ "delay": 60,
+ "operation": "GetDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Distribution.Status"
+ }
+ ]
+ },
+ "InvalidationCompleted": {
+ "delay": 20,
+ "operation": "GetInvalidation",
+ "maxAttempts": 60,
+ "description": "Wait until an invalidation has completed.",
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Invalidation.Status"
+ }
+ ]
+ },
+ "StreamingDistributionDeployed": {
+ "delay": 60,
+ "operation": "GetStreamingDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a streaming distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "StreamingDistribution.Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..17ee2644
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-01/paginators-1.json
new file mode 100644
index 00000000..51fbb907
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-01/paginators-1.json
@@ -0,0 +1,32 @@
+{
+ "pagination": {
+ "ListCloudFrontOriginAccessIdentities": {
+ "input_token": "Marker",
+ "output_token": "CloudFrontOriginAccessIdentityList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "CloudFrontOriginAccessIdentityList.IsTruncated",
+ "result_key": "CloudFrontOriginAccessIdentityList.Items"
+ },
+ "ListDistributions": {
+ "input_token": "Marker",
+ "output_token": "DistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "DistributionList.IsTruncated",
+ "result_key": "DistributionList.Items"
+ },
+ "ListInvalidations": {
+ "input_token": "Marker",
+ "output_token": "InvalidationList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "InvalidationList.IsTruncated",
+ "result_key": "InvalidationList.Items"
+ },
+ "ListStreamingDistributions": {
+ "input_token": "Marker",
+ "output_token": "StreamingDistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "StreamingDistributionList.IsTruncated",
+ "result_key": "StreamingDistributionList.Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-01/service-2.json.gz
new file mode 100644
index 00000000..c451558c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-01/waiters-2.json
new file mode 100644
index 00000000..6e044bc5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-01/waiters-2.json
@@ -0,0 +1,47 @@
+{
+ "version": 2,
+ "waiters": {
+ "DistributionDeployed": {
+ "delay": 60,
+ "operation": "GetDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Distribution.Status"
+ }
+ ]
+ },
+ "InvalidationCompleted": {
+ "delay": 20,
+ "operation": "GetInvalidation",
+ "maxAttempts": 60,
+ "description": "Wait until an invalidation has completed.",
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Invalidation.Status"
+ }
+ ]
+ },
+ "StreamingDistributionDeployed": {
+ "delay": 60,
+ "operation": "GetStreamingDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a streaming distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "StreamingDistribution.Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-20/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-20/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..17ee2644
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-20/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-20/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-20/paginators-1.json
new file mode 100644
index 00000000..51fbb907
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-20/paginators-1.json
@@ -0,0 +1,32 @@
+{
+ "pagination": {
+ "ListCloudFrontOriginAccessIdentities": {
+ "input_token": "Marker",
+ "output_token": "CloudFrontOriginAccessIdentityList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "CloudFrontOriginAccessIdentityList.IsTruncated",
+ "result_key": "CloudFrontOriginAccessIdentityList.Items"
+ },
+ "ListDistributions": {
+ "input_token": "Marker",
+ "output_token": "DistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "DistributionList.IsTruncated",
+ "result_key": "DistributionList.Items"
+ },
+ "ListInvalidations": {
+ "input_token": "Marker",
+ "output_token": "InvalidationList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "InvalidationList.IsTruncated",
+ "result_key": "InvalidationList.Items"
+ },
+ "ListStreamingDistributions": {
+ "input_token": "Marker",
+ "output_token": "StreamingDistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "StreamingDistributionList.IsTruncated",
+ "result_key": "StreamingDistributionList.Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-20/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-20/service-2.json.gz
new file mode 100644
index 00000000..70f8669a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-20/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-20/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-20/waiters-2.json
new file mode 100644
index 00000000..6e044bc5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-08-20/waiters-2.json
@@ -0,0 +1,47 @@
+{
+ "version": 2,
+ "waiters": {
+ "DistributionDeployed": {
+ "delay": 60,
+ "operation": "GetDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Distribution.Status"
+ }
+ ]
+ },
+ "InvalidationCompleted": {
+ "delay": 20,
+ "operation": "GetInvalidation",
+ "maxAttempts": 60,
+ "description": "Wait until an invalidation has completed.",
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Invalidation.Status"
+ }
+ ]
+ },
+ "StreamingDistributionDeployed": {
+ "delay": 60,
+ "operation": "GetStreamingDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a streaming distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "StreamingDistribution.Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-07/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-07/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..17ee2644
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-07/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-07/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-07/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-07/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-07/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-07/paginators-1.json
new file mode 100644
index 00000000..51fbb907
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-07/paginators-1.json
@@ -0,0 +1,32 @@
+{
+ "pagination": {
+ "ListCloudFrontOriginAccessIdentities": {
+ "input_token": "Marker",
+ "output_token": "CloudFrontOriginAccessIdentityList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "CloudFrontOriginAccessIdentityList.IsTruncated",
+ "result_key": "CloudFrontOriginAccessIdentityList.Items"
+ },
+ "ListDistributions": {
+ "input_token": "Marker",
+ "output_token": "DistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "DistributionList.IsTruncated",
+ "result_key": "DistributionList.Items"
+ },
+ "ListInvalidations": {
+ "input_token": "Marker",
+ "output_token": "InvalidationList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "InvalidationList.IsTruncated",
+ "result_key": "InvalidationList.Items"
+ },
+ "ListStreamingDistributions": {
+ "input_token": "Marker",
+ "output_token": "StreamingDistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "StreamingDistributionList.IsTruncated",
+ "result_key": "StreamingDistributionList.Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-07/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-07/service-2.json.gz
new file mode 100644
index 00000000..f67576c9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-07/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-07/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-07/waiters-2.json
new file mode 100644
index 00000000..6e044bc5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-07/waiters-2.json
@@ -0,0 +1,47 @@
+{
+ "version": 2,
+ "waiters": {
+ "DistributionDeployed": {
+ "delay": 60,
+ "operation": "GetDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Distribution.Status"
+ }
+ ]
+ },
+ "InvalidationCompleted": {
+ "delay": 20,
+ "operation": "GetInvalidation",
+ "maxAttempts": 60,
+ "description": "Wait until an invalidation has completed.",
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Invalidation.Status"
+ }
+ ]
+ },
+ "StreamingDistributionDeployed": {
+ "delay": 60,
+ "operation": "GetStreamingDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a streaming distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "StreamingDistribution.Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-29/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-29/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..17ee2644
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-29/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-29/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-29/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-29/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-29/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-29/paginators-1.json
new file mode 100644
index 00000000..51fbb907
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-29/paginators-1.json
@@ -0,0 +1,32 @@
+{
+ "pagination": {
+ "ListCloudFrontOriginAccessIdentities": {
+ "input_token": "Marker",
+ "output_token": "CloudFrontOriginAccessIdentityList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "CloudFrontOriginAccessIdentityList.IsTruncated",
+ "result_key": "CloudFrontOriginAccessIdentityList.Items"
+ },
+ "ListDistributions": {
+ "input_token": "Marker",
+ "output_token": "DistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "DistributionList.IsTruncated",
+ "result_key": "DistributionList.Items"
+ },
+ "ListInvalidations": {
+ "input_token": "Marker",
+ "output_token": "InvalidationList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "InvalidationList.IsTruncated",
+ "result_key": "InvalidationList.Items"
+ },
+ "ListStreamingDistributions": {
+ "input_token": "Marker",
+ "output_token": "StreamingDistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "StreamingDistributionList.IsTruncated",
+ "result_key": "StreamingDistributionList.Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-29/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-29/service-2.json.gz
new file mode 100644
index 00000000..68a9c6fe
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-29/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-29/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-29/waiters-2.json
new file mode 100644
index 00000000..6e044bc5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-09-29/waiters-2.json
@@ -0,0 +1,47 @@
+{
+ "version": 2,
+ "waiters": {
+ "DistributionDeployed": {
+ "delay": 60,
+ "operation": "GetDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Distribution.Status"
+ }
+ ]
+ },
+ "InvalidationCompleted": {
+ "delay": 20,
+ "operation": "GetInvalidation",
+ "maxAttempts": 60,
+ "description": "Wait until an invalidation has completed.",
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Invalidation.Status"
+ }
+ ]
+ },
+ "StreamingDistributionDeployed": {
+ "delay": 60,
+ "operation": "GetStreamingDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a streaming distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "StreamingDistribution.Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-11-25/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-11-25/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..17ee2644
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-11-25/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-11-25/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-11-25/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-11-25/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-11-25/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-11-25/paginators-1.json
new file mode 100644
index 00000000..51fbb907
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-11-25/paginators-1.json
@@ -0,0 +1,32 @@
+{
+ "pagination": {
+ "ListCloudFrontOriginAccessIdentities": {
+ "input_token": "Marker",
+ "output_token": "CloudFrontOriginAccessIdentityList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "CloudFrontOriginAccessIdentityList.IsTruncated",
+ "result_key": "CloudFrontOriginAccessIdentityList.Items"
+ },
+ "ListDistributions": {
+ "input_token": "Marker",
+ "output_token": "DistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "DistributionList.IsTruncated",
+ "result_key": "DistributionList.Items"
+ },
+ "ListInvalidations": {
+ "input_token": "Marker",
+ "output_token": "InvalidationList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "InvalidationList.IsTruncated",
+ "result_key": "InvalidationList.Items"
+ },
+ "ListStreamingDistributions": {
+ "input_token": "Marker",
+ "output_token": "StreamingDistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "StreamingDistributionList.IsTruncated",
+ "result_key": "StreamingDistributionList.Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-11-25/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-11-25/service-2.json.gz
new file mode 100644
index 00000000..90761a2b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-11-25/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-11-25/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-11-25/waiters-2.json
new file mode 100644
index 00000000..6e044bc5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2016-11-25/waiters-2.json
@@ -0,0 +1,47 @@
+{
+ "version": 2,
+ "waiters": {
+ "DistributionDeployed": {
+ "delay": 60,
+ "operation": "GetDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Distribution.Status"
+ }
+ ]
+ },
+ "InvalidationCompleted": {
+ "delay": 20,
+ "operation": "GetInvalidation",
+ "maxAttempts": 60,
+ "description": "Wait until an invalidation has completed.",
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Invalidation.Status"
+ }
+ ]
+ },
+ "StreamingDistributionDeployed": {
+ "delay": 60,
+ "operation": "GetStreamingDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a streaming distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "StreamingDistribution.Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-03-25/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-03-25/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..17ee2644
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-03-25/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-03-25/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-03-25/paginators-1.json
new file mode 100644
index 00000000..51fbb907
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-03-25/paginators-1.json
@@ -0,0 +1,32 @@
+{
+ "pagination": {
+ "ListCloudFrontOriginAccessIdentities": {
+ "input_token": "Marker",
+ "output_token": "CloudFrontOriginAccessIdentityList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "CloudFrontOriginAccessIdentityList.IsTruncated",
+ "result_key": "CloudFrontOriginAccessIdentityList.Items"
+ },
+ "ListDistributions": {
+ "input_token": "Marker",
+ "output_token": "DistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "DistributionList.IsTruncated",
+ "result_key": "DistributionList.Items"
+ },
+ "ListInvalidations": {
+ "input_token": "Marker",
+ "output_token": "InvalidationList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "InvalidationList.IsTruncated",
+ "result_key": "InvalidationList.Items"
+ },
+ "ListStreamingDistributions": {
+ "input_token": "Marker",
+ "output_token": "StreamingDistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "StreamingDistributionList.IsTruncated",
+ "result_key": "StreamingDistributionList.Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-03-25/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-03-25/service-2.json.gz
new file mode 100644
index 00000000..419670d8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-03-25/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-03-25/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-03-25/waiters-2.json
new file mode 100644
index 00000000..edd74b2a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-03-25/waiters-2.json
@@ -0,0 +1,47 @@
+{
+ "version": 2,
+ "waiters": {
+ "DistributionDeployed": {
+ "delay": 60,
+ "operation": "GetDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Distribution.Status"
+ }
+ ]
+ },
+ "InvalidationCompleted": {
+ "delay": 20,
+ "operation": "GetInvalidation",
+ "maxAttempts": 30,
+ "description": "Wait until an invalidation has completed.",
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Invalidation.Status"
+ }
+ ]
+ },
+ "StreamingDistributionDeployed": {
+ "delay": 60,
+ "operation": "GetStreamingDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a streaming distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "StreamingDistribution.Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-10-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-10-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..17ee2644
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-10-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-10-30/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-10-30/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-10-30/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-10-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-10-30/paginators-1.json
new file mode 100644
index 00000000..51fbb907
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-10-30/paginators-1.json
@@ -0,0 +1,32 @@
+{
+ "pagination": {
+ "ListCloudFrontOriginAccessIdentities": {
+ "input_token": "Marker",
+ "output_token": "CloudFrontOriginAccessIdentityList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "CloudFrontOriginAccessIdentityList.IsTruncated",
+ "result_key": "CloudFrontOriginAccessIdentityList.Items"
+ },
+ "ListDistributions": {
+ "input_token": "Marker",
+ "output_token": "DistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "DistributionList.IsTruncated",
+ "result_key": "DistributionList.Items"
+ },
+ "ListInvalidations": {
+ "input_token": "Marker",
+ "output_token": "InvalidationList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "InvalidationList.IsTruncated",
+ "result_key": "InvalidationList.Items"
+ },
+ "ListStreamingDistributions": {
+ "input_token": "Marker",
+ "output_token": "StreamingDistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "StreamingDistributionList.IsTruncated",
+ "result_key": "StreamingDistributionList.Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-10-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-10-30/service-2.json.gz
new file mode 100644
index 00000000..c3065360
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-10-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-10-30/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-10-30/waiters-2.json
new file mode 100644
index 00000000..edd74b2a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2017-10-30/waiters-2.json
@@ -0,0 +1,47 @@
+{
+ "version": 2,
+ "waiters": {
+ "DistributionDeployed": {
+ "delay": 60,
+ "operation": "GetDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Distribution.Status"
+ }
+ ]
+ },
+ "InvalidationCompleted": {
+ "delay": 20,
+ "operation": "GetInvalidation",
+ "maxAttempts": 30,
+ "description": "Wait until an invalidation has completed.",
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Invalidation.Status"
+ }
+ ]
+ },
+ "StreamingDistributionDeployed": {
+ "delay": 60,
+ "operation": "GetStreamingDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a streaming distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "StreamingDistribution.Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-06-18/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-06-18/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..17ee2644
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-06-18/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-06-18/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-06-18/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-06-18/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-06-18/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-06-18/paginators-1.json
new file mode 100644
index 00000000..51fbb907
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-06-18/paginators-1.json
@@ -0,0 +1,32 @@
+{
+ "pagination": {
+ "ListCloudFrontOriginAccessIdentities": {
+ "input_token": "Marker",
+ "output_token": "CloudFrontOriginAccessIdentityList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "CloudFrontOriginAccessIdentityList.IsTruncated",
+ "result_key": "CloudFrontOriginAccessIdentityList.Items"
+ },
+ "ListDistributions": {
+ "input_token": "Marker",
+ "output_token": "DistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "DistributionList.IsTruncated",
+ "result_key": "DistributionList.Items"
+ },
+ "ListInvalidations": {
+ "input_token": "Marker",
+ "output_token": "InvalidationList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "InvalidationList.IsTruncated",
+ "result_key": "InvalidationList.Items"
+ },
+ "ListStreamingDistributions": {
+ "input_token": "Marker",
+ "output_token": "StreamingDistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "StreamingDistributionList.IsTruncated",
+ "result_key": "StreamingDistributionList.Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-06-18/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-06-18/service-2.json.gz
new file mode 100644
index 00000000..58eb5791
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-06-18/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-06-18/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-06-18/waiters-2.json
new file mode 100644
index 00000000..edd74b2a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-06-18/waiters-2.json
@@ -0,0 +1,47 @@
+{
+ "version": 2,
+ "waiters": {
+ "DistributionDeployed": {
+ "delay": 60,
+ "operation": "GetDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Distribution.Status"
+ }
+ ]
+ },
+ "InvalidationCompleted": {
+ "delay": 20,
+ "operation": "GetInvalidation",
+ "maxAttempts": 30,
+ "description": "Wait until an invalidation has completed.",
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Invalidation.Status"
+ }
+ ]
+ },
+ "StreamingDistributionDeployed": {
+ "delay": 60,
+ "operation": "GetStreamingDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a streaming distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "StreamingDistribution.Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-11-05/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-11-05/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..17ee2644
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-11-05/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-11-05/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-11-05/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-11-05/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-11-05/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-11-05/paginators-1.json
new file mode 100644
index 00000000..51fbb907
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-11-05/paginators-1.json
@@ -0,0 +1,32 @@
+{
+ "pagination": {
+ "ListCloudFrontOriginAccessIdentities": {
+ "input_token": "Marker",
+ "output_token": "CloudFrontOriginAccessIdentityList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "CloudFrontOriginAccessIdentityList.IsTruncated",
+ "result_key": "CloudFrontOriginAccessIdentityList.Items"
+ },
+ "ListDistributions": {
+ "input_token": "Marker",
+ "output_token": "DistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "DistributionList.IsTruncated",
+ "result_key": "DistributionList.Items"
+ },
+ "ListInvalidations": {
+ "input_token": "Marker",
+ "output_token": "InvalidationList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "InvalidationList.IsTruncated",
+ "result_key": "InvalidationList.Items"
+ },
+ "ListStreamingDistributions": {
+ "input_token": "Marker",
+ "output_token": "StreamingDistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "StreamingDistributionList.IsTruncated",
+ "result_key": "StreamingDistributionList.Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-11-05/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-11-05/service-2.json.gz
new file mode 100644
index 00000000..3f24f6d1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-11-05/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-11-05/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-11-05/waiters-2.json
new file mode 100644
index 00000000..edd74b2a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2018-11-05/waiters-2.json
@@ -0,0 +1,47 @@
+{
+ "version": 2,
+ "waiters": {
+ "DistributionDeployed": {
+ "delay": 60,
+ "operation": "GetDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Distribution.Status"
+ }
+ ]
+ },
+ "InvalidationCompleted": {
+ "delay": 20,
+ "operation": "GetInvalidation",
+ "maxAttempts": 30,
+ "description": "Wait until an invalidation has completed.",
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Invalidation.Status"
+ }
+ ]
+ },
+ "StreamingDistributionDeployed": {
+ "delay": 60,
+ "operation": "GetStreamingDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a streaming distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "StreamingDistribution.Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2019-03-26/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2019-03-26/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..17ee2644
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2019-03-26/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2019-03-26/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2019-03-26/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2019-03-26/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2019-03-26/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2019-03-26/paginators-1.json
new file mode 100644
index 00000000..51fbb907
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2019-03-26/paginators-1.json
@@ -0,0 +1,32 @@
+{
+ "pagination": {
+ "ListCloudFrontOriginAccessIdentities": {
+ "input_token": "Marker",
+ "output_token": "CloudFrontOriginAccessIdentityList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "CloudFrontOriginAccessIdentityList.IsTruncated",
+ "result_key": "CloudFrontOriginAccessIdentityList.Items"
+ },
+ "ListDistributions": {
+ "input_token": "Marker",
+ "output_token": "DistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "DistributionList.IsTruncated",
+ "result_key": "DistributionList.Items"
+ },
+ "ListInvalidations": {
+ "input_token": "Marker",
+ "output_token": "InvalidationList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "InvalidationList.IsTruncated",
+ "result_key": "InvalidationList.Items"
+ },
+ "ListStreamingDistributions": {
+ "input_token": "Marker",
+ "output_token": "StreamingDistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "StreamingDistributionList.IsTruncated",
+ "result_key": "StreamingDistributionList.Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2019-03-26/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2019-03-26/service-2.json.gz
new file mode 100644
index 00000000..4cf9f547
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2019-03-26/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2019-03-26/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2019-03-26/waiters-2.json
new file mode 100644
index 00000000..95f0a2dd
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2019-03-26/waiters-2.json
@@ -0,0 +1,47 @@
+{
+ "version": 2,
+ "waiters": {
+ "DistributionDeployed": {
+ "delay": 60,
+ "operation": "GetDistribution",
+ "maxAttempts": 35,
+ "description": "Wait until a distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Distribution.Status"
+ }
+ ]
+ },
+ "InvalidationCompleted": {
+ "delay": 20,
+ "operation": "GetInvalidation",
+ "maxAttempts": 30,
+ "description": "Wait until an invalidation has completed.",
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Invalidation.Status"
+ }
+ ]
+ },
+ "StreamingDistributionDeployed": {
+ "delay": 60,
+ "operation": "GetStreamingDistribution",
+ "maxAttempts": 25,
+ "description": "Wait until a streaming distribution is deployed.",
+ "acceptors": [
+ {
+ "expected": "Deployed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "StreamingDistribution.Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2020-05-31/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2020-05-31/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b43ad5ce
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2020-05-31/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2020-05-31/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2020-05-31/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2020-05-31/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2020-05-31/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2020-05-31/paginators-1.json
new file mode 100644
index 00000000..f83b5884
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2020-05-31/paginators-1.json
@@ -0,0 +1,44 @@
+{
+ "pagination": {
+ "ListCloudFrontOriginAccessIdentities": {
+ "input_token": "Marker",
+ "output_token": "CloudFrontOriginAccessIdentityList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "CloudFrontOriginAccessIdentityList.IsTruncated",
+ "result_key": "CloudFrontOriginAccessIdentityList.Items"
+ },
+ "ListDistributions": {
+ "input_token": "Marker",
+ "output_token": "DistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "DistributionList.IsTruncated",
+ "result_key": "DistributionList.Items"
+ },
+ "ListInvalidations": {
+ "input_token": "Marker",
+ "output_token": "InvalidationList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "InvalidationList.IsTruncated",
+ "result_key": "InvalidationList.Items"
+ },
+ "ListStreamingDistributions": {
+ "input_token": "Marker",
+ "output_token": "StreamingDistributionList.NextMarker",
+ "limit_key": "MaxItems",
+ "more_results": "StreamingDistributionList.IsTruncated",
+ "result_key": "StreamingDistributionList.Items"
+ },
+ "ListKeyValueStores": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "output_token": "KeyValueStoreList.NextMarker",
+ "result_key": "KeyValueStoreList.Items"
+ },
+ "ListPublicKeys": {
+ "input_token": "Marker",
+ "output_token": "PublicKeyList.NextMarker",
+ "limit_key": "MaxItems",
+ "result_key": "PublicKeyList.Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2020-05-31/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2020-05-31/service-2.json.gz
new file mode 100644
index 00000000..a4135b0c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2020-05-31/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2020-05-31/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2020-05-31/waiters-2.json
new file mode 100644
index 00000000..4d238cb1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudfront/2020-05-31/waiters-2.json
@@ -0,0 +1,41 @@
+{
+ "version" : 2,
+ "waiters" : {
+ "DistributionDeployed" : {
+ "description" : "Wait until a distribution is deployed.",
+ "delay" : 60,
+ "maxAttempts" : 35,
+ "operation" : "GetDistribution",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "Distribution.Status",
+ "state" : "success",
+ "expected" : "Deployed"
+ } ]
+ },
+ "InvalidationCompleted" : {
+ "description" : "Wait until an invalidation has completed.",
+ "delay" : 20,
+ "maxAttempts" : 30,
+ "operation" : "GetInvalidation",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "Invalidation.Status",
+ "state" : "success",
+ "expected" : "Completed"
+ } ]
+ },
+ "StreamingDistributionDeployed" : {
+ "description" : "Wait until a streaming distribution is deployed.",
+ "delay" : 60,
+ "maxAttempts" : 25,
+ "operation" : "GetStreamingDistribution",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "StreamingDistribution.Status",
+ "state" : "success",
+ "expected" : "Deployed"
+ } ]
+ }
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudhsm/2014-05-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudhsm/2014-05-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b518be5f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudhsm/2014-05-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudhsm/2014-05-30/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudhsm/2014-05-30/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudhsm/2014-05-30/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudhsm/2014-05-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudhsm/2014-05-30/paginators-1.json
new file mode 100644
index 00000000..3dedddf1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudhsm/2014-05-30/paginators-1.json
@@ -0,0 +1,19 @@
+{
+ "pagination": {
+ "ListHapgs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "HapgList"
+ },
+ "ListHsms": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "HsmList"
+ },
+ "ListLunaClients": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "ClientList"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudhsm/2014-05-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudhsm/2014-05-30/service-2.json.gz
new file mode 100644
index 00000000..38a6a125
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudhsm/2014-05-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudhsmv2/2017-04-28/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudhsmv2/2017-04-28/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..8a76c09b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudhsmv2/2017-04-28/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudhsmv2/2017-04-28/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudhsmv2/2017-04-28/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudhsmv2/2017-04-28/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudhsmv2/2017-04-28/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudhsmv2/2017-04-28/paginators-1.json
new file mode 100644
index 00000000..19c403f0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudhsmv2/2017-04-28/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "DescribeBackups": {
+ "result_key": "Backups",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "DescribeClusters": {
+ "result_key": "Clusters",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListTags": {
+ "result_key": "TagList",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudhsmv2/2017-04-28/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudhsmv2/2017-04-28/service-2.json.gz
new file mode 100644
index 00000000..3754fcc9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudhsmv2/2017-04-28/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2011-02-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2011-02-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..d00d805b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2011-02-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2011-02-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2011-02-01/service-2.json.gz
new file mode 100644
index 00000000..41d5f57f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2011-02-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2013-01-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2013-01-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b6a45f3a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2013-01-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2013-01-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2013-01-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2013-01-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2013-01-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2013-01-01/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2013-01-01/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2013-01-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2013-01-01/service-2.json.gz
new file mode 100644
index 00000000..98bb59ed
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudsearch/2013-01-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudsearchdomain/2013-01-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudsearchdomain/2013-01-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..1bb7f84c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudsearchdomain/2013-01-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudsearchdomain/2013-01-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudsearchdomain/2013-01-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudsearchdomain/2013-01-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudsearchdomain/2013-01-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudsearchdomain/2013-01-01/service-2.json.gz
new file mode 100644
index 00000000..6c18720a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudsearchdomain/2013-01-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudtrail-data/2021-08-11/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudtrail-data/2021-08-11/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b9e39ace
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudtrail-data/2021-08-11/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudtrail-data/2021-08-11/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudtrail-data/2021-08-11/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudtrail-data/2021-08-11/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudtrail-data/2021-08-11/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudtrail-data/2021-08-11/service-2.json.gz
new file mode 100644
index 00000000..de2dc90f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudtrail-data/2021-08-11/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudtrail/2013-11-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudtrail/2013-11-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..e0b5f654
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudtrail/2013-11-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudtrail/2013-11-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudtrail/2013-11-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudtrail/2013-11-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudtrail/2013-11-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudtrail/2013-11-01/paginators-1.json
new file mode 100644
index 00000000..300217d2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudtrail/2013-11-01/paginators-1.json
@@ -0,0 +1,37 @@
+{
+ "pagination": {
+ "LookupEvents": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Events"
+ },
+ "ListPublicKeys": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "PublicKeyList"
+ },
+ "ListTags": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "ResourceTagList"
+ },
+ "ListTrails": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Trails"
+ },
+ "ListImportFailures": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Failures"
+ },
+ "ListImports": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Imports"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudtrail/2013-11-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudtrail/2013-11-01/service-2.json.gz
new file mode 100644
index 00000000..bba5deb9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudtrail/2013-11-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudwatch/2010-08-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudwatch/2010-08-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..247d32c1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudwatch/2010-08-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudwatch/2010-08-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudwatch/2010-08-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudwatch/2010-08-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudwatch/2010-08-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudwatch/2010-08-01/paginators-1.json
new file mode 100644
index 00000000..b386c2f6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudwatch/2010-08-01/paginators-1.json
@@ -0,0 +1,47 @@
+{
+ "pagination": {
+ "DescribeAlarmHistory": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxRecords",
+ "result_key": "AlarmHistoryItems"
+ },
+ "DescribeAlarms": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxRecords",
+ "result_key": [
+ "MetricAlarms",
+ "CompositeAlarms"
+ ]
+ },
+ "ListDashboards": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "DashboardEntries"
+ },
+ "ListMetrics": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": [
+ "Metrics",
+ "OwningAccounts"
+ ]
+ },
+ "GetMetricData": {
+ "input_token": "NextToken",
+ "limit_key": "MaxDatapoints",
+ "output_token": "NextToken",
+ "result_key": [
+ "MetricDataResults",
+ "Messages"
+ ]
+ },
+ "DescribeAnomalyDetectors": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AnomalyDetectors"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudwatch/2010-08-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cloudwatch/2010-08-01/service-2.json.gz
new file mode 100644
index 00000000..dd838f26
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudwatch/2010-08-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cloudwatch/2010-08-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cloudwatch/2010-08-01/waiters-2.json
new file mode 100644
index 00000000..32803bba
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cloudwatch/2010-08-01/waiters-2.json
@@ -0,0 +1,31 @@
+{
+ "version": 2,
+ "waiters": {
+ "AlarmExists": {
+ "delay": 5,
+ "maxAttempts": 40,
+ "operation": "DescribeAlarms",
+ "acceptors": [
+ {
+ "matcher": "path",
+ "expected": true,
+ "argument": "length(MetricAlarms[]) > `0`",
+ "state": "success"
+ }
+ ]
+ },
+ "CompositeAlarmExists": {
+ "delay": 5,
+ "maxAttempts": 40,
+ "operation": "DescribeAlarms",
+ "acceptors": [
+ {
+ "matcher": "path",
+ "expected": true,
+ "argument": "length(CompositeAlarms[]) > `0`",
+ "state": "success"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codeartifact/2018-09-22/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codeartifact/2018-09-22/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..65600ead
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codeartifact/2018-09-22/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codeartifact/2018-09-22/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/codeartifact/2018-09-22/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codeartifact/2018-09-22/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codeartifact/2018-09-22/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/codeartifact/2018-09-22/paginators-1.json
new file mode 100644
index 00000000..ad47997f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codeartifact/2018-09-22/paginators-1.json
@@ -0,0 +1,64 @@
+{
+ "pagination": {
+ "ListDomains": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "domains"
+ },
+ "ListPackageVersionAssets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "assets"
+ },
+ "ListPackageVersions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "versions"
+ },
+ "ListPackages": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "packages"
+ },
+ "ListRepositories": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "repositories"
+ },
+ "ListRepositoriesInDomain": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "repositories"
+ },
+ "ListAllowedRepositoriesForGroup": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "allowedRepositories"
+ },
+ "ListAssociatedPackages": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "packages"
+ },
+ "ListPackageGroups": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "packageGroups"
+ },
+ "ListSubPackageGroups": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "packageGroups"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codeartifact/2018-09-22/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/codeartifact/2018-09-22/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..d58fb3f9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codeartifact/2018-09-22/paginators-1.sdk-extras.json
@@ -0,0 +1,24 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "ListPackageVersionAssets": {
+ "non_aggregate_keys": [
+ "package",
+ "format",
+ "namespace",
+ "version",
+ "versionRevision"
+ ]
+ },
+ "ListPackageVersions": {
+ "non_aggregate_keys": [
+ "defaultDisplayVersion",
+ "format",
+ "package",
+ "namespace"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codeartifact/2018-09-22/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codeartifact/2018-09-22/service-2.json.gz
new file mode 100644
index 00000000..69abbe15
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codeartifact/2018-09-22/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codebuild/2016-10-06/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codebuild/2016-10-06/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..4dfc80a6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codebuild/2016-10-06/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codebuild/2016-10-06/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/codebuild/2016-10-06/examples-1.json
new file mode 100644
index 00000000..a5fb660e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codebuild/2016-10-06/examples-1.json
@@ -0,0 +1,281 @@
+{
+ "version": "1.0",
+ "examples": {
+ "BatchGetBuilds": [
+ {
+ "input": {
+ "ids": [
+ "codebuild-demo-project:9b0ac37f-d19e-4254-9079-f47e9a389eEX",
+ "codebuild-demo-project:b79a46f7-1473-4636-a23f-da9c45c208EX"
+ ]
+ },
+ "output": {
+ "builds": [
+ {
+ "arn": "arn:aws:codebuild:us-east-1:123456789012:build/codebuild-demo-project:9b0ac37f-d19e-4254-9079-f47e9a389eEX",
+ "artifacts": {
+ "location": "arn:aws:s3:::codebuild-123456789012-output-bucket/codebuild-demo-project"
+ },
+ "buildComplete": true,
+ "buildStatus": "SUCCEEDED",
+ "currentPhase": "COMPLETED",
+ "endTime": 1479832474.764,
+ "environment": {
+ "type": "LINUX_CONTAINER",
+ "computeType": "BUILD_GENERAL1_SMALL",
+ "environmentVariables": [
+
+ ],
+ "image": "aws/codebuild/java:openjdk-8",
+ "privilegedMode": false
+ },
+ "id": "codebuild-demo-project:9b0ac37f-d19e-4254-9079-f47e9a389eEX",
+ "initiator": "MyDemoUser",
+ "logs": {
+ "deepLink": "https://console.aws.amazon.com/cloudwatch/home?region=us-east-1#logEvent:group=/aws/codebuild/codebuild-demo-project;stream=9b0ac37f-d19e-4254-9079-f47e9a389eEX",
+ "groupName": "/aws/codebuild/codebuild-demo-project",
+ "streamName": "9b0ac37f-d19e-4254-9079-f47e9a389eEX"
+ },
+ "phases": [
+ {
+ "durationInSeconds": 0,
+ "endTime": 1479832342.23,
+ "phaseStatus": "SUCCEEDED",
+ "phaseType": "SUBMITTED",
+ "startTime": 1479832341.854
+ },
+ {
+ "contexts": [
+
+ ],
+ "durationInSeconds": 72,
+ "endTime": 1479832415.064,
+ "phaseStatus": "SUCCEEDED",
+ "phaseType": "PROVISIONING",
+ "startTime": 1479832342.23
+ },
+ {
+ "contexts": [
+
+ ],
+ "durationInSeconds": 46,
+ "endTime": 1479832461.261,
+ "phaseStatus": "SUCCEEDED",
+ "phaseType": "DOWNLOAD_SOURCE",
+ "startTime": 1479832415.064
+ },
+ {
+ "contexts": [
+
+ ],
+ "durationInSeconds": 0,
+ "endTime": 1479832461.354,
+ "phaseStatus": "SUCCEEDED",
+ "phaseType": "INSTALL",
+ "startTime": 1479832461.261
+ },
+ {
+ "contexts": [
+
+ ],
+ "durationInSeconds": 0,
+ "endTime": 1479832461.448,
+ "phaseStatus": "SUCCEEDED",
+ "phaseType": "PRE_BUILD",
+ "startTime": 1479832461.354
+ },
+ {
+ "contexts": [
+
+ ],
+ "durationInSeconds": 9,
+ "endTime": 1479832471.115,
+ "phaseStatus": "SUCCEEDED",
+ "phaseType": "BUILD",
+ "startTime": 1479832461.448
+ },
+ {
+ "contexts": [
+
+ ],
+ "durationInSeconds": 0,
+ "endTime": 1479832471.224,
+ "phaseStatus": "SUCCEEDED",
+ "phaseType": "POST_BUILD",
+ "startTime": 1479832471.115
+ },
+ {
+ "contexts": [
+
+ ],
+ "durationInSeconds": 0,
+ "endTime": 1479832471.791,
+ "phaseStatus": "SUCCEEDED",
+ "phaseType": "UPLOAD_ARTIFACTS",
+ "startTime": 1479832471.224
+ },
+ {
+ "contexts": [
+
+ ],
+ "durationInSeconds": 2,
+ "endTime": 1479832474.764,
+ "phaseStatus": "SUCCEEDED",
+ "phaseType": "FINALIZING",
+ "startTime": 1479832471.791
+ },
+ {
+ "phaseType": "COMPLETED",
+ "startTime": 1479832474.764
+ }
+ ],
+ "projectName": "codebuild-demo-project",
+ "source": {
+ "type": "S3",
+ "buildspec": "",
+ "location": "arn:aws:s3:::codebuild-123456789012-input-bucket/MessageUtil.zip"
+ },
+ "startTime": 1479832341.854,
+ "timeoutInMinutes": 60
+ },
+ {
+ "arn": "arn:aws:codebuild:us-east-1:123456789012:build/codebuild-demo-project:b79a46f7-1473-4636-a23f-da9c45c208EX",
+ "artifacts": {
+ "location": "arn:aws:s3:::codebuild-123456789012-output-bucket/codebuild-demo-project"
+ },
+ "buildComplete": true,
+ "buildStatus": "SUCCEEDED",
+ "currentPhase": "COMPLETED",
+ "endTime": 1479401214.239,
+ "environment": {
+ "type": "LINUX_CONTAINER",
+ "computeType": "BUILD_GENERAL1_SMALL",
+ "environmentVariables": [
+
+ ],
+ "image": "aws/codebuild/java:openjdk-8",
+ "privilegedMode": false
+ },
+ "id": "codebuild-demo-project:b79a46f7-1473-4636-a23f-da9c45c208EX",
+ "initiator": "MyDemoUser",
+ "logs": {
+ "deepLink": "https://console.aws.amazon.com/cloudwatch/home?region=us-east-1#logEvent:group=/aws/codebuild/codebuild-demo-project;stream=b79a46f7-1473-4636-a23f-da9c45c208EX",
+ "groupName": "/aws/codebuild/codebuild-demo-project",
+ "streamName": "b79a46f7-1473-4636-a23f-da9c45c208EX"
+ },
+ "phases": [
+ {
+ "durationInSeconds": 0,
+ "endTime": 1479401082.342,
+ "phaseStatus": "SUCCEEDED",
+ "phaseType": "SUBMITTED",
+ "startTime": 1479401081.869
+ },
+ {
+ "contexts": [
+
+ ],
+ "durationInSeconds": 71,
+ "endTime": 1479401154.129,
+ "phaseStatus": "SUCCEEDED",
+ "phaseType": "PROVISIONING",
+ "startTime": 1479401082.342
+ },
+ {
+ "contexts": [
+
+ ],
+ "durationInSeconds": 45,
+ "endTime": 1479401199.136,
+ "phaseStatus": "SUCCEEDED",
+ "phaseType": "DOWNLOAD_SOURCE",
+ "startTime": 1479401154.129
+ },
+ {
+ "contexts": [
+
+ ],
+ "durationInSeconds": 0,
+ "endTime": 1479401199.236,
+ "phaseStatus": "SUCCEEDED",
+ "phaseType": "INSTALL",
+ "startTime": 1479401199.136
+ },
+ {
+ "contexts": [
+
+ ],
+ "durationInSeconds": 0,
+ "endTime": 1479401199.345,
+ "phaseStatus": "SUCCEEDED",
+ "phaseType": "PRE_BUILD",
+ "startTime": 1479401199.236
+ },
+ {
+ "contexts": [
+
+ ],
+ "durationInSeconds": 9,
+ "endTime": 1479401208.68,
+ "phaseStatus": "SUCCEEDED",
+ "phaseType": "BUILD",
+ "startTime": 1479401199.345
+ },
+ {
+ "contexts": [
+
+ ],
+ "durationInSeconds": 0,
+ "endTime": 1479401208.783,
+ "phaseStatus": "SUCCEEDED",
+ "phaseType": "POST_BUILD",
+ "startTime": 1479401208.68
+ },
+ {
+ "contexts": [
+
+ ],
+ "durationInSeconds": 0,
+ "endTime": 1479401209.463,
+ "phaseStatus": "SUCCEEDED",
+ "phaseType": "UPLOAD_ARTIFACTS",
+ "startTime": 1479401208.783
+ },
+ {
+ "contexts": [
+
+ ],
+ "durationInSeconds": 4,
+ "endTime": 1479401214.239,
+ "phaseStatus": "SUCCEEDED",
+ "phaseType": "FINALIZING",
+ "startTime": 1479401209.463
+ },
+ {
+ "phaseType": "COMPLETED",
+ "startTime": 1479401214.239
+ }
+ ],
+ "projectName": "codebuild-demo-project",
+ "source": {
+ "type": "S3",
+ "location": "arn:aws:s3:::codebuild-123456789012-input-bucket/MessageUtil.zip"
+ },
+ "startTime": 1479401081.869,
+ "timeoutInMinutes": 60
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example gets information about builds with the specified build IDs.",
+ "id": "to-get-information-about-builds-1501187184588",
+ "title": "To get information about builds"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codebuild/2016-10-06/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/codebuild/2016-10-06/paginators-1.json
new file mode 100644
index 00000000..63a92129
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codebuild/2016-10-06/paginators-1.json
@@ -0,0 +1,73 @@
+{
+ "pagination": {
+ "ListBuilds": {
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "result_key": "ids"
+ },
+ "ListProjects": {
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "result_key": "projects"
+ },
+ "ListBuildsForProject": {
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "result_key": "ids"
+ },
+ "DescribeTestCases": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "testCases"
+ },
+ "ListReportGroups": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "reportGroups"
+ },
+ "ListReports": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "reports"
+ },
+ "ListReportsForReportGroup": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "reports"
+ },
+ "ListSharedProjects": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "projects"
+ },
+ "ListSharedReportGroups": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "reportGroups"
+ },
+ "DescribeCodeCoverages": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "codeCoverages"
+ },
+ "ListBuildBatches": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "ids"
+ },
+ "ListBuildBatchesForProject": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "ids"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codebuild/2016-10-06/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codebuild/2016-10-06/service-2.json.gz
new file mode 100644
index 00000000..53067336
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codebuild/2016-10-06/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codecatalyst/2022-09-28/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codecatalyst/2022-09-28/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..49ba62cb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codecatalyst/2022-09-28/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codecatalyst/2022-09-28/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/codecatalyst/2022-09-28/paginators-1.json
new file mode 100644
index 00000000..15ed87f6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codecatalyst/2022-09-28/paginators-1.json
@@ -0,0 +1,63 @@
+{
+ "pagination": {
+ "ListAccessTokens": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListDevEnvironments": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListEventLogs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListProjects": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListSourceRepositories": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListSourceRepositoryBranches": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListSpaces": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "items"
+ },
+ "ListDevEnvironmentSessions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListWorkflowRuns": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListWorkflows": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codecatalyst/2022-09-28/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codecatalyst/2022-09-28/service-2.json.gz
new file mode 100644
index 00000000..d635babb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codecatalyst/2022-09-28/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codecatalyst/2022-09-28/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/codecatalyst/2022-09-28/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codecatalyst/2022-09-28/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codecommit/2015-04-13/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codecommit/2015-04-13/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..c1564b3e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codecommit/2015-04-13/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codecommit/2015-04-13/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/codecommit/2015-04-13/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codecommit/2015-04-13/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codecommit/2015-04-13/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/codecommit/2015-04-13/paginators-1.json
new file mode 100644
index 00000000..b3310fca
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codecommit/2015-04-13/paginators-1.json
@@ -0,0 +1,44 @@
+{
+ "pagination": {
+ "ListBranches": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "branches"
+ },
+ "ListRepositories": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "repositories"
+ },
+ "GetCommentsForComparedCommit": {
+ "result_key": "commentsForComparedCommitData",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "DescribePullRequestEvents": {
+ "result_key": "pullRequestEvents",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "GetCommentsForPullRequest": {
+ "result_key": "commentsForPullRequestData",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "ListPullRequests": {
+ "result_key": "pullRequestIds",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "GetDifferences": {
+ "result_key": "differences",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codecommit/2015-04-13/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codecommit/2015-04-13/service-2.json.gz
new file mode 100644
index 00000000..269c35a1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codecommit/2015-04-13/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codeconnections/2023-12-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codeconnections/2023-12-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..dce3e03e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codeconnections/2023-12-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codeconnections/2023-12-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/codeconnections/2023-12-01/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codeconnections/2023-12-01/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codeconnections/2023-12-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codeconnections/2023-12-01/service-2.json.gz
new file mode 100644
index 00000000..76155af6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codeconnections/2023-12-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codedeploy/2014-10-06/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codedeploy/2014-10-06/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..d0722945
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codedeploy/2014-10-06/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codedeploy/2014-10-06/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/codedeploy/2014-10-06/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codedeploy/2014-10-06/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codedeploy/2014-10-06/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/codedeploy/2014-10-06/paginators-1.json
new file mode 100644
index 00000000..aae3fad3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codedeploy/2014-10-06/paginators-1.json
@@ -0,0 +1,49 @@
+{
+ "pagination": {
+ "ListApplicationRevisions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "revisions"
+ },
+ "ListApplications": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "applications"
+ },
+ "ListDeploymentConfigs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "deploymentConfigsList"
+ },
+ "ListDeploymentGroups": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "deploymentGroups"
+ },
+ "ListDeploymentInstances": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "instancesList"
+ },
+ "ListDeployments": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "deployments"
+ },
+ "ListDeploymentTargets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "targetIds"
+ },
+ "ListGitHubAccountTokenNames": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "tokenNameList"
+ },
+ "ListOnPremisesInstances": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "instanceNames"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codedeploy/2014-10-06/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codedeploy/2014-10-06/service-2.json.gz
new file mode 100644
index 00000000..da877a0f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codedeploy/2014-10-06/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codedeploy/2014-10-06/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/codedeploy/2014-10-06/waiters-2.json
new file mode 100644
index 00000000..0fea4fac
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codedeploy/2014-10-06/waiters-2.json
@@ -0,0 +1,30 @@
+{
+ "version": 2,
+ "waiters": {
+ "DeploymentSuccessful": {
+ "delay": 15,
+ "operation": "GetDeployment",
+ "maxAttempts": 120,
+ "acceptors": [
+ {
+ "expected": "Succeeded",
+ "matcher": "path",
+ "state": "success",
+ "argument": "deploymentInfo.status"
+ },
+ {
+ "expected": "Failed",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "deploymentInfo.status"
+ },
+ {
+ "expected": "Stopped",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "deploymentInfo.status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codeguru-reviewer/2019-09-19/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codeguru-reviewer/2019-09-19/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..fa38ee9a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codeguru-reviewer/2019-09-19/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codeguru-reviewer/2019-09-19/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/codeguru-reviewer/2019-09-19/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codeguru-reviewer/2019-09-19/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codeguru-reviewer/2019-09-19/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/codeguru-reviewer/2019-09-19/paginators-1.json
new file mode 100644
index 00000000..bbc1f584
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codeguru-reviewer/2019-09-19/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListRepositoryAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RepositoryAssociationSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codeguru-reviewer/2019-09-19/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codeguru-reviewer/2019-09-19/service-2.json.gz
new file mode 100644
index 00000000..75859335
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codeguru-reviewer/2019-09-19/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codeguru-reviewer/2019-09-19/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/codeguru-reviewer/2019-09-19/waiters-2.json
new file mode 100644
index 00000000..cd1730fa
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codeguru-reviewer/2019-09-19/waiters-2.json
@@ -0,0 +1,58 @@
+{
+ "version": 2,
+ "waiters":
+ {
+ "RepositoryAssociationSucceeded":
+ {
+ "description": "Wait until a repository association is complete.",
+ "operation": "DescribeRepositoryAssociation",
+ "delay": 10,
+ "maxAttempts": 30,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "RepositoryAssociation.State",
+ "expected": "Associated"
+ },
+ {
+ "state": "failure",
+ "matcher": "path",
+ "argument": "RepositoryAssociation.State",
+ "expected": "Failed"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "RepositoryAssociation.State",
+ "expected": "Associating"
+ }]
+ },
+ "CodeReviewCompleted":
+ {
+ "description": "Wait until a code review is complete.",
+ "operation": "DescribeCodeReview",
+ "delay": 10,
+ "maxAttempts": 180,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "CodeReview.State",
+ "expected": "Completed"
+ },
+ {
+ "state": "failure",
+ "matcher": "path",
+ "argument": "CodeReview.State",
+ "expected": "Failed"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "CodeReview.State",
+ "expected": "Pending"
+ }]
+ }
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codeguru-security/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codeguru-security/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..3c42d026
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codeguru-security/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codeguru-security/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/codeguru-security/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..03e1cbfc
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codeguru-security/2018-05-10/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "GetFindings": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "findings"
+ },
+ "ListFindingsMetrics": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "findingsMetrics"
+ },
+ "ListScans": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "summaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codeguru-security/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codeguru-security/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..e43af3eb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codeguru-security/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codeguruprofiler/2019-07-18/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codeguruprofiler/2019-07-18/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..41fe0ebf
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codeguruprofiler/2019-07-18/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codeguruprofiler/2019-07-18/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/codeguruprofiler/2019-07-18/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codeguruprofiler/2019-07-18/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codeguruprofiler/2019-07-18/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/codeguruprofiler/2019-07-18/paginators-1.json
new file mode 100644
index 00000000..c787d76c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codeguruprofiler/2019-07-18/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListProfileTimes": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "profileTimes"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codeguruprofiler/2019-07-18/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codeguruprofiler/2019-07-18/service-2.json.gz
new file mode 100644
index 00000000..922fade6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codeguruprofiler/2019-07-18/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codepipeline/2015-07-09/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codepipeline/2015-07-09/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..ac04c7ae
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codepipeline/2015-07-09/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codepipeline/2015-07-09/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/codepipeline/2015-07-09/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codepipeline/2015-07-09/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codepipeline/2015-07-09/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/codepipeline/2015-07-09/paginators-1.json
new file mode 100644
index 00000000..00b8348e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codepipeline/2015-07-09/paginators-1.json
@@ -0,0 +1,45 @@
+{
+ "pagination": {
+ "ListActionTypes": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "actionTypes"
+ },
+ "ListPipelineExecutions": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "pipelineExecutionSummaries"
+ },
+ "ListPipelines": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "pipelines",
+ "limit_key": "maxResults"
+ },
+ "ListWebhooks": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "webhooks"
+ },
+ "ListActionExecutions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "actionExecutionDetails"
+ },
+ "ListTagsForResource": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "tags"
+ },
+ "ListRuleExecutions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "ruleExecutionDetails"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codepipeline/2015-07-09/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codepipeline/2015-07-09/service-2.json.gz
new file mode 100644
index 00000000..b3b91732
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codepipeline/2015-07-09/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codestar-connections/2019-12-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codestar-connections/2019-12-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b04bf4e6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codestar-connections/2019-12-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codestar-connections/2019-12-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/codestar-connections/2019-12-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codestar-connections/2019-12-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codestar-connections/2019-12-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/codestar-connections/2019-12-01/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codestar-connections/2019-12-01/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codestar-connections/2019-12-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codestar-connections/2019-12-01/service-2.json.gz
new file mode 100644
index 00000000..e2be64f1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codestar-connections/2019-12-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codestar-notifications/2019-10-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codestar-notifications/2019-10-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..0fcfc76a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codestar-notifications/2019-10-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codestar-notifications/2019-10-15/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/codestar-notifications/2019-10-15/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codestar-notifications/2019-10-15/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codestar-notifications/2019-10-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/codestar-notifications/2019-10-15/paginators-1.json
new file mode 100644
index 00000000..95018141
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codestar-notifications/2019-10-15/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListEventTypes": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "EventTypes"
+ },
+ "ListNotificationRules": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "NotificationRules"
+ },
+ "ListTargets": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Targets"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/codestar-notifications/2019-10-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/codestar-notifications/2019-10-15/service-2.json.gz
new file mode 100644
index 00000000..cb42fa2f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/codestar-notifications/2019-10-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cognito-identity/2014-06-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cognito-identity/2014-06-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..caa41c26
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cognito-identity/2014-06-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cognito-identity/2014-06-30/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cognito-identity/2014-06-30/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cognito-identity/2014-06-30/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cognito-identity/2014-06-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cognito-identity/2014-06-30/paginators-1.json
new file mode 100644
index 00000000..2af6e40c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cognito-identity/2014-06-30/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListIdentityPools": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "IdentityPools"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cognito-identity/2014-06-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cognito-identity/2014-06-30/service-2.json.gz
new file mode 100644
index 00000000..5612d2ef
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cognito-identity/2014-06-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cognito-idp/2016-04-18/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cognito-idp/2016-04-18/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..043bbf1c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cognito-idp/2016-04-18/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cognito-idp/2016-04-18/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cognito-idp/2016-04-18/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cognito-idp/2016-04-18/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cognito-idp/2016-04-18/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cognito-idp/2016-04-18/paginators-1.json
new file mode 100644
index 00000000..51b7c94d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cognito-idp/2016-04-18/paginators-1.json
@@ -0,0 +1,58 @@
+{
+ "pagination": {
+ "AdminListGroupsForUser": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "Groups"
+ },
+ "AdminListUserAuthEvents": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AuthEvents"
+ },
+ "ListGroups": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "Groups"
+ },
+ "ListIdentityProviders": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Providers"
+ },
+ "ListResourceServers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ResourceServers"
+ },
+ "ListUserPoolClients": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "UserPoolClients"
+ },
+ "ListUserPools": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "UserPools"
+ },
+ "ListUsersInGroup": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "Users"
+ },
+ "ListUsers": {
+ "input_token": "PaginationToken",
+ "limit_key": "Limit",
+ "output_token": "PaginationToken",
+ "result_key": "Users"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cognito-idp/2016-04-18/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cognito-idp/2016-04-18/service-2.json.gz
new file mode 100644
index 00000000..fb6f4eac
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cognito-idp/2016-04-18/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cognito-sync/2014-06-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cognito-sync/2014-06-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..a96a69b2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cognito-sync/2014-06-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cognito-sync/2014-06-30/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cognito-sync/2014-06-30/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cognito-sync/2014-06-30/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cognito-sync/2014-06-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cognito-sync/2014-06-30/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cognito-sync/2014-06-30/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cognito-sync/2014-06-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cognito-sync/2014-06-30/service-2.json.gz
new file mode 100644
index 00000000..bcdb6a71
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cognito-sync/2014-06-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/comprehend/2017-11-27/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/comprehend/2017-11-27/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..9c5771fa
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/comprehend/2017-11-27/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/comprehend/2017-11-27/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/comprehend/2017-11-27/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/comprehend/2017-11-27/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/comprehend/2017-11-27/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/comprehend/2017-11-27/paginators-1.json
new file mode 100644
index 00000000..3a458182
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/comprehend/2017-11-27/paginators-1.json
@@ -0,0 +1,64 @@
+{
+ "pagination": {
+ "ListTopicsDetectionJobs": {
+ "result_key": "TopicsDetectionJobPropertiesList",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListDocumentClassificationJobs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "DocumentClassificationJobPropertiesList"
+ },
+ "ListDocumentClassifiers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "DocumentClassifierPropertiesList"
+ },
+ "ListDominantLanguageDetectionJobs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "DominantLanguageDetectionJobPropertiesList"
+ },
+ "ListEntitiesDetectionJobs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "EntitiesDetectionJobPropertiesList"
+ },
+ "ListEntityRecognizers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "EntityRecognizerPropertiesList"
+ },
+ "ListKeyPhrasesDetectionJobs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "KeyPhrasesDetectionJobPropertiesList"
+ },
+ "ListSentimentDetectionJobs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "SentimentDetectionJobPropertiesList"
+ },
+ "ListEndpoints": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "EndpointPropertiesList"
+ },
+ "ListPiiEntitiesDetectionJobs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "PiiEntitiesDetectionJobPropertiesList"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/comprehend/2017-11-27/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/comprehend/2017-11-27/service-2.json.gz
new file mode 100644
index 00000000..108da83c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/comprehend/2017-11-27/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/comprehendmedical/2018-10-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/comprehendmedical/2018-10-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..cab95628
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/comprehendmedical/2018-10-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/comprehendmedical/2018-10-30/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/comprehendmedical/2018-10-30/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/comprehendmedical/2018-10-30/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/comprehendmedical/2018-10-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/comprehendmedical/2018-10-30/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/comprehendmedical/2018-10-30/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/comprehendmedical/2018-10-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/comprehendmedical/2018-10-30/service-2.json.gz
new file mode 100644
index 00000000..8f80644e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/comprehendmedical/2018-10-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/compute-optimizer/2019-11-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/compute-optimizer/2019-11-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..397af3a1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/compute-optimizer/2019-11-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/compute-optimizer/2019-11-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/compute-optimizer/2019-11-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/compute-optimizer/2019-11-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/compute-optimizer/2019-11-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/compute-optimizer/2019-11-01/paginators-1.json
new file mode 100644
index 00000000..1d115fc2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/compute-optimizer/2019-11-01/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "DescribeRecommendationExportJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "recommendationExportJobs"
+ },
+ "GetEnrollmentStatusesForOrganization": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "accountEnrollmentStatuses"
+ },
+ "GetLambdaFunctionRecommendations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "lambdaFunctionRecommendations"
+ },
+ "GetRecommendationPreferences": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "recommendationPreferencesDetails"
+ },
+ "GetRecommendationSummaries": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "recommendationSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/compute-optimizer/2019-11-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/compute-optimizer/2019-11-01/service-2.json.gz
new file mode 100644
index 00000000..0ba3cba1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/compute-optimizer/2019-11-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/config/2014-11-12/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/config/2014-11-12/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..dd2260b4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/config/2014-11-12/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/config/2014-11-12/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/config/2014-11-12/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/config/2014-11-12/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/config/2014-11-12/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/config/2014-11-12/paginators-1.json
new file mode 100644
index 00000000..04fd5c5b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/config/2014-11-12/paginators-1.json
@@ -0,0 +1,198 @@
+{
+ "pagination": {
+ "DescribeComplianceByConfigRule": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "ComplianceByConfigRules"
+ },
+ "DescribeComplianceByResource": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "ComplianceByResources",
+ "limit_key": "Limit"
+ },
+ "DescribeConfigRules": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "ConfigRules"
+ },
+ "GetComplianceDetailsByConfigRule": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "EvaluationResults",
+ "limit_key": "Limit"
+ },
+ "GetComplianceDetailsByResource": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "EvaluationResults"
+ },
+ "GetResourceConfigHistory": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "configurationItems",
+ "limit_key": "limit"
+ },
+ "ListDiscoveredResources": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "resourceIdentifiers",
+ "limit_key": "limit"
+ },
+ "DescribeAggregateComplianceByConfigRules": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "AggregateComplianceByConfigRules"
+ },
+ "DescribeAggregationAuthorizations": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "AggregationAuthorizations"
+ },
+ "DescribeConfigRuleEvaluationStatus": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "ConfigRulesEvaluationStatus"
+ },
+ "DescribeConfigurationAggregatorSourcesStatus": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "AggregatedSourceStatusList"
+ },
+ "DescribeConfigurationAggregators": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "ConfigurationAggregators"
+ },
+ "DescribePendingAggregationRequests": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "PendingAggregationRequests"
+ },
+ "DescribeRetentionConfigurations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "RetentionConfigurations"
+ },
+ "GetAggregateComplianceDetailsByConfigRule": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "AggregateEvaluationResults"
+ },
+ "ListAggregateDiscoveredResources": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "ResourceIdentifiers"
+ },
+ "DescribeRemediationExecutionStatus": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "RemediationExecutionStatuses"
+ },
+ "DescribeAggregateComplianceByConformancePacks": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "AggregateComplianceByConformancePacks"
+ },
+ "DescribeConformancePackStatus": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "ConformancePackStatusDetails"
+ },
+ "DescribeConformancePacks": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "ConformancePackDetails"
+ },
+ "DescribeOrganizationConfigRuleStatuses": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "OrganizationConfigRuleStatuses"
+ },
+ "DescribeOrganizationConfigRules": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "OrganizationConfigRules"
+ },
+ "DescribeOrganizationConformancePackStatuses": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "OrganizationConformancePackStatuses"
+ },
+ "DescribeOrganizationConformancePacks": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "OrganizationConformancePacks"
+ },
+ "GetConformancePackComplianceSummary": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "ConformancePackComplianceSummaryList"
+ },
+ "GetOrganizationConfigRuleDetailedStatus": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "OrganizationConfigRuleDetailedStatus"
+ },
+ "GetOrganizationConformancePackDetailedStatus": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "OrganizationConformancePackDetailedStatuses"
+ },
+ "ListTagsForResource": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "Tags"
+ },
+ "SelectAggregateResourceConfig": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "non_aggregate_keys": [
+ "QueryInfo"
+ ],
+ "output_token": "NextToken",
+ "result_key": "Results"
+ },
+ "SelectResourceConfig": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "non_aggregate_keys": [
+ "QueryInfo"
+ ],
+ "output_token": "NextToken",
+ "result_key": "Results"
+ },
+ "ListResourceEvaluations": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "ResourceEvaluations"
+ },
+ "ListConfigurationRecorders": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ConfigurationRecorderSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/config/2014-11-12/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/config/2014-11-12/service-2.json.gz
new file mode 100644
index 00000000..29108675
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/config/2014-11-12/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/connect-contact-lens/2020-08-21/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/connect-contact-lens/2020-08-21/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..85eed178
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/connect-contact-lens/2020-08-21/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/connect-contact-lens/2020-08-21/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/connect-contact-lens/2020-08-21/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/connect-contact-lens/2020-08-21/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/connect-contact-lens/2020-08-21/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/connect-contact-lens/2020-08-21/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/connect-contact-lens/2020-08-21/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/connect-contact-lens/2020-08-21/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/connect-contact-lens/2020-08-21/service-2.json.gz
new file mode 100644
index 00000000..88410519
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/connect-contact-lens/2020-08-21/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/connect/2017-08-08/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/connect/2017-08-08/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..d194d55d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/connect/2017-08-08/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/connect/2017-08-08/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/connect/2017-08-08/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/connect/2017-08-08/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/connect/2017-08-08/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/connect/2017-08-08/paginators-1.json
new file mode 100644
index 00000000..2980cc21
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/connect/2017-08-08/paginators-1.json
@@ -0,0 +1,440 @@
+{
+ "pagination": {
+ "GetMetricData": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "MetricResults"
+ },
+ "ListRoutingProfiles": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "RoutingProfileSummaryList"
+ },
+ "ListSecurityProfiles": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "SecurityProfileSummaryList"
+ },
+ "ListUserHierarchyGroups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "UserHierarchyGroupSummaryList"
+ },
+ "ListUsers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "UserSummaryList"
+ },
+ "ListContactFlows": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ContactFlowSummaryList"
+ },
+ "ListHoursOfOperations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "HoursOfOperationSummaryList"
+ },
+ "ListPhoneNumbers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "PhoneNumberSummaryList"
+ },
+ "ListQueues": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "QueueSummaryList"
+ },
+ "ListPrompts": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "PromptSummaryList"
+ },
+ "ListRoutingProfileQueues": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "RoutingProfileQueueConfigSummaryList",
+ "non_aggregate_keys": [
+ "LastModifiedRegion",
+ "LastModifiedTime"
+ ]
+ },
+ "ListApprovedOrigins": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Origins"
+ },
+ "ListInstanceAttributes": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Attributes"
+ },
+ "ListInstanceStorageConfigs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "StorageConfigs"
+ },
+ "ListInstances": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "InstanceSummaryList"
+ },
+ "ListLambdaFunctions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LambdaFunctions"
+ },
+ "ListLexBots": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LexBots"
+ },
+ "ListSecurityKeys": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "SecurityKeys"
+ },
+ "ListIntegrationAssociations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "IntegrationAssociationSummaryList"
+ },
+ "ListUseCases": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "UseCaseSummaryList"
+ },
+ "ListQuickConnects": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "QuickConnectSummaryList"
+ },
+ "ListQueueQuickConnects": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "QuickConnectSummaryList",
+ "non_aggregate_keys": [
+ "LastModifiedRegion",
+ "LastModifiedTime"
+ ]
+ },
+ "ListBots": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LexBots"
+ },
+ "ListAgentStatuses": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AgentStatusSummaryList"
+ },
+ "ListSecurityProfilePermissions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Permissions",
+ "non_aggregate_keys": [
+ "LastModifiedRegion",
+ "LastModifiedTime"
+ ]
+ },
+ "ListContactReferences": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "ReferenceSummaryList"
+ },
+ "ListContactFlowModules": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ContactFlowModulesSummaryList"
+ },
+ "ListDefaultVocabularies": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "DefaultVocabularyList"
+ },
+ "SearchVocabularies": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "VocabularySummaryList"
+ },
+ "ListPhoneNumbersV2": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ListPhoneNumbersSummaryList"
+ },
+ "SearchAvailablePhoneNumbers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AvailableNumbersList"
+ },
+ "SearchUsers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "ApproximateTotalCount"
+ ],
+ "output_token": "NextToken",
+ "result_key": "Users"
+ },
+ "ListTaskTemplates": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TaskTemplates"
+ },
+ "SearchSecurityProfiles": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "ApproximateTotalCount"
+ ],
+ "output_token": "NextToken",
+ "result_key": "SecurityProfiles"
+ },
+ "SearchQueues": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "ApproximateTotalCount"
+ ],
+ "output_token": "NextToken",
+ "result_key": "Queues"
+ },
+ "SearchRoutingProfiles": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "ApproximateTotalCount"
+ ],
+ "output_token": "NextToken",
+ "result_key": "RoutingProfiles"
+ },
+ "ListTrafficDistributionGroups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TrafficDistributionGroupSummaryList"
+ },
+ "ListRules": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "RuleSummaryList"
+ },
+ "ListContactEvaluations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "EvaluationSummaryList"
+ },
+ "ListEvaluationFormVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "EvaluationFormVersionSummaryList"
+ },
+ "ListEvaluationForms": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "EvaluationFormSummaryList"
+ },
+ "SearchHoursOfOperations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "ApproximateTotalCount"
+ ],
+ "output_token": "NextToken",
+ "result_key": "HoursOfOperations"
+ },
+ "SearchPrompts": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "ApproximateTotalCount"
+ ],
+ "output_token": "NextToken",
+ "result_key": "Prompts"
+ },
+ "SearchQuickConnects": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "ApproximateTotalCount"
+ ],
+ "output_token": "NextToken",
+ "result_key": "QuickConnects"
+ },
+ "SearchResourceTags": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Tags"
+ },
+ "ListTrafficDistributionGroupUsers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TrafficDistributionGroupUserSummaryList"
+ },
+ "ListViewVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ViewVersionSummaryList"
+ },
+ "ListViews": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ViewsSummaryList"
+ },
+ "ListSecurityProfileApplications": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Applications",
+ "non_aggregate_keys": [
+ "LastModifiedRegion",
+ "LastModifiedTime"
+ ]
+ },
+ "ListFlowAssociations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "FlowAssociationSummaryList"
+ },
+ "ListPredefinedAttributes": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "PredefinedAttributeSummaryList"
+ },
+ "ListUserProficiencies": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "LastModifiedTime",
+ "LastModifiedRegion"
+ ],
+ "output_token": "NextToken",
+ "result_key": "UserProficiencyList"
+ },
+ "SearchContacts": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "TotalCount"
+ ],
+ "output_token": "NextToken",
+ "result_key": "Contacts"
+ },
+ "SearchPredefinedAttributes": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "ApproximateTotalCount"
+ ],
+ "output_token": "NextToken",
+ "result_key": "PredefinedAttributes"
+ },
+ "SearchContactFlowModules": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "ApproximateTotalCount"
+ ],
+ "output_token": "NextToken",
+ "result_key": "ContactFlowModules"
+ },
+ "SearchContactFlows": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "ApproximateTotalCount"
+ ],
+ "output_token": "NextToken",
+ "result_key": "ContactFlows"
+ },
+ "ListAuthenticationProfiles": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AuthenticationProfileSummaryList"
+ },
+ "SearchAgentStatuses": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "ApproximateTotalCount"
+ ],
+ "output_token": "NextToken",
+ "result_key": "AgentStatuses"
+ },
+ "SearchUserHierarchyGroups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "ApproximateTotalCount"
+ ],
+ "output_token": "NextToken",
+ "result_key": "UserHierarchyGroups"
+ },
+ "ListContactFlowVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ContactFlowVersionSummaryList"
+ },
+ "ListHoursOfOperationOverrides": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "LastModifiedRegion",
+ "LastModifiedTime"
+ ],
+ "output_token": "NextToken",
+ "result_key": "HoursOfOperationOverrideList"
+ },
+ "SearchHoursOfOperationOverrides": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "ApproximateTotalCount"
+ ],
+ "output_token": "NextToken",
+ "result_key": "HoursOfOperationOverrides"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/connect/2017-08-08/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/connect/2017-08-08/service-2.json.gz
new file mode 100644
index 00000000..ca6a3b31
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/connect/2017-08-08/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/connectcampaigns/2021-01-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/connectcampaigns/2021-01-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..1b48d8f3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/connectcampaigns/2021-01-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/connectcampaigns/2021-01-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/connectcampaigns/2021-01-30/paginators-1.json
new file mode 100644
index 00000000..6ab04512
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/connectcampaigns/2021-01-30/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListCampaigns": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "campaignSummaryList"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/connectcampaigns/2021-01-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/connectcampaigns/2021-01-30/service-2.json.gz
new file mode 100644
index 00000000..ee5f79e8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/connectcampaigns/2021-01-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/connectcampaignsv2/2024-04-23/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/connectcampaignsv2/2024-04-23/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..948c68f0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/connectcampaignsv2/2024-04-23/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/connectcampaignsv2/2024-04-23/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/connectcampaignsv2/2024-04-23/paginators-1.json
new file mode 100644
index 00000000..c8396078
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/connectcampaignsv2/2024-04-23/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "ListCampaigns": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "campaignSummaryList"
+ },
+ "ListConnectInstanceIntegrations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "integrationSummaryList"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/connectcampaignsv2/2024-04-23/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/connectcampaignsv2/2024-04-23/service-2.json.gz
new file mode 100644
index 00000000..81bdce21
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/connectcampaignsv2/2024-04-23/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/connectcases/2022-10-03/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/connectcases/2022-10-03/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..bc64c09c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/connectcases/2022-10-03/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/connectcases/2022-10-03/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/connectcases/2022-10-03/paginators-1.json
new file mode 100644
index 00000000..a0317075
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/connectcases/2022-10-03/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "SearchCases": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "cases"
+ },
+ "SearchRelatedItems": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "relatedItems"
+ },
+ "ListCaseRules": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "caseRules"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/connectcases/2022-10-03/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/connectcases/2022-10-03/service-2.json.gz
new file mode 100644
index 00000000..106bc9c9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/connectcases/2022-10-03/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/connectparticipant/2018-09-07/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/connectparticipant/2018-09-07/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..85e7cd44
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/connectparticipant/2018-09-07/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/connectparticipant/2018-09-07/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/connectparticipant/2018-09-07/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/connectparticipant/2018-09-07/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/connectparticipant/2018-09-07/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/connectparticipant/2018-09-07/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/connectparticipant/2018-09-07/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/connectparticipant/2018-09-07/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/connectparticipant/2018-09-07/service-2.json.gz
new file mode 100644
index 00000000..373efedc
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/connectparticipant/2018-09-07/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/controlcatalog/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/controlcatalog/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..4292e150
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/controlcatalog/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/controlcatalog/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/controlcatalog/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..1926666e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/controlcatalog/2018-05-10/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListCommonControls": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "CommonControls"
+ },
+ "ListDomains": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Domains"
+ },
+ "ListObjectives": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Objectives"
+ },
+ "ListControls": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Controls"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/controlcatalog/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/controlcatalog/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..e0f136e6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/controlcatalog/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/controlcatalog/2018-05-10/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/controlcatalog/2018-05-10/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/controlcatalog/2018-05-10/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/controltower/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/controltower/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..57ab891a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/controltower/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/controltower/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/controltower/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..e34843be
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/controltower/2018-05-10/paginators-1.json
@@ -0,0 +1,40 @@
+{
+ "pagination": {
+ "ListEnabledControls": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "enabledControls"
+ },
+ "ListLandingZones": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "landingZones"
+ },
+ "ListBaselines": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "baselines"
+ },
+ "ListEnabledBaselines": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "enabledBaselines"
+ },
+ "ListControlOperations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "controlOperations"
+ },
+ "ListLandingZoneOperations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "landingZoneOperations"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/controltower/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/controltower/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..2910a62b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/controltower/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cost-optimization-hub/2022-07-26/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cost-optimization-hub/2022-07-26/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..7f835f60
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cost-optimization-hub/2022-07-26/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cost-optimization-hub/2022-07-26/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cost-optimization-hub/2022-07-26/paginators-1.json
new file mode 100644
index 00000000..39460e68
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cost-optimization-hub/2022-07-26/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListEnrollmentStatuses": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListRecommendationSummaries": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListRecommendations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cost-optimization-hub/2022-07-26/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/cost-optimization-hub/2022-07-26/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..f9c62d53
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cost-optimization-hub/2022-07-26/paginators-1.sdk-extras.json
@@ -0,0 +1,20 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "ListEnrollmentStatuses": {
+ "non_aggregate_keys": [
+ "includeMemberAccounts"
+ ]
+ },
+ "ListRecommendationSummaries": {
+ "non_aggregate_keys": [
+ "groupBy",
+ "currencyCode",
+ "estimatedTotalDedupedSavings",
+ "metrics"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cost-optimization-hub/2022-07-26/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cost-optimization-hub/2022-07-26/service-2.json.gz
new file mode 100644
index 00000000..88ee8b2b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cost-optimization-hub/2022-07-26/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cost-optimization-hub/2022-07-26/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/cost-optimization-hub/2022-07-26/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cost-optimization-hub/2022-07-26/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cur/2017-01-06/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cur/2017-01-06/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..a3cbe69f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cur/2017-01-06/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cur/2017-01-06/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cur/2017-01-06/examples-1.json
new file mode 100644
index 00000000..d647e38b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cur/2017-01-06/examples-1.json
@@ -0,0 +1,102 @@
+{
+ "version": "1.0",
+ "examples": {
+ "DeleteReportDefinition": [
+ {
+ "input": {
+ "ReportName": "ExampleReport"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes the AWS Cost and Usage report named ExampleReport.",
+ "id": "to-delete-a-report",
+ "title": "To delete the AWS Cost and Usage report named ExampleReport."
+ }
+ ],
+ "DescribeReportDefinitions": [
+ {
+ "input": {
+ "MaxResults": 5
+ },
+ "output": {
+ "ReportDefinitions": [
+ {
+ "AdditionalArtifacts": [
+ "QUICKSIGHT"
+ ],
+ "AdditionalSchemaElements": [
+ "RESOURCES"
+ ],
+ "Compression": "GZIP",
+ "Format": "textORcsv",
+ "ReportName": "ExampleReport",
+ "S3Bucket": "example-s3-bucket",
+ "S3Prefix": "exampleprefix",
+ "S3Region": "us-east-1",
+ "TimeUnit": "HOURLY"
+ },
+ {
+ "AdditionalArtifacts": [
+ "QUICKSIGHT"
+ ],
+ "AdditionalSchemaElements": [
+ "RESOURCES"
+ ],
+ "Compression": "GZIP",
+ "Format": "textORcsv",
+ "ReportName": "ExampleReport2",
+ "S3Bucket": "example-s3-bucket",
+ "S3Prefix": "exampleprefix",
+ "S3Region": "us-east-1",
+ "TimeUnit": "HOURLY"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example lists the AWS Cost and Usage reports for the account.",
+ "id": "to-retrieve-report-definitions",
+ "title": "To list the AWS Cost and Usage reports for the account."
+ }
+ ],
+ "PutReportDefinition": [
+ {
+ "input": {
+ "ReportDefinition": {
+ "AdditionalArtifacts": [
+ "REDSHIFT",
+ "QUICKSIGHT"
+ ],
+ "AdditionalSchemaElements": [
+ "RESOURCES"
+ ],
+ "Compression": "ZIP",
+ "Format": "textORcsv",
+ "ReportName": "ExampleReport",
+ "S3Bucket": "example-s3-bucket",
+ "S3Prefix": "exampleprefix",
+ "S3Region": "us-east-1",
+ "TimeUnit": "DAILY"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates a AWS Cost and Usage report named ExampleReport.",
+ "id": "to-create-a-report-definitions",
+ "title": "To create a report named ExampleReport."
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cur/2017-01-06/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/cur/2017-01-06/paginators-1.json
new file mode 100644
index 00000000..7db4dfe1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cur/2017-01-06/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "DescribeReportDefinitions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ReportDefinitions"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/cur/2017-01-06/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/cur/2017-01-06/service-2.json.gz
new file mode 100644
index 00000000..65bca3e6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/cur/2017-01-06/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/customer-profiles/2020-08-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/customer-profiles/2020-08-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..3dce208c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/customer-profiles/2020-08-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/customer-profiles/2020-08-15/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/customer-profiles/2020-08-15/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/customer-profiles/2020-08-15/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/customer-profiles/2020-08-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/customer-profiles/2020-08-15/paginators-1.json
new file mode 100644
index 00000000..29f92660
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/customer-profiles/2020-08-15/paginators-1.json
@@ -0,0 +1,40 @@
+{
+ "pagination": {
+ "ListEventStreams": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "GetSimilarProfiles": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ProfileIds"
+ },
+ "ListObjectTypeAttributes": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListRuleBasedMatches": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "MatchIds"
+ },
+ "ListSegmentDefinitions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListEventTriggers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/customer-profiles/2020-08-15/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/customer-profiles/2020-08-15/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..15e5e318
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/customer-profiles/2020-08-15/paginators-1.sdk-extras.json
@@ -0,0 +1,15 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "GetSimilarProfiles": {
+ "non_aggregate_keys": [
+ "MatchType",
+ "MatchId",
+ "RuleLevel",
+ "ConfidenceScore"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/customer-profiles/2020-08-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/customer-profiles/2020-08-15/service-2.json.gz
new file mode 100644
index 00000000..7dfdf179
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/customer-profiles/2020-08-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/databrew/2017-07-25/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/databrew/2017-07-25/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b55a7c1b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/databrew/2017-07-25/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/databrew/2017-07-25/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/databrew/2017-07-25/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/databrew/2017-07-25/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/databrew/2017-07-25/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/databrew/2017-07-25/paginators-1.json
new file mode 100644
index 00000000..d18a749e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/databrew/2017-07-25/paginators-1.json
@@ -0,0 +1,52 @@
+{
+ "pagination": {
+ "ListDatasets": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Datasets"
+ },
+ "ListJobRuns": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "JobRuns"
+ },
+ "ListJobs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Jobs"
+ },
+ "ListProjects": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Projects"
+ },
+ "ListRecipeVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Recipes"
+ },
+ "ListRecipes": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Recipes"
+ },
+ "ListSchedules": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Schedules"
+ },
+ "ListRulesets": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Rulesets"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/databrew/2017-07-25/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/databrew/2017-07-25/service-2.json.gz
new file mode 100644
index 00000000..097c9ddc
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/databrew/2017-07-25/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dataexchange/2017-07-25/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/dataexchange/2017-07-25/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..767ebab1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dataexchange/2017-07-25/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dataexchange/2017-07-25/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/dataexchange/2017-07-25/paginators-1.json
new file mode 100644
index 00000000..cf704b02
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dataexchange/2017-07-25/paginators-1.json
@@ -0,0 +1,46 @@
+{
+ "pagination": {
+ "ListDataSetRevisions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Revisions"
+ },
+ "ListDataSets": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "DataSets"
+ },
+ "ListJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Jobs"
+ },
+ "ListRevisionAssets": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Assets"
+ },
+ "ListEventActions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "EventActions"
+ },
+ "ListDataGrants": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "DataGrantSummaries"
+ },
+ "ListReceivedDataGrants": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "DataGrantSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dataexchange/2017-07-25/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/dataexchange/2017-07-25/service-2.json.gz
new file mode 100644
index 00000000..dd0d066f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dataexchange/2017-07-25/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dataexchange/2017-07-25/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/dataexchange/2017-07-25/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dataexchange/2017-07-25/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/datapipeline/2012-10-29/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/datapipeline/2012-10-29/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..eb1a286b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/datapipeline/2012-10-29/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/datapipeline/2012-10-29/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/datapipeline/2012-10-29/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/datapipeline/2012-10-29/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/datapipeline/2012-10-29/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/datapipeline/2012-10-29/paginators-1.json
new file mode 100644
index 00000000..c859c9fb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/datapipeline/2012-10-29/paginators-1.json
@@ -0,0 +1,23 @@
+{
+ "pagination": {
+ "ListPipelines": {
+ "input_token": "marker",
+ "output_token": "marker",
+ "more_results": "hasMoreResults",
+ "result_key": "pipelineIdList"
+ },
+ "DescribeObjects": {
+ "input_token": "marker",
+ "output_token": "marker",
+ "more_results": "hasMoreResults",
+ "result_key": "pipelineObjects"
+ },
+ "QueryObjects": {
+ "input_token": "marker",
+ "output_token": "marker",
+ "more_results": "hasMoreResults",
+ "limit_key": "limit",
+ "result_key": "ids"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/datapipeline/2012-10-29/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/datapipeline/2012-10-29/service-2.json.gz
new file mode 100644
index 00000000..3d4e2a14
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/datapipeline/2012-10-29/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/datasync/2018-11-09/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/datasync/2018-11-09/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..579e1e3f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/datasync/2018-11-09/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/datasync/2018-11-09/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/datasync/2018-11-09/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/datasync/2018-11-09/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/datasync/2018-11-09/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/datasync/2018-11-09/paginators-1.json
new file mode 100644
index 00000000..6819b45e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/datasync/2018-11-09/paginators-1.json
@@ -0,0 +1,52 @@
+{
+ "pagination": {
+ "ListAgents": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Agents"
+ },
+ "ListLocations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Locations"
+ },
+ "ListTagsForResource": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Tags"
+ },
+ "ListTaskExecutions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TaskExecutions"
+ },
+ "ListTasks": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Tasks"
+ },
+ "DescribeStorageSystemResourceMetrics": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Metrics"
+ },
+ "ListDiscoveryJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "DiscoveryJobs"
+ },
+ "ListStorageSystems": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "StorageSystems"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/datasync/2018-11-09/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/datasync/2018-11-09/service-2.json.gz
new file mode 100644
index 00000000..888a69b4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/datasync/2018-11-09/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/datazone/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/datazone/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..5a41ffed
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/datazone/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/datazone/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/datazone/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..5d3e9f8a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/datazone/2018-05-10/paginators-1.json
@@ -0,0 +1,214 @@
+{
+ "pagination": {
+ "ListAssetRevisions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListDataSourceRunActivities": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListDataSourceRuns": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListDataSources": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListDomains": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListEnvironmentBlueprintConfigurations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListEnvironmentBlueprints": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListEnvironmentProfiles": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListEnvironments": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListNotifications": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "notifications"
+ },
+ "ListProjectMemberships": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "members"
+ },
+ "ListProjects": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListSubscriptionGrants": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListSubscriptionRequests": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListSubscriptionTargets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListSubscriptions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "Search": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "SearchGroupProfiles": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "SearchListings": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "SearchTypes": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "SearchUserProfiles": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListMetadataGenerationRuns": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListTimeSeriesDataPoints": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListEnvironmentActions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListLineageNodeHistory": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "nodes"
+ },
+ "ListAssetFilters": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListDataProductRevisions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListDomainUnitsForParent": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListEntityOwners": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "owners"
+ },
+ "ListPolicyGrants": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "grantList"
+ },
+ "ListRules": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListConnections": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListJobRuns": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListLineageEvents": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListProjectProfiles": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/datazone/2018-05-10/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/datazone/2018-05-10/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..d4bc280f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/datazone/2018-05-10/paginators-1.sdk-extras.json
@@ -0,0 +1,22 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "Search": {
+ "non_aggregate_keys": [
+ "totalMatchCount"
+ ]
+ },
+ "SearchListings": {
+ "non_aggregate_keys": [
+ "totalMatchCount"
+ ]
+ },
+ "SearchTypes": {
+ "non_aggregate_keys": [
+ "totalMatchCount"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/datazone/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/datazone/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..8ca46fb5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/datazone/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dax/2017-04-19/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/dax/2017-04-19/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..85dbe3d7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dax/2017-04-19/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dax/2017-04-19/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/dax/2017-04-19/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dax/2017-04-19/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dax/2017-04-19/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/dax/2017-04-19/paginators-1.json
new file mode 100644
index 00000000..c13b2df9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dax/2017-04-19/paginators-1.json
@@ -0,0 +1,45 @@
+{
+ "pagination": {
+ "DescribeClusters": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Clusters"
+ },
+ "DescribeDefaultParameters": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Parameters"
+ },
+ "DescribeEvents": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Events"
+ },
+ "DescribeParameterGroups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ParameterGroups"
+ },
+ "DescribeParameters": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Parameters"
+ },
+ "DescribeSubnetGroups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "SubnetGroups"
+ },
+ "ListTags": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Tags"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dax/2017-04-19/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/dax/2017-04-19/service-2.json.gz
new file mode 100644
index 00000000..4b8b009a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dax/2017-04-19/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/deadline/2023-10-12/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/deadline/2023-10-12/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..299cad9f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/deadline/2023-10-12/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/deadline/2023-10-12/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/deadline/2023-10-12/paginators-1.json
new file mode 100644
index 00000000..0a87c689
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/deadline/2023-10-12/paginators-1.json
@@ -0,0 +1,178 @@
+{
+ "pagination": {
+ "GetSessionsStatisticsAggregation": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "statistics"
+ },
+ "ListAvailableMeteredProducts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "meteredProducts"
+ },
+ "ListBudgets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "budgets"
+ },
+ "ListFarmMembers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "members"
+ },
+ "ListFarms": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "farms"
+ },
+ "ListFleetMembers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "members"
+ },
+ "ListFleets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "fleets"
+ },
+ "ListJobMembers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "members"
+ },
+ "ListJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "jobs"
+ },
+ "ListLicenseEndpoints": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "licenseEndpoints"
+ },
+ "ListMeteredProducts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "meteredProducts"
+ },
+ "ListMonitors": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "monitors"
+ },
+ "ListQueueEnvironments": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "environments"
+ },
+ "ListQueueFleetAssociations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "queueFleetAssociations"
+ },
+ "ListQueueMembers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "members"
+ },
+ "ListQueues": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "queues"
+ },
+ "ListSessionActions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "sessionActions"
+ },
+ "ListSessions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "sessions"
+ },
+ "ListSessionsForWorker": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "sessions"
+ },
+ "ListStepConsumers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "consumers"
+ },
+ "ListStepDependencies": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "dependencies"
+ },
+ "ListSteps": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "steps"
+ },
+ "ListStorageProfiles": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "storageProfiles"
+ },
+ "ListStorageProfilesForQueue": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "storageProfiles"
+ },
+ "ListTasks": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "tasks"
+ },
+ "ListWorkers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "workers"
+ },
+ "ListJobParameterDefinitions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "jobParameterDefinitions"
+ },
+ "ListLimits": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "limits"
+ },
+ "ListQueueLimitAssociations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "queueLimitAssociations"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/deadline/2023-10-12/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/deadline/2023-10-12/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..27c22e79
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/deadline/2023-10-12/paginators-1.sdk-extras.json
@@ -0,0 +1,13 @@
+ {
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "GetSessionsStatisticsAggregation": {
+ "non_aggregate_keys": [
+ "status",
+ "statusMessage"
+ ]
+ }
+ }
+ }
+ }
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/deadline/2023-10-12/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/deadline/2023-10-12/service-2.json.gz
new file mode 100644
index 00000000..44155f2f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/deadline/2023-10-12/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/deadline/2023-10-12/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/deadline/2023-10-12/waiters-2.json
new file mode 100644
index 00000000..eb6bcc6d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/deadline/2023-10-12/waiters-2.json
@@ -0,0 +1,143 @@
+{
+ "version" : 2,
+ "waiters" : {
+ "FleetActive" : {
+ "description" : "Wait until a Fleet is activated. Use this after invoking CreateFleet or UpdateFleet.",
+ "delay" : 5,
+ "maxAttempts" : 180,
+ "operation" : "GetFleet",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "ACTIVE"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "CREATE_FAILED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "UPDATE_FAILED"
+ } ]
+ },
+ "JobCreateComplete" : {
+ "description" : "Wait until a Job is created. Use this after invoking CreateJob.",
+ "delay" : 1,
+ "maxAttempts" : 120,
+ "operation" : "GetJob",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "lifecycleStatus",
+ "state" : "success",
+ "expected" : "CREATE_COMPLETE"
+ }, {
+ "matcher" : "path",
+ "argument" : "lifecycleStatus",
+ "state" : "success",
+ "expected" : "UPDATE_IN_PROGRESS"
+ }, {
+ "matcher" : "path",
+ "argument" : "lifecycleStatus",
+ "state" : "success",
+ "expected" : "UPDATE_FAILED"
+ }, {
+ "matcher" : "path",
+ "argument" : "lifecycleStatus",
+ "state" : "success",
+ "expected" : "UPDATE_SUCCEEDED"
+ }, {
+ "matcher" : "path",
+ "argument" : "lifecycleStatus",
+ "state" : "failure",
+ "expected" : "UPLOAD_FAILED"
+ }, {
+ "matcher" : "path",
+ "argument" : "lifecycleStatus",
+ "state" : "failure",
+ "expected" : "CREATE_FAILED"
+ } ]
+ },
+ "LicenseEndpointDeleted" : {
+ "description" : "Wait until a LicenseEndpoint is Deleted. Use this after invoking DeleteLicenseEndpoint.",
+ "delay" : 10,
+ "maxAttempts" : 234,
+ "operation" : "GetLicenseEndpoint",
+ "acceptors" : [ {
+ "matcher" : "error",
+ "state" : "success",
+ "expected" : "ResourceNotFoundException"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "NOT_READY"
+ } ]
+ },
+ "LicenseEndpointValid" : {
+ "description" : "Wait until a LicenseEndpoint is Ready. Use this after invoking CreateLicenseEndpoint.",
+ "delay" : 10,
+ "maxAttempts" : 114,
+ "operation" : "GetLicenseEndpoint",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "READY"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "NOT_READY"
+ } ]
+ },
+ "QueueFleetAssociationStopped" : {
+ "description" : "Wait until a QueueFleetAssociation is stopped. Use this after setting the status to STOP_SCHEDULING_AND_COMPLETE_TASKS or STOP_SCHEDULING_AND_CANCEL_TASKS to wait for a QueueFleetAssociation to reach STOPPED",
+ "delay" : 10,
+ "maxAttempts" : 60,
+ "operation" : "GetQueueFleetAssociation",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "STOPPED"
+ } ]
+ },
+ "QueueLimitAssociationStopped" : {
+ "description" : "Wait until a QueueLimitAssociation is stopped. Use this after setting the status to STOP_LIMIT_USAGE_AND_COMPLETE_TASKS or STOP_LIMIT_USAGE_AND_CANCEL_TASKS to wait for a QueueLimitAssociation to reach STOPPED",
+ "delay" : 10,
+ "maxAttempts" : 60,
+ "operation" : "GetQueueLimitAssociation",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "STOPPED"
+ } ]
+ },
+ "QueueScheduling" : {
+ "delay" : 10,
+ "maxAttempts" : 70,
+ "operation" : "GetQueue",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "SCHEDULING"
+ } ]
+ },
+ "QueueSchedulingBlocked" : {
+ "delay" : 10,
+ "maxAttempts" : 30,
+ "operation" : "GetQueue",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "SCHEDULING_BLOCKED"
+ } ]
+ }
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/detective/2018-10-26/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/detective/2018-10-26/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b5fc66e4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/detective/2018-10-26/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/detective/2018-10-26/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/detective/2018-10-26/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/detective/2018-10-26/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/detective/2018-10-26/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/detective/2018-10-26/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/detective/2018-10-26/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/detective/2018-10-26/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/detective/2018-10-26/service-2.json.gz
new file mode 100644
index 00000000..af2bf747
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/detective/2018-10-26/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/devicefarm/2015-06-23/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/devicefarm/2015-06-23/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..e13efa70
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/devicefarm/2015-06-23/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/devicefarm/2015-06-23/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/devicefarm/2015-06-23/examples-1.json
new file mode 100644
index 00000000..9db4e46c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/devicefarm/2015-06-23/examples-1.json
@@ -0,0 +1,1242 @@
+{
+ "version": "1.0",
+ "examples": {
+ "CreateDevicePool": [
+ {
+ "input": {
+ "name": "MyDevicePool",
+ "description": "My Android devices",
+ "projectArn": "arn:aws:devicefarm:us-west-2:123456789101:project:EXAMPLE-GUID-123-456",
+ "rules": [
+
+ ]
+ },
+ "output": {
+ "devicePool": {
+ }
+ },
+ "comments": {
+ "input": {
+ "name": "A device pool contains related devices, such as devices that run only on Android or that run only on iOS.",
+ "projectArn": "You can get the project ARN by using the list-projects CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates a new device pool named MyDevicePool inside an existing project.",
+ "id": "createdevicepool-example-1470862210860",
+ "title": "To create a new device pool"
+ }
+ ],
+ "CreateProject": [
+ {
+ "input": {
+ "name": "MyProject"
+ },
+ "output": {
+ "project": {
+ "name": "MyProject",
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:project:5e01a8c7-c861-4c0a-b1d5-12345EXAMPLE",
+ "created": "1472660939.152"
+ }
+ },
+ "comments": {
+ "input": {
+ "name": "A project in Device Farm is a workspace that contains test runs. A run is a test of a single app against one or more devices."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates a new project named MyProject.",
+ "id": "createproject-example-1470862210860",
+ "title": "To create a new project"
+ }
+ ],
+ "CreateRemoteAccessSession": [
+ {
+ "input": {
+ "name": "MySession",
+ "configuration": {
+ "billingMethod": "METERED"
+ },
+ "deviceArn": "arn:aws:devicefarm:us-west-2::device:123EXAMPLE",
+ "projectArn": "arn:aws:devicefarm:us-west-2:123456789101:project:EXAMPLE-GUID-123-456"
+ },
+ "output": {
+ "remoteAccessSession": {
+ }
+ },
+ "comments": {
+ "input": {
+ "deviceArn": "You can get the device ARN by using the list-devices CLI command.",
+ "projectArn": "You can get the project ARN by using the list-projects CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates a remote access session named MySession.",
+ "id": "to-create-a-remote-access-session-1470970668274",
+ "title": "To create a remote access session"
+ }
+ ],
+ "CreateUpload": [
+ {
+ "input": {
+ "name": "MyAppiumPythonUpload",
+ "type": "APPIUM_PYTHON_TEST_PACKAGE",
+ "projectArn": "arn:aws:devicefarm:us-west-2:123456789101:project:EXAMPLE-GUID-123-456"
+ },
+ "output": {
+ "upload": {
+ "name": "MyAppiumPythonUpload",
+ "type": "APPIUM_PYTHON_TEST_PACKAGE",
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:upload:5e01a8c7-c861-4c0a-b1d5-5ec6e6c6dd23/b5340a65-3da7-4da6-a26e-12345EXAMPLE",
+ "created": "1472661404.186",
+ "status": "INITIALIZED",
+ "url": "https://prod-us-west-2-uploads.s3-us-west-2.amazonaws.com/arn%3Aaws%3Adevicefarm%3Aus-west-2%3A123456789101%3Aproject%3A5e01a8c7-c861-4c0a-b1d5-12345EXAMPLE/uploads/arn%3Aaws%3Adevicefarm%3Aus-west-2%3A123456789101%3Aupload%3A5e01a8c7-c861-4c0a-b1d5-5ec6e6c6dd23/b5340a65-3da7-4da6-a26e-12345EXAMPLE/MyAppiumPythonUpload?AWSAccessKeyId=1234567891011EXAMPLE&Expires=1472747804&Signature=1234567891011EXAMPLE"
+ }
+ },
+ "comments": {
+ "input": {
+ "projectArn": "You can get the project ARN by using the list-projects CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates a new Appium Python test package upload inside an existing project.",
+ "id": "createupload-example-1470864711775",
+ "title": "To create a new test package upload"
+ }
+ ],
+ "DeleteDevicePool": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2::devicepool:123-456-EXAMPLE-GUID"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the device pool ARN by using the list-device-pools CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a specific device pool.",
+ "id": "deletedevicepool-example-1470866975494",
+ "title": "To delete a device pool"
+ }
+ ],
+ "DeleteProject": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:project:EXAMPLE-GUID-123-456"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the project ARN by using the list-projects CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a specific project.",
+ "id": "deleteproject-example-1470867374212",
+ "title": "To delete a project"
+ }
+ ],
+ "DeleteRemoteAccessSession": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:session:EXAMPLE-GUID-123-456"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the remote access session ARN by using the list-remote-access-sessions CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a specific remote access session.",
+ "id": "to-delete-a-specific-remote-access-session-1470971431677",
+ "title": "To delete a specific remote access session"
+ }
+ ],
+ "DeleteRun": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:run:EXAMPLE-GUID-123-456"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the run ARN by using the list-runs CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a specific test run.",
+ "id": "deleterun-example-1470867905129",
+ "title": "To delete a run"
+ }
+ ],
+ "DeleteUpload": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:upload:EXAMPLE-GUID-123-456"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the upload ARN by using the list-uploads CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a specific upload.",
+ "id": "deleteupload-example-1470868363942",
+ "title": "To delete a specific upload"
+ }
+ ],
+ "GetAccountSettings": [
+ {
+ "input": {
+ },
+ "output": {
+ "accountSettings": {
+ "awsAccountNumber": "123456789101",
+ "unmeteredDevices": {
+ "ANDROID": 1,
+ "IOS": 2
+ }
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information about your Device Farm account settings.",
+ "id": "to-get-information-about-account-settings-1472567568189",
+ "title": "To get information about account settings"
+ }
+ ],
+ "GetDevice": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2::device:123EXAMPLE"
+ },
+ "output": {
+ "device": {
+ "name": "LG G2 (Sprint)",
+ "arn": "arn:aws:devicefarm:us-west-2::device:A0E6E6E1059E45918208DF75B2B7EF6C",
+ "cpu": {
+ "architecture": "armeabi-v7a",
+ "clock": 2265.6,
+ "frequency": "MHz"
+ },
+ "formFactor": "PHONE",
+ "heapSize": 256000000,
+ "image": "75B2B7EF6C12345EXAMPLE",
+ "manufacturer": "LG",
+ "memory": 16000000000,
+ "model": "G2 (Sprint)",
+ "os": "4.2.2",
+ "platform": "ANDROID",
+ "resolution": {
+ "height": 1920,
+ "width": 1080
+ }
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information about a specific device.",
+ "id": "getdevice-example-1470870602173",
+ "title": "To get information about a device"
+ }
+ ],
+ "GetDevicePool": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:project:EXAMPLE-GUID-123-456"
+ },
+ "output": {
+ "devicePool": {
+ }
+ },
+ "comments": {
+ "input": {
+ "arn": "You can obtain the project ARN by using the list-projects CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information about a specific device pool, given a project ARN.",
+ "id": "getdevicepool-example-1470870873136",
+ "title": "To get information about a device pool"
+ }
+ ],
+ "GetDevicePoolCompatibility": [
+ {
+ "input": {
+ "appArn": "arn:aws:devicefarm:us-west-2::app:123-456-EXAMPLE-GUID",
+ "devicePoolArn": "arn:aws:devicefarm:us-west-2::devicepool:123-456-EXAMPLE-GUID",
+ "testType": "APPIUM_PYTHON"
+ },
+ "output": {
+ "compatibleDevices": [
+
+ ],
+ "incompatibleDevices": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ "devicePoolArn": "You can get the device pool ARN by using the list-device-pools CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information about the compatibility of a specific device pool, given its ARN.",
+ "id": "getdevicepoolcompatibility-example-1470925003466",
+ "title": "To get information about the compatibility of a device pool"
+ }
+ ],
+ "GetJob": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2::job:123-456-EXAMPLE-GUID"
+ },
+ "output": {
+ "job": {
+ }
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the job ARN by using the list-jobs CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information about a specific job.",
+ "id": "getjob-example-1470928294268",
+ "title": "To get information about a job"
+ }
+ ],
+ "GetOfferingStatus": [
+ {
+ "input": {
+ "nextToken": "RW5DdDJkMWYwZjM2MzM2VHVpOHJIUXlDUXlhc2QzRGViYnc9SEXAMPLE="
+ },
+ "output": {
+ "current": {
+ "D68B3C05-1BA6-4360-BC69-12345EXAMPLE": {
+ "offering": {
+ "type": "RECURRING",
+ "description": "Android Remote Access Unmetered Device Slot",
+ "id": "D68B3C05-1BA6-4360-BC69-12345EXAMPLE",
+ "platform": "ANDROID"
+ },
+ "quantity": 1
+ }
+ },
+ "nextPeriod": {
+ "D68B3C05-1BA6-4360-BC69-12345EXAMPLE": {
+ "effectiveOn": "1472688000",
+ "offering": {
+ "type": "RECURRING",
+ "description": "Android Remote Access Unmetered Device Slot",
+ "id": "D68B3C05-1BA6-4360-BC69-12345EXAMPLE",
+ "platform": "ANDROID"
+ },
+ "quantity": 1
+ }
+ }
+ },
+ "comments": {
+ "input": {
+ "nextToken": "A dynamically generated value, used for paginating results."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information about Device Farm offerings available to your account.",
+ "id": "to-get-status-information-about-device-offerings-1472568124402",
+ "title": "To get status information about device offerings"
+ }
+ ],
+ "GetProject": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:project:5e01a8c7-c861-4c0a-b1d5-12345EXAMPLE"
+ },
+ "output": {
+ "project": {
+ "name": "My Project",
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:project:5e01a8c7-c861-4c0a-b1d5-12345EXAMPLE",
+ "created": "1472660939.152"
+ }
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the project ARN by using the list-projects CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example gets information about a specific project.",
+ "id": "to-get-a-project-1470975038449",
+ "title": "To get information about a project"
+ }
+ ],
+ "GetRemoteAccessSession": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:session:EXAMPLE-GUID-123-456"
+ },
+ "output": {
+ "remoteAccessSession": {
+ }
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the remote access session ARN by using the list-remote-access-sessions CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example gets a specific remote access session.",
+ "id": "to-get-a-remote-access-session-1471014119414",
+ "title": "To get a remote access session"
+ }
+ ],
+ "GetRun": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:run:5e01a8c7-c861-4c0a-b1d5-5ec6e6c6dd23/0fcac17b-6122-44d7-ae5a-12345EXAMPLE"
+ },
+ "output": {
+ "run": {
+ "name": "My Test Run",
+ "type": "BUILTIN_EXPLORER",
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:run:5e01a8c7-c861-4c0a-b1d5-5ec6e6c6dd23/0fcac17b-6122-44d7-ae5a-12345EXAMPLE",
+ "billingMethod": "METERED",
+ "completedJobs": 0,
+ "counters": {
+ "errored": 0,
+ "failed": 0,
+ "passed": 0,
+ "skipped": 0,
+ "stopped": 0,
+ "total": 0,
+ "warned": 0
+ },
+ "created": "1472667509.852",
+ "deviceMinutes": {
+ "metered": 0.0,
+ "total": 0.0,
+ "unmetered": 0.0
+ },
+ "platform": "ANDROID",
+ "result": "PENDING",
+ "status": "RUNNING",
+ "totalJobs": 3
+ }
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the run ARN by using the list-runs CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example gets information about a specific test run.",
+ "id": "to-get-a-test-run-1471015895657",
+ "title": "To get information about a test run"
+ }
+ ],
+ "GetSuite": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:suite:EXAMPLE-GUID-123-456"
+ },
+ "output": {
+ "suite": {
+ }
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the suite ARN by using the list-suites CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example gets information about a specific test suite.",
+ "id": "to-get-information-about-a-test-suite-1471016525008",
+ "title": "To get information about a test suite"
+ }
+ ],
+ "GetTest": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:test:EXAMPLE-GUID-123-456"
+ },
+ "output": {
+ "test": {
+ }
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the test ARN by using the list-tests CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example gets information about a specific test.",
+ "id": "to-get-information-about-a-specific-test-1471025744238",
+ "title": "To get information about a specific test"
+ }
+ ],
+ "GetUpload": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:upload:EXAMPLE-GUID-123-456"
+ },
+ "output": {
+ "upload": {
+ }
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the test ARN by using the list-uploads CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example gets information about a specific upload.",
+ "id": "to-get-information-about-a-specific-upload-1471025996221",
+ "title": "To get information about a specific upload"
+ }
+ ],
+ "InstallToRemoteAccessSession": [
+ {
+ "input": {
+ "appArn": "arn:aws:devicefarm:us-west-2:123456789101:app:EXAMPLE-GUID-123-456",
+ "remoteAccessSessionArn": "arn:aws:devicefarm:us-west-2:123456789101:session:EXAMPLE-GUID-123-456"
+ },
+ "output": {
+ "appUpload": {
+ }
+ },
+ "comments": {
+ "input": {
+ "remoteAccessSessionArn": "You can get the remote access session ARN by using the list-remote-access-sessions CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example installs a specific app to a device in a specific remote access session.",
+ "id": "to-install-to-a-remote-access-session-1471634453818",
+ "title": "To install to a remote access session"
+ }
+ ],
+ "ListArtifacts": [
+ {
+ "input": {
+ "type": "SCREENSHOT",
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:run:EXAMPLE-GUID-123-456"
+ },
+ "comments": {
+ "input": {
+ "arn": "Can also be used to list artifacts for a Job, Suite, or Test ARN."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example lists screenshot artifacts for a specific run.",
+ "id": "to-list-artifacts-for-a-resource-1471635409527",
+ "title": "To list artifacts for a resource"
+ }
+ ],
+ "ListDevicePools": [
+ {
+ "input": {
+ "type": "PRIVATE",
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:project:EXAMPLE-GUID-123-456"
+ },
+ "output": {
+ "devicePools": [
+ {
+ "name": "Top Devices",
+ "arn": "arn:aws:devicefarm:us-west-2::devicepool:082d10e5-d7d7-48a5-ba5c-12345EXAMPLE",
+ "description": "Top devices",
+ "rules": [
+ {
+ "value": "[\"arn:aws:devicefarm:us-west-2::device:123456789EXAMPLE\",\"arn:aws:devicefarm:us-west-2::device:123456789EXAMPLE\",\"arn:aws:devicefarm:us-west-2::device:123456789EXAMPLE\",\"arn:aws:devicefarm:us-west-2::device:123456789EXAMPLE\",\"arn:aws:devicefarm:us-west-2::device:123456789EXAMPLE\",\"arn:aws:devicefarm:us-west-2::device:123456789EXAMPLE\",\"arn:aws:devicefarm:us-west-2::device:123456789EXAMPLE\",\"arn:aws:devicefarm:us-west-2::device:123456789EXAMPLE\",\"arn:aws:devicefarm:us-west-2::device:123456789EXAMPLE\",\"arn:aws:devicefarm:us-west-2::device:123456789EXAMPLE\"]",
+ "attribute": "ARN",
+ "operator": "IN"
+ }
+ ]
+ },
+ {
+ "name": "My Android Device Pool",
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:devicepool:5e01a8c7-c861-4c0a-b1d5-5ec6e6c6dd23/bf96e75a-28f6-4e61-b6a7-12345EXAMPLE",
+ "description": "Samsung Galaxy Android devices",
+ "rules": [
+ {
+ "value": "[\"arn:aws:devicefarm:us-west-2::device:123456789EXAMPLE\",\"arn:aws:devicefarm:us-west-2::device:123456789EXAMPLE\",\"arn:aws:devicefarm:us-west-2::device:123456789EXAMPLE\"]",
+ "attribute": "ARN",
+ "operator": "IN"
+ }
+ ]
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the project ARN by using the list-projects CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information about the private device pools in a specific project.",
+ "id": "to-get-information-about-device-pools-1471635745170",
+ "title": "To get information about device pools"
+ }
+ ],
+ "ListDevices": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:project:EXAMPLE-GUID-123-456"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the project ARN by using the list-projects CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information about the available devices in a specific project.",
+ "id": "to-get-information-about-devices-1471641699344",
+ "title": "To get information about devices"
+ }
+ ],
+ "ListJobs": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:project:EXAMPLE-GUID-123-456"
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the project ARN by using the list-jobs CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information about jobs in a specific project.",
+ "id": "to-get-information-about-jobs-1471642228071",
+ "title": "To get information about jobs"
+ }
+ ],
+ "ListOfferingTransactions": [
+ {
+ "input": {
+ "nextToken": "RW5DdDJkMWYwZjM2MzM2VHVpOHJIUXlDUXlhc2QzRGViYnc9SEXAMPLE="
+ },
+ "output": {
+ "offeringTransactions": [
+ {
+ "cost": {
+ "amount": 0,
+ "currencyCode": "USD"
+ },
+ "createdOn": "1470021420",
+ "offeringStatus": {
+ "type": "RENEW",
+ "effectiveOn": "1472688000",
+ "offering": {
+ "type": "RECURRING",
+ "description": "Android Remote Access Unmetered Device Slot",
+ "id": "D68B3C05-1BA6-4360-BC69-12345EXAMPLE",
+ "platform": "ANDROID"
+ },
+ "quantity": 0
+ },
+ "transactionId": "03728003-d1ea-4851-abd6-12345EXAMPLE"
+ },
+ {
+ "cost": {
+ "amount": 250,
+ "currencyCode": "USD"
+ },
+ "createdOn": "1470021420",
+ "offeringStatus": {
+ "type": "PURCHASE",
+ "effectiveOn": "1470021420",
+ "offering": {
+ "type": "RECURRING",
+ "description": "Android Remote Access Unmetered Device Slot",
+ "id": "D68B3C05-1BA6-4360-BC69-12345EXAMPLE",
+ "platform": "ANDROID"
+ },
+ "quantity": 1
+ },
+ "transactionId": "56820b6e-06bd-473a-8ff8-12345EXAMPLE"
+ },
+ {
+ "cost": {
+ "amount": 175,
+ "currencyCode": "USD"
+ },
+ "createdOn": "1465538520",
+ "offeringStatus": {
+ "type": "PURCHASE",
+ "effectiveOn": "1465538520",
+ "offering": {
+ "type": "RECURRING",
+ "description": "Android Unmetered Device Slot",
+ "id": "8980F81C-00D7-469D-8EC6-12345EXAMPLE",
+ "platform": "ANDROID"
+ },
+ "quantity": 1
+ },
+ "transactionId": "953ae2c6-d760-4a04-9597-12345EXAMPLE"
+ },
+ {
+ "cost": {
+ "amount": 8.07,
+ "currencyCode": "USD"
+ },
+ "createdOn": "1459344300",
+ "offeringStatus": {
+ "type": "PURCHASE",
+ "effectiveOn": "1459344300",
+ "offering": {
+ "type": "RECURRING",
+ "description": "iOS Unmetered Device Slot",
+ "id": "A53D4D73-A6F6-4B82-A0B0-12345EXAMPLE",
+ "platform": "IOS"
+ },
+ "quantity": 1
+ },
+ "transactionId": "2baf9021-ae3e-47f5-ab52-12345EXAMPLE"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ "nextToken": "A dynamically generated value, used for paginating results."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information about Device Farm offering transactions.",
+ "id": "to-get-information-about-device-offering-transactions-1472561712315",
+ "title": "To get information about device offering transactions"
+ }
+ ],
+ "ListOfferings": [
+ {
+ "input": {
+ "nextToken": "RW5DdDJkMWYwZjM2MzM2VHVpOHJIUXlDUXlhc2QzRGViYnc9SEXAMPLE="
+ },
+ "output": {
+ "offerings": [
+ {
+ "type": "RECURRING",
+ "description": "iOS Unmetered Device Slot",
+ "id": "A53D4D73-A6F6-4B82-A0B0-12345EXAMPLE",
+ "platform": "IOS",
+ "recurringCharges": [
+ {
+ "cost": {
+ "amount": 250,
+ "currencyCode": "USD"
+ },
+ "frequency": "MONTHLY"
+ }
+ ]
+ },
+ {
+ "type": "RECURRING",
+ "description": "Android Unmetered Device Slot",
+ "id": "8980F81C-00D7-469D-8EC6-12345EXAMPLE",
+ "platform": "ANDROID",
+ "recurringCharges": [
+ {
+ "cost": {
+ "amount": 250,
+ "currencyCode": "USD"
+ },
+ "frequency": "MONTHLY"
+ }
+ ]
+ },
+ {
+ "type": "RECURRING",
+ "description": "Android Remote Access Unmetered Device Slot",
+ "id": "D68B3C05-1BA6-4360-BC69-12345EXAMPLE",
+ "platform": "ANDROID",
+ "recurringCharges": [
+ {
+ "cost": {
+ "amount": 250,
+ "currencyCode": "USD"
+ },
+ "frequency": "MONTHLY"
+ }
+ ]
+ },
+ {
+ "type": "RECURRING",
+ "description": "iOS Remote Access Unmetered Device Slot",
+ "id": "552B4DAD-A6C9-45C4-94FB-12345EXAMPLE",
+ "platform": "IOS",
+ "recurringCharges": [
+ {
+ "cost": {
+ "amount": 250,
+ "currencyCode": "USD"
+ },
+ "frequency": "MONTHLY"
+ }
+ ]
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ "nextToken": "A dynamically generated value, used for paginating results."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information about available device offerings.",
+ "id": "to-get-information-about-device-offerings-1472562810999",
+ "title": "To get information about device offerings"
+ }
+ ],
+ "ListProjects": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:project:7ad300ed-8183-41a7-bf94-12345EXAMPLE",
+ "nextToken": "RW5DdDJkMWYwZjM2MzM2VHVpOHJIUXlDUXlhc2QzRGViYnc9SEXAMPLE"
+ },
+ "output": {
+ "projects": [
+ {
+ "name": "My Test Project",
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:project:7ad300ed-8183-41a7-bf94-12345EXAMPLE",
+ "created": "1453163262.105"
+ },
+ {
+ "name": "Hello World",
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:project:d6b087d9-56db-4e44-b9ec-12345EXAMPLE",
+ "created": "1470350112.439"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ "nextToken": "A dynamically generated value, used for paginating results."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information about the specified project in Device Farm.",
+ "id": "to-get-information-about-a-device-farm-project-1472564014388",
+ "title": "To get information about a Device Farm project"
+ }
+ ],
+ "ListRemoteAccessSessions": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:session:EXAMPLE-GUID-123-456",
+ "nextToken": "RW5DdDJkMWYwZjM2MzM2VHVpOHJIUXlDUXlhc2QzRGViYnc9SEXAMPLE="
+ },
+ "output": {
+ "remoteAccessSessions": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the Amazon Resource Name (ARN) of the session by using the list-sessions CLI command.",
+ "nextToken": "A dynamically generated value, used for paginating results."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information about a specific Device Farm remote access session.",
+ "id": "to-get-information-about-a-remote-access-session-1472581144803",
+ "title": "To get information about a remote access session"
+ }
+ ],
+ "ListRuns": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:run:5e01a8c7-c861-4c0a-b1d5-5ec6e6c6dd23/0fcac17b-6122-44d7-ae5a-12345EXAMPLE",
+ "nextToken": "RW5DdDJkMWYwZjM2MzM2VHVpOHJIUXlDUXlhc2QzRGViYnc9SEXAMPLE"
+ },
+ "output": {
+ "runs": [
+ {
+ "name": "My Test Run",
+ "type": "BUILTIN_EXPLORER",
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:run:5e01a8c7-c861-4c0a-b1d5-5ec6e6c6dd23/0fcac17b-6122-44d7-ae5a-12345EXAMPLE",
+ "billingMethod": "METERED",
+ "completedJobs": 0,
+ "counters": {
+ "errored": 0,
+ "failed": 0,
+ "passed": 0,
+ "skipped": 0,
+ "stopped": 0,
+ "total": 0,
+ "warned": 0
+ },
+ "created": "1472667509.852",
+ "deviceMinutes": {
+ "metered": 0.0,
+ "total": 0.0,
+ "unmetered": 0.0
+ },
+ "platform": "ANDROID",
+ "result": "PENDING",
+ "status": "RUNNING",
+ "totalJobs": 3
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the Amazon Resource Name (ARN) of the run by using the list-runs CLI command.",
+ "nextToken": "A dynamically generated value, used for paginating results."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information about a specific test run.",
+ "id": "to-get-information-about-test-runs-1472582711069",
+ "title": "To get information about a test run"
+ }
+ ],
+ "ListSamples": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:project:EXAMPLE-GUID-123-456",
+ "nextToken": "RW5DdDJkMWYwZjM2MzM2VHVpOHJIUXlDUXlhc2QzRGViYnc9SEXAMPLE"
+ },
+ "output": {
+ "samples": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the Amazon Resource Name (ARN) of the project by using the list-projects CLI command.",
+ "nextToken": "A dynamically generated value, used for paginating results."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information about samples, given a specific Device Farm project.",
+ "id": "to-get-information-about-samples-1472582847534",
+ "title": "To get information about samples"
+ }
+ ],
+ "ListSuites": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:job:EXAMPLE-GUID-123-456",
+ "nextToken": "RW5DdDJkMWYwZjM2MzM2VHVpOHJIUXlDUXlhc2QzRGViYnc9SEXAMPLE"
+ },
+ "output": {
+ "suites": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the Amazon Resource Name (ARN) of the job by using the list-jobs CLI command.",
+ "nextToken": "A dynamically generated value, used for paginating results."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information about suites, given a specific Device Farm job.",
+ "id": "to-get-information-about-suites-1472583038218",
+ "title": "To get information about suites"
+ }
+ ],
+ "ListTests": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:project:EXAMPLE-GUID-123-456",
+ "nextToken": "RW5DdDJkMWYwZjM2MzM2VHVpOHJIUXlDUXlhc2QzRGViYnc9SEXAMPLE"
+ },
+ "output": {
+ "tests": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the Amazon Resource Name (ARN) of the project by using the list-projects CLI command.",
+ "nextToken": "A dynamically generated value, used for paginating results."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information about tests, given a specific Device Farm project.",
+ "id": "to-get-information-about-tests-1472617372212",
+ "title": "To get information about tests"
+ }
+ ],
+ "ListUniqueProblems": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:project:EXAMPLE-GUID-123-456",
+ "nextToken": "RW5DdDJkMWYwZjM2MzM2VHVpOHJIUXlDUXlhc2QzRGViYnc9SEXAMPLE"
+ },
+ "output": {
+ "uniqueProblems": {
+ }
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the Amazon Resource Name (ARN) of the project by using the list-projects CLI command.",
+ "nextToken": "A dynamically generated value, used for paginating results."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information about unique problems, given a specific Device Farm project.",
+ "id": "to-get-information-about-unique-problems-1472617781008",
+ "title": "To get information about unique problems"
+ }
+ ],
+ "ListUploads": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:project:EXAMPLE-GUID-123-456",
+ "nextToken": "RW5DdDJkMWYwZjM2MzM2VHVpOHJIUXlDUXlhc2QzRGViYnc9SEXAMPLE"
+ },
+ "output": {
+ "uploads": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the Amazon Resource Name (ARN) of the project by using the list-projects CLI command.",
+ "nextToken": "A dynamically generated value, used for paginating results."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information about uploads, given a specific Device Farm project.",
+ "id": "to-get-information-about-uploads-1472617943090",
+ "title": "To get information about uploads"
+ }
+ ],
+ "PurchaseOffering": [
+ {
+ "input": {
+ "offeringId": "D68B3C05-1BA6-4360-BC69-12345EXAMPLE",
+ "quantity": 1
+ },
+ "output": {
+ "offeringTransaction": {
+ "cost": {
+ "amount": 8.07,
+ "currencyCode": "USD"
+ },
+ "createdOn": "1472648340",
+ "offeringStatus": {
+ "type": "PURCHASE",
+ "effectiveOn": "1472648340",
+ "offering": {
+ "type": "RECURRING",
+ "description": "Android Remote Access Unmetered Device Slot",
+ "id": "D68B3C05-1BA6-4360-BC69-12345EXAMPLE",
+ "platform": "ANDROID"
+ },
+ "quantity": 1
+ },
+ "transactionId": "d30614ed-1b03-404c-9893-12345EXAMPLE"
+ }
+ },
+ "comments": {
+ "input": {
+ "offeringId": "You can get the offering ID by using the list-offerings CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example purchases a specific device slot offering.",
+ "id": "to-purchase-a-device-slot-offering-1472648146343",
+ "title": "To purchase a device slot offering"
+ }
+ ],
+ "RenewOffering": [
+ {
+ "input": {
+ "offeringId": "D68B3C05-1BA6-4360-BC69-12345EXAMPLE",
+ "quantity": 1
+ },
+ "output": {
+ "offeringTransaction": {
+ "cost": {
+ "amount": 250,
+ "currencyCode": "USD"
+ },
+ "createdOn": "1472648880",
+ "offeringStatus": {
+ "type": "RENEW",
+ "effectiveOn": "1472688000",
+ "offering": {
+ "type": "RECURRING",
+ "description": "Android Remote Access Unmetered Device Slot",
+ "id": "D68B3C05-1BA6-4360-BC69-12345EXAMPLE",
+ "platform": "ANDROID"
+ },
+ "quantity": 1
+ },
+ "transactionId": "e90f1405-8c35-4561-be43-12345EXAMPLE"
+ }
+ },
+ "comments": {
+ "input": {
+ "offeringId": "You can get the offering ID by using the list-offerings CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example renews a specific device slot offering.",
+ "id": "to-renew-a-device-slot-offering-1472648899785",
+ "title": "To renew a device slot offering"
+ }
+ ],
+ "ScheduleRun": [
+ {
+ "input": {
+ "name": "MyRun",
+ "devicePoolArn": "arn:aws:devicefarm:us-west-2:123456789101:pool:EXAMPLE-GUID-123-456",
+ "projectArn": "arn:aws:devicefarm:us-west-2:123456789101:project:EXAMPLE-GUID-123-456",
+ "test": {
+ "type": "APPIUM_JAVA_JUNIT",
+ "testPackageArn": "arn:aws:devicefarm:us-west-2:123456789101:test:EXAMPLE-GUID-123-456"
+ }
+ },
+ "output": {
+ "run": {
+ }
+ },
+ "comments": {
+ "input": {
+ "devicePoolArn": "You can get the Amazon Resource Name (ARN) of the device pool by using the list-pools CLI command.",
+ "projectArn": "You can get the Amazon Resource Name (ARN) of the project by using the list-projects CLI command.",
+ "testPackageArn": "You can get the Amazon Resource Name (ARN) of the test package by using the list-tests CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example schedules a test run named MyRun.",
+ "id": "to-schedule-a-test-run-1472652429636",
+ "title": "To schedule a test run"
+ }
+ ],
+ "StopRun": [
+ {
+ "input": {
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:run:EXAMPLE-GUID-123-456"
+ },
+ "output": {
+ "run": {
+ }
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the Amazon Resource Name (ARN) of the test run by using the list-runs CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example stops a specific test run.",
+ "id": "to-stop-a-test-run-1472653770340",
+ "title": "To stop a test run"
+ }
+ ],
+ "UpdateDevicePool": [
+ {
+ "input": {
+ "name": "NewName",
+ "arn": "arn:aws:devicefarm:us-west-2::devicepool:082d10e5-d7d7-48a5-ba5c-12345EXAMPLE",
+ "description": "NewDescription",
+ "rules": [
+ {
+ "value": "True",
+ "attribute": "REMOTE_ACCESS_ENABLED",
+ "operator": "EQUALS"
+ }
+ ]
+ },
+ "output": {
+ "devicePool": {
+ }
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the Amazon Resource Name (ARN) of the device pool by using the list-pools CLI command."
+ },
+ "output": {
+ "devicePool": "Note: you cannot update curated device pools."
+ }
+ },
+ "description": "The following example updates the specified device pool with a new name and description. It also enables remote access of devices in the device pool.",
+ "id": "to-update-a-device-pool-1472653887677",
+ "title": "To update a device pool"
+ }
+ ],
+ "UpdateProject": [
+ {
+ "input": {
+ "name": "NewName",
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:project:8f75187d-101e-4625-accc-12345EXAMPLE"
+ },
+ "output": {
+ "project": {
+ "name": "NewName",
+ "arn": "arn:aws:devicefarm:us-west-2:123456789101:project:8f75187d-101e-4625-accc-12345EXAMPLE",
+ "created": "1448400709.927"
+ }
+ },
+ "comments": {
+ "input": {
+ "arn": "You can get the Amazon Resource Name (ARN) of the project by using the list-projects CLI command."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example updates the specified project with a new name.",
+ "id": "to-update-a-device-pool-1472653887677",
+ "title": "To update a device pool"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/devicefarm/2015-06-23/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/devicefarm/2015-06-23/paginators-1.json
new file mode 100644
index 00000000..982e07f9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/devicefarm/2015-06-23/paginators-1.json
@@ -0,0 +1,110 @@
+{
+ "pagination": {
+ "ListArtifacts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "artifacts"
+ },
+ "ListDevicePools": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "devicePools"
+ },
+ "ListDevices": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "devices"
+ },
+ "ListJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "jobs"
+ },
+ "ListProjects": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "projects"
+ },
+ "ListRuns": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "runs"
+ },
+ "ListSamples": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "samples"
+ },
+ "ListSuites": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "suites"
+ },
+ "ListTests": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "tests"
+ },
+ "ListUniqueProblems": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "uniqueProblems"
+ },
+ "ListUploads": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "uploads"
+ },
+ "GetOfferingStatus": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": [
+ "current",
+ "nextPeriod"
+ ]
+ },
+ "ListOfferingTransactions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "offeringTransactions"
+ },
+ "ListOfferings": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "offerings"
+ },
+ "ListDeviceInstances": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "deviceInstances"
+ },
+ "ListInstanceProfiles": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "instanceProfiles"
+ },
+ "ListNetworkProfiles": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "networkProfiles"
+ },
+ "ListOfferingPromotions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "offeringPromotions"
+ },
+ "ListRemoteAccessSessions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "remoteAccessSessions"
+ },
+ "ListVPCEConfigurations": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "vpceConfigurations"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/devicefarm/2015-06-23/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/devicefarm/2015-06-23/service-2.json.gz
new file mode 100644
index 00000000..a4c7ea2b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/devicefarm/2015-06-23/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/devops-guru/2020-12-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/devops-guru/2020-12-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..965a0b10
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/devops-guru/2020-12-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/devops-guru/2020-12-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/devops-guru/2020-12-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/devops-guru/2020-12-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/devops-guru/2020-12-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/devops-guru/2020-12-01/paginators-1.json
new file mode 100644
index 00000000..d0d58717
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/devops-guru/2020-12-01/paginators-1.json
@@ -0,0 +1,125 @@
+{
+ "pagination": {
+ "DescribeResourceCollectionHealth": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": [
+ "CloudFormation",
+ "Service",
+ "Tags"
+ ]
+ },
+ "GetResourceCollection": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": [
+ "ResourceCollection.CloudFormation.StackNames",
+ "ResourceCollection.Tags"
+ ],
+ "non_aggregate_keys": [
+ "ResourceCollection"
+ ]
+ },
+ "ListAnomaliesForInsight": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": [
+ "ReactiveAnomalies",
+ "ProactiveAnomalies"
+ ]
+ },
+ "ListEvents": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Events"
+ },
+ "ListInsights": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": [
+ "ProactiveInsights",
+ "ReactiveInsights"
+ ]
+ },
+ "ListNotificationChannels": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Channels"
+ },
+ "ListRecommendations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Recommendations"
+ },
+ "SearchInsights": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": [
+ "ProactiveInsights",
+ "ReactiveInsights"
+ ]
+ },
+ "GetCostEstimation": {
+ "input_token": "NextToken",
+ "non_aggregate_keys": [
+ "Status",
+ "TotalCost",
+ "TimeRange",
+ "ResourceCollection"
+ ],
+ "output_token": "NextToken",
+ "result_key": [
+ "Costs"
+ ]
+ },
+ "DescribeOrganizationResourceCollectionHealth": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": [
+ "CloudFormation",
+ "Account",
+ "Service",
+ "Tags"
+ ]
+ },
+ "ListOrganizationInsights": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": [
+ "ProactiveInsights",
+ "ReactiveInsights"
+ ]
+ },
+ "SearchOrganizationInsights": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": [
+ "ProactiveInsights",
+ "ReactiveInsights"
+ ]
+ },
+ "ListAnomalousLogGroups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": [
+ "InsightId",
+ "AnomalousLogGroups"
+ ]
+ },
+ "ListMonitoredResources": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": [
+ "MonitoredResourceIdentifiers"
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/devops-guru/2020-12-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/devops-guru/2020-12-01/service-2.json.gz
new file mode 100644
index 00000000..87f0387f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/devops-guru/2020-12-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/directconnect/2012-10-25/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/directconnect/2012-10-25/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..c811b08c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/directconnect/2012-10-25/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/directconnect/2012-10-25/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/directconnect/2012-10-25/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/directconnect/2012-10-25/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/directconnect/2012-10-25/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/directconnect/2012-10-25/paginators-1.json
new file mode 100644
index 00000000..dbca668f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/directconnect/2012-10-25/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "DescribeDirectConnectGatewayAssociations": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "directConnectGatewayAssociations"
+ },
+ "DescribeDirectConnectGatewayAttachments": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "directConnectGatewayAttachments"
+ },
+ "DescribeDirectConnectGateways": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "directConnectGateways"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/directconnect/2012-10-25/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/directconnect/2012-10-25/service-2.json.gz
new file mode 100644
index 00000000..72888858
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/directconnect/2012-10-25/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/discovery/2015-11-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/discovery/2015-11-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..36bef9ab
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/discovery/2015-11-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/discovery/2015-11-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/discovery/2015-11-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/discovery/2015-11-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/discovery/2015-11-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/discovery/2015-11-01/paginators-1.json
new file mode 100644
index 00000000..5567a777
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/discovery/2015-11-01/paginators-1.json
@@ -0,0 +1,46 @@
+{
+ "pagination": {
+ "DescribeAgents": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "agentsInfo"
+ },
+ "DescribeContinuousExports": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "descriptions"
+ },
+ "DescribeExportConfigurations": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "exportsInfo"
+ },
+ "DescribeExportTasks": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "exportsInfo"
+ },
+ "DescribeTags": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "tags"
+ },
+ "ListConfigurations": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "configurations"
+ },
+ "DescribeImportTasks": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "tasks"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/discovery/2015-11-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/discovery/2015-11-01/service-2.json.gz
new file mode 100644
index 00000000..5852d99b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/discovery/2015-11-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dlm/2018-01-12/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/dlm/2018-01-12/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..2e701c0d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dlm/2018-01-12/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dlm/2018-01-12/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/dlm/2018-01-12/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dlm/2018-01-12/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dlm/2018-01-12/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/dlm/2018-01-12/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dlm/2018-01-12/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dlm/2018-01-12/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/dlm/2018-01-12/service-2.json.gz
new file mode 100644
index 00000000..2674d76c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dlm/2018-01-12/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dms/2016-01-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/dms/2016-01-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..33788e9b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dms/2016-01-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dms/2016-01-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/dms/2016-01-01/examples-1.json
new file mode 100644
index 00000000..f9e8c4e5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dms/2016-01-01/examples-1.json
@@ -0,0 +1,1074 @@
+{
+ "version": "1.0",
+ "examples": {
+ "AddTagsToResource": [
+ {
+ "input": {
+ "ResourceArn": "arn:aws:dms:us-east-1:123456789012:endpoint:ASXWXJZLNWNT5HTWCGV2BUJQ7E",
+ "Tags": [
+ {
+ "Key": "Acount",
+ "Value": "1633456"
+ }
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ "ResourceArn": "Required. Use the ARN of the resource you want to tag.",
+ "Tags": "Required. Use the Key/Value pair format."
+ },
+ "output": {
+ }
+ },
+ "description": "Adds metadata tags to an AWS DMS resource, including replication instance, endpoint, security group, and migration task. These tags can also be used with cost allocation reporting to track cost associated with AWS DMS resources, or used in a Condition statement in an IAM policy for AWS DMS.",
+ "id": "add-tags-to-resource-1481744141435",
+ "title": "Add tags to resource"
+ }
+ ],
+ "CreateEndpoint": [
+ {
+ "input": {
+ "CertificateArn": "",
+ "DatabaseName": "testdb",
+ "EndpointIdentifier": "test-endpoint-1",
+ "EndpointType": "source",
+ "EngineName": "mysql",
+ "ExtraConnectionAttributes": "",
+ "KmsKeyId": "arn:aws:kms:us-east-1:123456789012:key/4c1731d6-5435-ed4d-be13-d53411a7cfbd",
+ "Password": "pasword",
+ "Port": 3306,
+ "ServerName": "mydb.cx1llnox7iyx.us-west-2.rds.amazonaws.com",
+ "SslMode": "require",
+ "Tags": [
+ {
+ "Key": "Acount",
+ "Value": "143327655"
+ }
+ ],
+ "Username": "username"
+ },
+ "output": {
+ "Endpoint": {
+ "EndpointArn": "arn:aws:dms:us-east-1:123456789012:endpoint:RAAR3R22XSH46S3PWLC3NJAWKM",
+ "EndpointIdentifier": "test-endpoint-1",
+ "EndpointType": "source",
+ "EngineName": "mysql",
+ "KmsKeyId": "arn:aws:kms:us-east-1:123456789012:key/4c1731d6-5435-ed4d-be13-d53411a7cfbd",
+ "Port": 3306,
+ "ServerName": "mydb.cx1llnox7iyx.us-west-2.rds.amazonaws.com",
+ "Status": "active",
+ "Username": "username"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Creates an endpoint using the provided settings.",
+ "id": "create-endpoint-1481746254348",
+ "title": "Create endpoint"
+ }
+ ],
+ "CreateReplicationInstance": [
+ {
+ "input": {
+ "AllocatedStorage": 123,
+ "AutoMinorVersionUpgrade": true,
+ "AvailabilityZone": "",
+ "EngineVersion": "",
+ "KmsKeyId": "",
+ "MultiAZ": true,
+ "PreferredMaintenanceWindow": "",
+ "PubliclyAccessible": true,
+ "ReplicationInstanceClass": "",
+ "ReplicationInstanceIdentifier": "",
+ "ReplicationSubnetGroupIdentifier": "",
+ "Tags": [
+ {
+ "Key": "string",
+ "Value": "string"
+ }
+ ],
+ "VpcSecurityGroupIds": [
+
+ ]
+ },
+ "output": {
+ "ReplicationInstance": {
+ "AllocatedStorage": 5,
+ "AutoMinorVersionUpgrade": true,
+ "EngineVersion": "1.5.0",
+ "KmsKeyId": "arn:aws:kms:us-east-1:123456789012:key/4c1731d6-5435-ed4d-be13-d53411a7cfbd",
+ "PendingModifiedValues": {
+ },
+ "PreferredMaintenanceWindow": "sun:06:00-sun:14:00",
+ "PubliclyAccessible": true,
+ "ReplicationInstanceArn": "arn:aws:dms:us-east-1:123456789012:rep:6UTDJGBOUS3VI3SUWA66XFJCJQ",
+ "ReplicationInstanceClass": "dms.t2.micro",
+ "ReplicationInstanceIdentifier": "test-rep-1",
+ "ReplicationInstanceStatus": "creating",
+ "ReplicationSubnetGroup": {
+ "ReplicationSubnetGroupDescription": "default",
+ "ReplicationSubnetGroupIdentifier": "default",
+ "SubnetGroupStatus": "Complete",
+ "Subnets": [
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1d"
+ },
+ "SubnetIdentifier": "subnet-f6dd91af",
+ "SubnetStatus": "Active"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1b"
+ },
+ "SubnetIdentifier": "subnet-3605751d",
+ "SubnetStatus": "Active"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1c"
+ },
+ "SubnetIdentifier": "subnet-c2daefb5",
+ "SubnetStatus": "Active"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1e"
+ },
+ "SubnetIdentifier": "subnet-85e90cb8",
+ "SubnetStatus": "Active"
+ }
+ ],
+ "VpcId": "vpc-6741a603"
+ }
+ }
+ },
+ "comments": {
+ "output": {
+ }
+ },
+ "description": "Creates the replication instance using the specified parameters.",
+ "id": "create-replication-instance-1481746705295",
+ "title": "Create replication instance"
+ }
+ ],
+ "CreateReplicationSubnetGroup": [
+ {
+ "input": {
+ "ReplicationSubnetGroupDescription": "US West subnet group",
+ "ReplicationSubnetGroupIdentifier": "us-west-2ab-vpc-215ds366",
+ "SubnetIds": [
+ "subnet-e145356n",
+ "subnet-58f79200"
+ ],
+ "Tags": [
+ {
+ "Key": "Acount",
+ "Value": "145235"
+ }
+ ]
+ },
+ "output": {
+ "ReplicationSubnetGroup": {
+ }
+ },
+ "comments": {
+ "output": {
+ }
+ },
+ "description": "Creates a replication subnet group given a list of the subnet IDs in a VPC.",
+ "id": "create-replication-subnet-group-1481747297930",
+ "title": "Create replication subnet group"
+ }
+ ],
+ "CreateReplicationTask": [
+ {
+ "input": {
+ "CdcStartTime": "2016-12-14T18:25:43Z",
+ "MigrationType": "full-load",
+ "ReplicationInstanceArn": "arn:aws:dms:us-east-1:123456789012:rep:6UTDJGBOUS3VI3SUWA66XFJCJQ",
+ "ReplicationTaskIdentifier": "task1",
+ "ReplicationTaskSettings": "",
+ "SourceEndpointArn": "arn:aws:dms:us-east-1:123456789012:endpoint:ZW5UAN6P4E77EC7YWHK4RZZ3BE",
+ "TableMappings": "file://mappingfile.json",
+ "Tags": [
+ {
+ "Key": "Acount",
+ "Value": "24352226"
+ }
+ ],
+ "TargetEndpointArn": "arn:aws:dms:us-east-1:123456789012:endpoint:ASXWXJZLNWNT5HTWCGV2BUJQ7E"
+ },
+ "output": {
+ "ReplicationTask": {
+ "MigrationType": "full-load",
+ "ReplicationInstanceArn": "arn:aws:dms:us-east-1:123456789012:rep:6UTDJGBOUS3VI3SUWA66XFJCJQ",
+ "ReplicationTaskArn": "arn:aws:dms:us-east-1:123456789012:task:OEAMB3NXSTZ6LFYZFEPPBBXPYM",
+ "ReplicationTaskCreationDate": "2016-12-14T18:25:43Z",
+ "ReplicationTaskIdentifier": "task1",
+ "ReplicationTaskSettings": "{\"TargetMetadata\":{\"TargetSchema\":\"\",\"SupportLobs\":true,\"FullLobMode\":true,\"LobChunkSize\":64,\"LimitedSizeLobMode\":false,\"LobMaxSize\":0},\"FullLoadSettings\":{\"FullLoadEnabled\":true,\"ApplyChangesEnabled\":false,\"TargetTablePrepMode\":\"DROP_AND_CREATE\",\"CreatePkAfterFullLoad\":false,\"StopTaskCachedChangesApplied\":false,\"StopTaskCachedChangesNotApplied\":false,\"ResumeEnabled\":false,\"ResumeMinTableSize\":100000,\"ResumeOnlyClusteredPKTables\":true,\"MaxFullLoadSubTasks\":8,\"TransactionConsistencyTimeout\":600,\"CommitRate\":10000},\"Logging\":{\"EnableLogging\":false}}",
+ "SourceEndpointArn": "arn:aws:dms:us-east-1:123456789012:endpoint:ZW5UAN6P4E77EC7YWHK4RZZ3BE",
+ "Status": "creating",
+ "TableMappings": "file://mappingfile.json",
+ "TargetEndpointArn": "arn:aws:dms:us-east-1:123456789012:endpoint:ASXWXJZLNWNT5HTWCGV2BUJQ7E"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Creates a replication task using the specified parameters.",
+ "id": "create-replication-task-1481747646288",
+ "title": "Create replication task"
+ }
+ ],
+ "DeleteCertificate": [
+ {
+ "input": {
+ "CertificateArn": "arn:aws:dms:us-east-1:123456789012:rep:6UTDJGBOUSM457DE6XFJCJQ"
+ },
+ "output": {
+ "Certificate": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Deletes the specified certificate.",
+ "id": "delete-certificate-1481751957981",
+ "title": "Delete Certificate"
+ }
+ ],
+ "DeleteConnection": [
+ {
+ "input": {
+ "EndpointArn": "arn:aws:dms:us-east-1:123456789012:endpoint:RAAR3R22XSH46S3PWLC3NJAWKM",
+ "ReplicationInstanceArn": "arn:aws:dms:us-east-1:123456789012:rep:6UTDJGBOUS3VI3SUWA66XFJCJQ"
+ },
+ "output": {
+ "Connection": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Deletes the connection between the replication instance and the endpoint.",
+ "id": "delete-connection-1481751957981",
+ "title": "Delete Connection"
+ }
+ ],
+ "DeleteEndpoint": [
+ {
+ "input": {
+ "EndpointArn": "arn:aws:dms:us-east-1:123456789012:endpoint:RAAR3R22XSH46S3PWLC3NJAWKM"
+ },
+ "output": {
+ "Endpoint": {
+ "EndpointArn": "arn:aws:dms:us-east-1:123456789012:endpoint:RAAR3R22XSH46S3PWLC3NJAWKM",
+ "EndpointIdentifier": "test-endpoint-1",
+ "EndpointType": "source",
+ "EngineName": "mysql",
+ "KmsKeyId": "arn:aws:kms:us-east-1:123456789012:key/4c1731d6-5435-ed4d-be13-d53411a7cfbd",
+ "Port": 3306,
+ "ServerName": "mydb.cx1llnox7iyx.us-west-2.rds.amazonaws.com",
+ "Status": "active",
+ "Username": "username"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Deletes the specified endpoint. All tasks associated with the endpoint must be deleted before you can delete the endpoint.\n",
+ "id": "delete-endpoint-1481752425530",
+ "title": "Delete Endpoint"
+ }
+ ],
+ "DeleteReplicationInstance": [
+ {
+ "input": {
+ "ReplicationInstanceArn": "arn:aws:dms:us-east-1:123456789012:rep:6UTDJGBOUS3VI3SUWA66XFJCJQ"
+ },
+ "output": {
+ "ReplicationInstance": {
+ "AllocatedStorage": 5,
+ "AutoMinorVersionUpgrade": true,
+ "EngineVersion": "1.5.0",
+ "KmsKeyId": "arn:aws:kms:us-east-1:123456789012:key/4c1731d6-5435-ed4d-be13-d53411a7cfbd",
+ "PendingModifiedValues": {
+ },
+ "PreferredMaintenanceWindow": "sun:06:00-sun:14:00",
+ "PubliclyAccessible": true,
+ "ReplicationInstanceArn": "arn:aws:dms:us-east-1:123456789012:rep:6UTDJGBOUS3VI3SUWA66XFJCJQ",
+ "ReplicationInstanceClass": "dms.t2.micro",
+ "ReplicationInstanceIdentifier": "test-rep-1",
+ "ReplicationInstanceStatus": "creating",
+ "ReplicationSubnetGroup": {
+ "ReplicationSubnetGroupDescription": "default",
+ "ReplicationSubnetGroupIdentifier": "default",
+ "SubnetGroupStatus": "Complete",
+ "Subnets": [
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1d"
+ },
+ "SubnetIdentifier": "subnet-f6dd91af",
+ "SubnetStatus": "Active"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1b"
+ },
+ "SubnetIdentifier": "subnet-3605751d",
+ "SubnetStatus": "Active"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1c"
+ },
+ "SubnetIdentifier": "subnet-c2daefb5",
+ "SubnetStatus": "Active"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1e"
+ },
+ "SubnetIdentifier": "subnet-85e90cb8",
+ "SubnetStatus": "Active"
+ }
+ ],
+ "VpcId": "vpc-6741a603"
+ }
+ }
+ },
+ "comments": {
+ "output": {
+ }
+ },
+ "description": "Deletes the specified replication instance. You must delete any migration tasks that are associated with the replication instance before you can delete it.\n\n",
+ "id": "delete-replication-instance-1481752552839",
+ "title": "Delete Replication Instance"
+ }
+ ],
+ "DeleteReplicationSubnetGroup": [
+ {
+ "input": {
+ "ReplicationSubnetGroupIdentifier": "us-west-2ab-vpc-215ds366"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Deletes a replication subnet group.",
+ "id": "delete-replication-subnet-group-1481752728597",
+ "title": "Delete Replication Subnet Group"
+ }
+ ],
+ "DeleteReplicationTask": [
+ {
+ "input": {
+ "ReplicationTaskArn": "arn:aws:dms:us-east-1:123456789012:rep:6UTDJGBOUS3VI3SUWA66XFJCJQ"
+ },
+ "output": {
+ "ReplicationTask": {
+ "MigrationType": "full-load",
+ "ReplicationInstanceArn": "arn:aws:dms:us-east-1:123456789012:rep:6UTDJGBOUS3VI3SUWA66XFJCJQ",
+ "ReplicationTaskArn": "arn:aws:dms:us-east-1:123456789012:task:OEAMB3NXSTZ6LFYZFEPPBBXPYM",
+ "ReplicationTaskCreationDate": "2016-12-14T18:25:43Z",
+ "ReplicationTaskIdentifier": "task1",
+ "ReplicationTaskSettings": "{\"TargetMetadata\":{\"TargetSchema\":\"\",\"SupportLobs\":true,\"FullLobMode\":true,\"LobChunkSize\":64,\"LimitedSizeLobMode\":false,\"LobMaxSize\":0},\"FullLoadSettings\":{\"FullLoadEnabled\":true,\"ApplyChangesEnabled\":false,\"TargetTablePrepMode\":\"DROP_AND_CREATE\",\"CreatePkAfterFullLoad\":false,\"StopTaskCachedChangesApplied\":false,\"StopTaskCachedChangesNotApplied\":false,\"ResumeEnabled\":false,\"ResumeMinTableSize\":100000,\"ResumeOnlyClusteredPKTables\":true,\"MaxFullLoadSubTasks\":8,\"TransactionConsistencyTimeout\":600,\"CommitRate\":10000},\"Logging\":{\"EnableLogging\":false}}",
+ "SourceEndpointArn": "arn:aws:dms:us-east-1:123456789012:endpoint:ZW5UAN6P4E77EC7YWHK4RZZ3BE",
+ "Status": "creating",
+ "TableMappings": "file://mappingfile.json",
+ "TargetEndpointArn": "arn:aws:dms:us-east-1:123456789012:endpoint:ASXWXJZLNWNT5HTWCGV2BUJQ7E"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Deletes the specified replication task.",
+ "id": "delete-replication-task-1481752903506",
+ "title": "Delete Replication Task"
+ }
+ ],
+ "DescribeAccountAttributes": [
+ {
+ "input": {
+ },
+ "output": {
+ "AccountQuotas": [
+ {
+ "AccountQuotaName": "ReplicationInstances",
+ "Max": 20,
+ "Used": 0
+ },
+ {
+ "AccountQuotaName": "AllocatedStorage",
+ "Max": 20,
+ "Used": 0
+ },
+ {
+ "AccountQuotaName": "Endpoints",
+ "Max": 20,
+ "Used": 0
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists all of the AWS DMS attributes for a customer account. The attributes include AWS DMS quotas for the account, such as the number of replication instances allowed. The description for a quota includes the quota name, current usage toward that quota, and the quota's maximum value. This operation does not take any parameters.",
+ "id": "describe-acount-attributes-1481753085663",
+ "title": "Describe acount attributes"
+ }
+ ],
+ "DescribeCertificates": [
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "string",
+ "Values": [
+ "string",
+ "string"
+ ]
+ }
+ ],
+ "Marker": "",
+ "MaxRecords": 123
+ },
+ "output": {
+ "Certificates": [
+
+ ],
+ "Marker": ""
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Provides a description of the certificate.",
+ "id": "describe-certificates-1481753186244",
+ "title": "Describe certificates"
+ }
+ ],
+ "DescribeConnections": [
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "string",
+ "Values": [
+ "string",
+ "string"
+ ]
+ }
+ ],
+ "Marker": "",
+ "MaxRecords": 123
+ },
+ "output": {
+ "Connections": [
+ {
+ "EndpointArn": "arn:aws:dms:us-east-arn:aws:dms:us-east-1:123456789012:endpoint:ZW5UAN6P4E77EC7YWHK4RZZ3BE",
+ "EndpointIdentifier": "testsrc1",
+ "ReplicationInstanceArn": "arn:aws:dms:us-east-1:123456789012:rep:6UTDJGBOUS3VI3SUWA66XFJCJQ",
+ "ReplicationInstanceIdentifier": "test",
+ "Status": "successful"
+ }
+ ],
+ "Marker": ""
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Describes the status of the connections that have been made between the replication instance and an endpoint. Connections are created when you test an endpoint.",
+ "id": "describe-connections-1481754477953",
+ "title": "Describe connections"
+ }
+ ],
+ "DescribeEndpointTypes": [
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "string",
+ "Values": [
+ "string",
+ "string"
+ ]
+ }
+ ],
+ "Marker": "",
+ "MaxRecords": 123
+ },
+ "output": {
+ "Marker": "",
+ "SupportedEndpointTypes": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns information about the type of endpoints available.",
+ "id": "describe-endpoint-types-1481754742591",
+ "title": "Describe endpoint types"
+ }
+ ],
+ "DescribeEndpoints": [
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "string",
+ "Values": [
+ "string",
+ "string"
+ ]
+ }
+ ],
+ "Marker": "",
+ "MaxRecords": 123
+ },
+ "output": {
+ "Endpoints": [
+
+ ],
+ "Marker": ""
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns information about the endpoints for your account in the current region.",
+ "id": "describe-endpoints-1481754926060",
+ "title": "Describe endpoints"
+ }
+ ],
+ "DescribeOrderableReplicationInstances": [
+ {
+ "input": {
+ "Marker": "",
+ "MaxRecords": 123
+ },
+ "output": {
+ "Marker": "",
+ "OrderableReplicationInstances": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns information about the replication instance types that can be created in the specified region.",
+ "id": "describe-orderable-replication-instances-1481755123669",
+ "title": "Describe orderable replication instances"
+ }
+ ],
+ "DescribeRefreshSchemasStatus": [
+ {
+ "input": {
+ "EndpointArn": ""
+ },
+ "output": {
+ "RefreshSchemasStatus": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns the status of the refresh-schemas operation.",
+ "id": "describe-refresh-schema-status-1481755303497",
+ "title": "Describe refresh schema status"
+ }
+ ],
+ "DescribeReplicationInstances": [
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "string",
+ "Values": [
+ "string",
+ "string"
+ ]
+ }
+ ],
+ "Marker": "",
+ "MaxRecords": 123
+ },
+ "output": {
+ "Marker": "",
+ "ReplicationInstances": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns the status of the refresh-schemas operation.",
+ "id": "describe-replication-instances-1481755443952",
+ "title": "Describe replication instances"
+ }
+ ],
+ "DescribeReplicationSubnetGroups": [
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "string",
+ "Values": [
+ "string",
+ "string"
+ ]
+ }
+ ],
+ "Marker": "",
+ "MaxRecords": 123
+ },
+ "output": {
+ "Marker": "",
+ "ReplicationSubnetGroups": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns information about the replication subnet groups.",
+ "id": "describe-replication-subnet-groups-1481755621284",
+ "title": "Describe replication subnet groups"
+ }
+ ],
+ "DescribeReplicationTasks": [
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "string",
+ "Values": [
+ "string",
+ "string"
+ ]
+ }
+ ],
+ "Marker": "",
+ "MaxRecords": 123
+ },
+ "output": {
+ "Marker": "",
+ "ReplicationTasks": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns information about replication tasks for your account in the current region.",
+ "id": "describe-replication-tasks-1481755777563",
+ "title": "Describe replication tasks"
+ }
+ ],
+ "DescribeSchemas": [
+ {
+ "input": {
+ "EndpointArn": "",
+ "Marker": "",
+ "MaxRecords": 123
+ },
+ "output": {
+ "Marker": "",
+ "Schemas": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns information about the schema for the specified endpoint.",
+ "id": "describe-schemas-1481755933924",
+ "title": "Describe schemas"
+ }
+ ],
+ "DescribeTableStatistics": [
+ {
+ "input": {
+ "Marker": "",
+ "MaxRecords": 123,
+ "ReplicationTaskArn": ""
+ },
+ "output": {
+ "Marker": "",
+ "ReplicationTaskArn": "",
+ "TableStatistics": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns table statistics on the database migration task, including table name, rows inserted, rows updated, and rows deleted.",
+ "id": "describe-table-statistics-1481756071890",
+ "title": "Describe table statistics"
+ }
+ ],
+ "ImportCertificate": [
+ {
+ "input": {
+ "CertificateIdentifier": "",
+ "CertificatePem": ""
+ },
+ "output": {
+ "Certificate": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Uploads the specified certificate.",
+ "id": "import-certificate-1481756197206",
+ "title": "Import certificate"
+ }
+ ],
+ "ListTagsForResource": [
+ {
+ "input": {
+ "ResourceArn": ""
+ },
+ "output": {
+ "TagList": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists all tags for an AWS DMS resource.",
+ "id": "list-tags-for-resource-1481761095501",
+ "title": "List tags for resource"
+ }
+ ],
+ "ModifyEndpoint": [
+ {
+ "input": {
+ "CertificateArn": "",
+ "DatabaseName": "",
+ "EndpointArn": "",
+ "EndpointIdentifier": "",
+ "EndpointType": "source",
+ "EngineName": "",
+ "ExtraConnectionAttributes": "",
+ "Password": "",
+ "Port": 123,
+ "ServerName": "",
+ "SslMode": "require",
+ "Username": ""
+ },
+ "output": {
+ "Endpoint": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Modifies the specified endpoint.",
+ "id": "modify-endpoint-1481761649937",
+ "title": "Modify endpoint"
+ }
+ ],
+ "ModifyReplicationInstance": [
+ {
+ "input": {
+ "AllocatedStorage": 123,
+ "AllowMajorVersionUpgrade": true,
+ "ApplyImmediately": true,
+ "AutoMinorVersionUpgrade": true,
+ "EngineVersion": "1.5.0",
+ "MultiAZ": true,
+ "PreferredMaintenanceWindow": "sun:06:00-sun:14:00",
+ "ReplicationInstanceArn": "arn:aws:dms:us-east-1:123456789012:rep:6UTDJGBOUS3VI3SUWA66XFJCJQ",
+ "ReplicationInstanceClass": "dms.t2.micro",
+ "ReplicationInstanceIdentifier": "test-rep-1",
+ "VpcSecurityGroupIds": [
+
+ ]
+ },
+ "output": {
+ "ReplicationInstance": {
+ "AllocatedStorage": 5,
+ "AutoMinorVersionUpgrade": true,
+ "EngineVersion": "1.5.0",
+ "KmsKeyId": "arn:aws:kms:us-east-1:123456789012:key/4c1731d6-5435-ed4d-be13-d53411a7cfbd",
+ "PendingModifiedValues": {
+ },
+ "PreferredMaintenanceWindow": "sun:06:00-sun:14:00",
+ "PubliclyAccessible": true,
+ "ReplicationInstanceArn": "arn:aws:dms:us-east-1:123456789012:rep:6UTDJGBOUS3VI3SUWA66XFJCJQ",
+ "ReplicationInstanceClass": "dms.t2.micro",
+ "ReplicationInstanceIdentifier": "test-rep-1",
+ "ReplicationInstanceStatus": "available",
+ "ReplicationSubnetGroup": {
+ "ReplicationSubnetGroupDescription": "default",
+ "ReplicationSubnetGroupIdentifier": "default",
+ "SubnetGroupStatus": "Complete",
+ "Subnets": [
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1d"
+ },
+ "SubnetIdentifier": "subnet-f6dd91af",
+ "SubnetStatus": "Active"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1b"
+ },
+ "SubnetIdentifier": "subnet-3605751d",
+ "SubnetStatus": "Active"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1c"
+ },
+ "SubnetIdentifier": "subnet-c2daefb5",
+ "SubnetStatus": "Active"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1e"
+ },
+ "SubnetIdentifier": "subnet-85e90cb8",
+ "SubnetStatus": "Active"
+ }
+ ],
+ "VpcId": "vpc-6741a603"
+ }
+ }
+ },
+ "comments": {
+ "output": {
+ }
+ },
+ "description": "Modifies the replication instance to apply new settings. You can change one or more parameters by specifying these parameters and the new values in the request. Some settings are applied during the maintenance window.",
+ "id": "modify-replication-instance-1481761784746",
+ "title": "Modify replication instance"
+ }
+ ],
+ "ModifyReplicationSubnetGroup": [
+ {
+ "input": {
+ "ReplicationSubnetGroupDescription": "",
+ "ReplicationSubnetGroupIdentifier": "",
+ "SubnetIds": [
+
+ ]
+ },
+ "output": {
+ "ReplicationSubnetGroup": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Modifies the settings for the specified replication subnet group.",
+ "id": "modify-replication-subnet-group-1481762275392",
+ "title": "Modify replication subnet group"
+ }
+ ],
+ "RefreshSchemas": [
+ {
+ "input": {
+ "EndpointArn": "",
+ "ReplicationInstanceArn": ""
+ },
+ "output": {
+ "RefreshSchemasStatus": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Populates the schema for the specified endpoint. This is an asynchronous operation and can take several minutes. You can check the status of this operation by calling the describe-refresh-schemas-status operation.",
+ "id": "refresh-schema-1481762399111",
+ "title": "Refresh schema"
+ }
+ ],
+ "RemoveTagsFromResource": [
+ {
+ "input": {
+ "ResourceArn": "arn:aws:dms:us-east-1:123456789012:endpoint:ASXWXJZLNWNT5HTWCGV2BUJQ7E",
+ "TagKeys": [
+
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Removes metadata tags from an AWS DMS resource.",
+ "id": "remove-tags-from-resource-1481762571330",
+ "title": "Remove tags from resource"
+ }
+ ],
+ "StartReplicationTask": [
+ {
+ "input": {
+ "CdcStartTime": "2016-12-14T13:33:20Z",
+ "ReplicationTaskArn": "arn:aws:dms:us-east-1:123456789012:rep:6UTDJGBOUS3VI3SUWA66XFJCJQ",
+ "StartReplicationTaskType": "start-replication"
+ },
+ "output": {
+ "ReplicationTask": {
+ "MigrationType": "full-load",
+ "ReplicationInstanceArn": "arn:aws:dms:us-east-1:123456789012:rep:6UTDJGBOUS3VI3SUWA66XFJCJQ",
+ "ReplicationTaskArn": "arn:aws:dms:us-east-1:123456789012:task:OEAMB3NXSTZ6LFYZFEPPBBXPYM",
+ "ReplicationTaskCreationDate": "2016-12-14T18:25:43Z",
+ "ReplicationTaskIdentifier": "task1",
+ "ReplicationTaskSettings": "{\"TargetMetadata\":{\"TargetSchema\":\"\",\"SupportLobs\":true,\"FullLobMode\":true,\"LobChunkSize\":64,\"LimitedSizeLobMode\":false,\"LobMaxSize\":0},\"FullLoadSettings\":{\"FullLoadEnabled\":true,\"ApplyChangesEnabled\":false,\"TargetTablePrepMode\":\"DROP_AND_CREATE\",\"CreatePkAfterFullLoad\":false,\"StopTaskCachedChangesApplied\":false,\"StopTaskCachedChangesNotApplied\":false,\"ResumeEnabled\":false,\"ResumeMinTableSize\":100000,\"ResumeOnlyClusteredPKTables\":true,\"MaxFullLoadSubTasks\":8,\"TransactionConsistencyTimeout\":600,\"CommitRate\":10000},\"Logging\":{\"EnableLogging\":false}}",
+ "SourceEndpointArn": "arn:aws:dms:us-east-1:123456789012:endpoint:ZW5UAN6P4E77EC7YWHK4RZZ3BE",
+ "Status": "creating",
+ "TableMappings": "file://mappingfile.json",
+ "TargetEndpointArn": "arn:aws:dms:us-east-1:123456789012:endpoint:ASXWXJZLNWNT5HTWCGV2BUJQ7E"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Starts the replication task.",
+ "id": "start-replication-task-1481762706778",
+ "title": "Start replication task"
+ }
+ ],
+ "StopReplicationTask": [
+ {
+ "input": {
+ "ReplicationTaskArn": "arn:aws:dms:us-east-1:123456789012:endpoint:ASXWXJZLNWNT5HTWCGV2BUJQ7E"
+ },
+ "output": {
+ "ReplicationTask": {
+ "MigrationType": "full-load",
+ "ReplicationInstanceArn": "arn:aws:dms:us-east-1:123456789012:rep:6UTDJGBOUS3VI3SUWA66XFJCJQ",
+ "ReplicationTaskArn": "arn:aws:dms:us-east-1:123456789012:task:OEAMB3NXSTZ6LFYZFEPPBBXPYM",
+ "ReplicationTaskCreationDate": "2016-12-14T18:25:43Z",
+ "ReplicationTaskIdentifier": "task1",
+ "ReplicationTaskSettings": "{\"TargetMetadata\":{\"TargetSchema\":\"\",\"SupportLobs\":true,\"FullLobMode\":true,\"LobChunkSize\":64,\"LimitedSizeLobMode\":false,\"LobMaxSize\":0},\"FullLoadSettings\":{\"FullLoadEnabled\":true,\"ApplyChangesEnabled\":false,\"TargetTablePrepMode\":\"DROP_AND_CREATE\",\"CreatePkAfterFullLoad\":false,\"StopTaskCachedChangesApplied\":false,\"StopTaskCachedChangesNotApplied\":false,\"ResumeEnabled\":false,\"ResumeMinTableSize\":100000,\"ResumeOnlyClusteredPKTables\":true,\"MaxFullLoadSubTasks\":8,\"TransactionConsistencyTimeout\":600,\"CommitRate\":10000},\"Logging\":{\"EnableLogging\":false}}",
+ "SourceEndpointArn": "arn:aws:dms:us-east-1:123456789012:endpoint:ZW5UAN6P4E77EC7YWHK4RZZ3BE",
+ "Status": "creating",
+ "TableMappings": "file://mappingfile.json",
+ "TargetEndpointArn": "arn:aws:dms:us-east-1:123456789012:endpoint:ASXWXJZLNWNT5HTWCGV2BUJQ7E"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Stops the replication task.",
+ "id": "stop-replication-task-1481762924947",
+ "title": "Stop replication task"
+ }
+ ],
+ "TestConnection": [
+ {
+ "input": {
+ "EndpointArn": "arn:aws:dms:us-east-1:123456789012:endpoint:RAAR3R22XSH46S3PWLC3NJAWKM",
+ "ReplicationInstanceArn": "arn:aws:dms:us-east-1:123456789012:rep:6UTDJGBOUS3VI3SUWA66XFJCJQ"
+ },
+ "output": {
+ "Connection": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Tests the connection between the replication instance and the endpoint.",
+ "id": "test-conection-1481763017636",
+ "title": "Test conection"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dms/2016-01-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/dms/2016-01-01/paginators-1.json
new file mode 100644
index 00000000..054b79c2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dms/2016-01-01/paginators-1.json
@@ -0,0 +1,88 @@
+{
+ "pagination": {
+ "DescribeSchemas": {
+ "result_key": "Schemas",
+ "output_token": "Marker",
+ "input_token": "Marker",
+ "limit_key": "MaxRecords"
+ },
+ "DescribeCertificates": {
+ "result_key": "Certificates",
+ "output_token": "Marker",
+ "input_token": "Marker",
+ "limit_key": "MaxRecords"
+ },
+ "DescribeEndpoints": {
+ "result_key": "Endpoints",
+ "output_token": "Marker",
+ "input_token": "Marker",
+ "limit_key": "MaxRecords"
+ },
+ "DescribeEventSubscriptions": {
+ "result_key": "EventSubscriptionsList",
+ "output_token": "Marker",
+ "input_token": "Marker",
+ "limit_key": "MaxRecords"
+ },
+ "DescribeEndpointTypes": {
+ "result_key": "SupportedEndpointTypes",
+ "output_token": "Marker",
+ "input_token": "Marker",
+ "limit_key": "MaxRecords"
+ },
+ "DescribeReplicationInstances": {
+ "result_key": "ReplicationInstances",
+ "output_token": "Marker",
+ "input_token": "Marker",
+ "limit_key": "MaxRecords"
+ },
+ "DescribeTableStatistics": {
+ "result_key": "TableStatistics",
+ "output_token": "Marker",
+ "input_token": "Marker",
+ "limit_key": "MaxRecords"
+ },
+ "DescribeConnections": {
+ "result_key": "Connections",
+ "output_token": "Marker",
+ "input_token": "Marker",
+ "limit_key": "MaxRecords"
+ },
+ "DescribeReplicationTaskAssessmentResults": {
+ "result_key": "ReplicationTaskAssessmentResults",
+ "output_token": "Marker",
+ "input_token": "Marker",
+ "limit_key": "MaxRecords"
+ },
+ "DescribeEvents": {
+ "result_key": "Events",
+ "output_token": "Marker",
+ "input_token": "Marker",
+ "limit_key": "MaxRecords"
+ },
+ "DescribeOrderableReplicationInstances": {
+ "result_key": "OrderableReplicationInstances",
+ "output_token": "Marker",
+ "input_token": "Marker",
+ "limit_key": "MaxRecords"
+ },
+ "DescribeReplicationSubnetGroups": {
+ "result_key": "ReplicationSubnetGroups",
+ "output_token": "Marker",
+ "input_token": "Marker",
+ "limit_key": "MaxRecords"
+ },
+ "DescribeReplicationTasks": {
+ "result_key": "ReplicationTasks",
+ "output_token": "Marker",
+ "input_token": "Marker",
+ "limit_key": "MaxRecords"
+ },
+ "DescribeDataMigrations": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "DataMigrations"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dms/2016-01-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/dms/2016-01-01/service-2.json.gz
new file mode 100644
index 00000000..49f8d86f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dms/2016-01-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dms/2016-01-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/dms/2016-01-01/waiters-2.json
new file mode 100644
index 00000000..73fba510
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dms/2016-01-01/waiters-2.json
@@ -0,0 +1,330 @@
+{
+ "version":2,
+ "waiters":{
+ "TestConnectionSucceeds":{
+ "acceptors":[
+ {
+ "argument":"Connections[].Status",
+ "expected":"successful",
+ "matcher":"pathAll",
+ "state":"success"
+ },
+ {
+ "argument":"Connections[].Status",
+ "expected":"failed",
+ "matcher":"pathAny",
+ "state":"failure"
+ }
+ ],
+ "delay":5,
+ "description":"Wait until testing connection succeeds.",
+ "maxAttempts":60,
+ "operation":"DescribeConnections"
+ },
+ "EndpointDeleted":{
+ "acceptors":[
+ {
+ "expected":"ResourceNotFoundFault",
+ "matcher":"error",
+ "state":"success"
+ },
+ {
+ "argument":"Endpoints[].Status",
+ "expected":"active",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"Endpoints[].Status",
+ "expected":"creating",
+ "matcher":"pathAny",
+ "state":"failure"
+ }
+ ],
+ "delay":5,
+ "description":"Wait until testing endpoint is deleted.",
+ "maxAttempts":60,
+ "operation":"DescribeEndpoints"
+ },
+ "ReplicationInstanceAvailable":{
+ "acceptors":[
+ {
+ "argument":"ReplicationInstances[].ReplicationInstanceStatus",
+ "expected":"available",
+ "matcher":"pathAll",
+ "state":"success"
+ },
+ {
+ "argument":"ReplicationInstances[].ReplicationInstanceStatus",
+ "expected":"deleting",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationInstances[].ReplicationInstanceStatus",
+ "expected":"incompatible-credentials",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationInstances[].ReplicationInstanceStatus",
+ "expected":"incompatible-network",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationInstances[].ReplicationInstanceStatus",
+ "expected":"inaccessible-encryption-credentials",
+ "matcher":"pathAny",
+ "state":"failure"
+ }
+ ],
+ "delay":60,
+ "description":"Wait until DMS replication instance is available.",
+ "maxAttempts":60,
+ "operation":"DescribeReplicationInstances"
+ },
+ "ReplicationInstanceDeleted":{
+ "acceptors":[
+ {
+ "argument":"ReplicationInstances[].ReplicationInstanceStatus",
+ "expected":"available",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "expected":"ResourceNotFoundFault",
+ "matcher":"error",
+ "state":"success"
+ }
+ ],
+ "delay":15,
+ "description":"Wait until DMS replication instance is deleted.",
+ "maxAttempts":60,
+ "operation":"DescribeReplicationInstances"
+ },
+ "ReplicationTaskReady":{
+ "acceptors":[
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"ready",
+ "matcher":"pathAll",
+ "state":"success"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"starting",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"running",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"stopping",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"stopped",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"failed",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"modifying",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"testing",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"deleting",
+ "matcher":"pathAny",
+ "state":"failure"
+ }
+ ],
+ "delay":15,
+ "description":"Wait until DMS replication task is ready.",
+ "maxAttempts":60,
+ "operation":"DescribeReplicationTasks"
+ },
+ "ReplicationTaskStopped":{
+ "acceptors":[
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"stopped",
+ "matcher":"pathAll",
+ "state":"success"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"ready",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"creating",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"starting",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"failed",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"modifying",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"testing",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"deleting",
+ "matcher":"pathAny",
+ "state":"failure"
+ }
+ ],
+ "delay":15,
+ "description":"Wait until DMS replication task is stopped.",
+ "maxAttempts":60,
+ "operation":"DescribeReplicationTasks"
+ },
+ "ReplicationTaskRunning":{
+ "acceptors":[
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"running",
+ "matcher":"pathAll",
+ "state":"success"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"ready",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"creating",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"stopping",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"stopped",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"failed",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"modifying",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"testing",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"deleting",
+ "matcher":"pathAny",
+ "state":"failure"
+ }
+ ],
+ "delay":15,
+ "description":"Wait until DMS replication task is running.",
+ "maxAttempts":60,
+ "operation":"DescribeReplicationTasks"
+ },
+ "ReplicationTaskDeleted":{
+ "acceptors":[
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"ready",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"creating",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"stopped",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"running",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"ReplicationTasks[].Status",
+ "expected":"failed",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "expected":"ResourceNotFoundFault",
+ "matcher":"error",
+ "state":"success"
+ }
+ ],
+ "delay":15,
+ "description":"Wait until DMS replication task is deleted.",
+ "maxAttempts":60,
+ "operation":"DescribeReplicationTasks"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/docdb-elastic/2022-11-28/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/docdb-elastic/2022-11-28/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..7f1f2353
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/docdb-elastic/2022-11-28/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/docdb-elastic/2022-11-28/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/docdb-elastic/2022-11-28/paginators-1.json
new file mode 100644
index 00000000..bed516d0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/docdb-elastic/2022-11-28/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListClusterSnapshots": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "snapshots"
+ },
+ "ListClusters": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "clusters"
+ },
+ "ListPendingMaintenanceActions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "resourcePendingMaintenanceActions"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/docdb-elastic/2022-11-28/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/docdb-elastic/2022-11-28/service-2.json.gz
new file mode 100644
index 00000000..6891eef2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/docdb-elastic/2022-11-28/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..5bff65a6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/paginators-1.json
new file mode 100644
index 00000000..cc1a2f17
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/paginators-1.json
@@ -0,0 +1,82 @@
+{
+ "pagination": {
+ "DescribeCertificates": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "Certificates"
+ },
+ "DescribeDBClusterParameterGroups": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBClusterParameterGroups"
+ },
+ "DescribeDBClusterParameters": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "Parameters"
+ },
+ "DescribeDBClusterSnapshots": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBClusterSnapshots"
+ },
+ "DescribeDBClusters": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBClusters"
+ },
+ "DescribeDBEngineVersions": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBEngineVersions"
+ },
+ "DescribeDBInstances": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBInstances"
+ },
+ "DescribeDBSubnetGroups": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBSubnetGroups"
+ },
+ "DescribeEvents": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "Events"
+ },
+ "DescribeOrderableDBInstanceOptions": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "OrderableDBInstanceOptions"
+ },
+ "DescribePendingMaintenanceActions": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "PendingMaintenanceActions"
+ },
+ "DescribeEventSubscriptions": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "EventSubscriptionsList"
+ },
+ "DescribeGlobalClusters": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "GlobalClusters"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/service-2.json.gz
new file mode 100644
index 00000000..ce619b2d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/service-2.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/service-2.sdk-extras.json
new file mode 100644
index 00000000..85e8a104
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/service-2.sdk-extras.json
@@ -0,0 +1,23 @@
+ {
+ "version": 1.0,
+ "merge": {
+ "shapes": {
+ "CopyDBClusterSnapshotMessage": {
+ "members": {
+ "SourceRegion": {
+ "shape": "String",
+ "documentation": "<p>The ID of the region that contains the snapshot to be copied.</p>"
+ }
+ }
+ },
+ "CreateDBClusterMessage": {
+ "members": {
+ "SourceRegion": {
+ "shape": "String",
+ "documentation": "<p>The ID of the region that contains the source for the db cluster.</p>"
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/waiters-2.json
new file mode 100644
index 00000000..e75f03b2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/docdb/2014-10-31/waiters-2.json
@@ -0,0 +1,90 @@
+{
+ "version": 2,
+ "waiters": {
+ "DBInstanceAvailable": {
+ "delay": 30,
+ "operation": "DescribeDBInstances",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "incompatible-restore",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "incompatible-parameters",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ }
+ ]
+ },
+ "DBInstanceDeleted": {
+ "delay": 30,
+ "operation": "DescribeDBInstances",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "DBInstanceNotFound",
+ "matcher": "error",
+ "state": "success"
+ },
+ {
+ "expected": "creating",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "modifying",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "rebooting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "resetting-master-credentials",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/drs/2020-02-26/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/drs/2020-02-26/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..309cb67b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/drs/2020-02-26/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/drs/2020-02-26/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/drs/2020-02-26/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/drs/2020-02-26/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/drs/2020-02-26/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/drs/2020-02-26/paginators-1.json
new file mode 100644
index 00000000..cfe134c7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/drs/2020-02-26/paginators-1.json
@@ -0,0 +1,70 @@
+{
+ "pagination": {
+ "DescribeJobLogItems": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "DescribeJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "DescribeRecoveryInstances": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "DescribeRecoverySnapshots": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "DescribeReplicationConfigurationTemplates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "DescribeSourceServers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListExtensibleSourceServers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListStagingAccounts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "accounts"
+ },
+ "DescribeLaunchConfigurationTemplates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "DescribeSourceNetworks": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListLaunchActions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/drs/2020-02-26/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/drs/2020-02-26/service-2.json.gz
new file mode 100644
index 00000000..67191dde
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/drs/2020-02-26/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ds-data/2023-05-31/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ds-data/2023-05-31/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..f0448712
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ds-data/2023-05-31/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ds-data/2023-05-31/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ds-data/2023-05-31/paginators-1.json
new file mode 100644
index 00000000..50381355
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ds-data/2023-05-31/paginators-1.json
@@ -0,0 +1,40 @@
+{
+ "pagination": {
+ "ListGroupMembers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Members"
+ },
+ "ListGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Groups"
+ },
+ "ListGroupsForMember": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Groups"
+ },
+ "ListUsers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Users"
+ },
+ "SearchGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Groups"
+ },
+ "SearchUsers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Users"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ds-data/2023-05-31/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/ds-data/2023-05-31/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..35f9e238
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ds-data/2023-05-31/paginators-1.sdk-extras.json
@@ -0,0 +1,46 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "ListGroupMembers": {
+ "non_aggregate_keys": [
+ "DirectoryId",
+ "MemberRealm",
+ "Realm"
+ ]
+ },
+ "ListGroups": {
+ "non_aggregate_keys": [
+ "DirectoryId",
+ "Realm"
+ ]
+ },
+ "ListGroupsForMember": {
+ "non_aggregate_keys": [
+ "DirectoryId",
+ "MemberRealm",
+ "Realm"
+ ]
+ },
+ "ListUsers": {
+ "non_aggregate_keys": [
+ "DirectoryId",
+ "Realm"
+ ]
+ },
+ "SearchGroups": {
+ "non_aggregate_keys": [
+ "DirectoryId",
+ "Realm"
+ ]
+ },
+ "SearchUsers": {
+ "non_aggregate_keys": [
+ "DirectoryId",
+ "Realm"
+ ]
+ }
+ }
+ }
+ }
+ \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ds-data/2023-05-31/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ds-data/2023-05-31/service-2.json.gz
new file mode 100644
index 00000000..68b283ab
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ds-data/2023-05-31/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ds/2015-04-16/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ds/2015-04-16/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..1b234094
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ds/2015-04-16/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ds/2015-04-16/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ds/2015-04-16/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ds/2015-04-16/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ds/2015-04-16/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ds/2015-04-16/paginators-1.json
new file mode 100644
index 00000000..fd7f0b9e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ds/2015-04-16/paginators-1.json
@@ -0,0 +1,86 @@
+{
+ "pagination": {
+ "DescribeDomainControllers": {
+ "result_key": "DomainControllers",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "Limit"
+ },
+ "DescribeDirectories": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "DirectoryDescriptions"
+ },
+ "DescribeSharedDirectories": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "SharedDirectories"
+ },
+ "DescribeSnapshots": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "Snapshots"
+ },
+ "DescribeTrusts": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "Trusts"
+ },
+ "ListIpRoutes": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "IpRoutesInfo"
+ },
+ "ListLogSubscriptions": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "LogSubscriptions"
+ },
+ "ListSchemaExtensions": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "SchemaExtensionsInfo"
+ },
+ "ListTagsForResource": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "Tags"
+ },
+ "DescribeClientAuthenticationSettings": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "ClientAuthenticationSettingsInfo"
+ },
+ "DescribeLDAPSSettings": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "LDAPSSettingsInfo"
+ },
+ "DescribeRegions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "RegionsDescription"
+ },
+ "DescribeUpdateDirectory": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "UpdateActivities"
+ },
+ "ListCertificates": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "CertificatesInfo"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ds/2015-04-16/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ds/2015-04-16/service-2.json.gz
new file mode 100644
index 00000000..7515c9b1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ds/2015-04-16/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dsql/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/dsql/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..8c656f24
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dsql/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dsql/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/dsql/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..c9cfb66e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dsql/2018-05-10/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListClusters": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "clusters"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dsql/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/dsql/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..1a36cef0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dsql/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dsql/2018-05-10/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/dsql/2018-05-10/waiters-2.json
new file mode 100644
index 00000000..69cd9baa
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dsql/2018-05-10/waiters-2.json
@@ -0,0 +1,28 @@
+{
+ "version" : 2,
+ "waiters" : {
+ "ClusterActive" : {
+ "description" : "Wait until a Cluster is ACTIVE",
+ "delay" : 2,
+ "maxAttempts" : 60,
+ "operation" : "GetCluster",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "ACTIVE"
+ } ]
+ },
+ "ClusterNotExists" : {
+ "description" : "Wait until a Cluster is gone",
+ "delay" : 2,
+ "maxAttempts" : 60,
+ "operation" : "GetCluster",
+ "acceptors" : [ {
+ "matcher" : "error",
+ "state" : "success",
+ "expected" : "ResourceNotFoundException"
+ } ]
+ }
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2011-12-05/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2011-12-05/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..425488c1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2011-12-05/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2011-12-05/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2011-12-05/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2011-12-05/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2012-08-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2012-08-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b67860fa
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2012-08-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2012-08-10/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2012-08-10/examples-1.json
new file mode 100644
index 00000000..bbc763c9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2012-08-10/examples-1.json
@@ -0,0 +1,631 @@
+{
+ "version": "1.0",
+ "examples": {
+ "BatchGetItem": [
+ {
+ "input": {
+ "RequestItems": {
+ "Music": {
+ "Keys": [
+ {
+ "Artist": {
+ "S": "No One You Know"
+ },
+ "SongTitle": {
+ "S": "Call Me Today"
+ }
+ },
+ {
+ "Artist": {
+ "S": "Acme Band"
+ },
+ "SongTitle": {
+ "S": "Happy Day"
+ }
+ },
+ {
+ "Artist": {
+ "S": "No One You Know"
+ },
+ "SongTitle": {
+ "S": "Scared of My Shadow"
+ }
+ }
+ ],
+ "ProjectionExpression": "AlbumTitle"
+ }
+ }
+ },
+ "output": {
+ "Responses": {
+ "Music": [
+ {
+ "AlbumTitle": {
+ "S": "Somewhat Famous"
+ }
+ },
+ {
+ "AlbumTitle": {
+ "S": "Blue Sky Blues"
+ }
+ },
+ {
+ "AlbumTitle": {
+ "S": "Louder Than Ever"
+ }
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example reads multiple items from the Music table using a batch of three GetItem requests. Only the AlbumTitle attribute is returned.",
+ "id": "to-retrieve-multiple-items-from-a-table-1476118438992",
+ "title": "To retrieve multiple items from a table"
+ }
+ ],
+ "BatchWriteItem": [
+ {
+ "input": {
+ "RequestItems": {
+ "Music": [
+ {
+ "PutRequest": {
+ "Item": {
+ "AlbumTitle": {
+ "S": "Somewhat Famous"
+ },
+ "Artist": {
+ "S": "No One You Know"
+ },
+ "SongTitle": {
+ "S": "Call Me Today"
+ }
+ }
+ }
+ },
+ {
+ "PutRequest": {
+ "Item": {
+ "AlbumTitle": {
+ "S": "Songs About Life"
+ },
+ "Artist": {
+ "S": "Acme Band"
+ },
+ "SongTitle": {
+ "S": "Happy Day"
+ }
+ }
+ }
+ },
+ {
+ "PutRequest": {
+ "Item": {
+ "AlbumTitle": {
+ "S": "Blue Sky Blues"
+ },
+ "Artist": {
+ "S": "No One You Know"
+ },
+ "SongTitle": {
+ "S": "Scared of My Shadow"
+ }
+ }
+ }
+ }
+ ]
+ }
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example adds three new items to the Music table using a batch of three PutItem requests.",
+ "id": "to-add-multiple-items-to-a-table-1476118519747",
+ "title": "To add multiple items to a table"
+ }
+ ],
+ "CreateTable": [
+ {
+ "input": {
+ "AttributeDefinitions": [
+ {
+ "AttributeName": "Artist",
+ "AttributeType": "S"
+ },
+ {
+ "AttributeName": "SongTitle",
+ "AttributeType": "S"
+ }
+ ],
+ "KeySchema": [
+ {
+ "AttributeName": "Artist",
+ "KeyType": "HASH"
+ },
+ {
+ "AttributeName": "SongTitle",
+ "KeyType": "RANGE"
+ }
+ ],
+ "ProvisionedThroughput": {
+ "ReadCapacityUnits": 5,
+ "WriteCapacityUnits": 5
+ },
+ "TableName": "Music"
+ },
+ "output": {
+ "TableDescription": {
+ "AttributeDefinitions": [
+ {
+ "AttributeName": "Artist",
+ "AttributeType": "S"
+ },
+ {
+ "AttributeName": "SongTitle",
+ "AttributeType": "S"
+ }
+ ],
+ "CreationDateTime": "1421866952.062",
+ "ItemCount": 0,
+ "KeySchema": [
+ {
+ "AttributeName": "Artist",
+ "KeyType": "HASH"
+ },
+ {
+ "AttributeName": "SongTitle",
+ "KeyType": "RANGE"
+ }
+ ],
+ "ProvisionedThroughput": {
+ "ReadCapacityUnits": 5,
+ "WriteCapacityUnits": 5
+ },
+ "TableName": "Music",
+ "TableSizeBytes": 0,
+ "TableStatus": "CREATING"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a table named Music.",
+ "id": "to-create-a-table-1476116291743",
+ "title": "To create a table"
+ }
+ ],
+ "DeleteItem": [
+ {
+ "input": {
+ "Key": {
+ "Artist": {
+ "S": "No One You Know"
+ },
+ "SongTitle": {
+ "S": "Scared of My Shadow"
+ }
+ },
+ "TableName": "Music"
+ },
+ "output": {
+ "ConsumedCapacity": {
+ "CapacityUnits": 1,
+ "TableName": "Music"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes an item from the Music table.",
+ "id": "to-delete-an-item-1475884573758",
+ "title": "To delete an item"
+ }
+ ],
+ "DeleteTable": [
+ {
+ "input": {
+ "TableName": "Music"
+ },
+ "output": {
+ "TableDescription": {
+ "ItemCount": 0,
+ "ProvisionedThroughput": {
+ "NumberOfDecreasesToday": 1,
+ "ReadCapacityUnits": 5,
+ "WriteCapacityUnits": 5
+ },
+ "TableName": "Music",
+ "TableSizeBytes": 0,
+ "TableStatus": "DELETING"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the Music table.",
+ "id": "to-delete-a-table-1475884368755",
+ "title": "To delete a table"
+ }
+ ],
+ "DescribeLimits": [
+ {
+ "input": {
+ },
+ "output": {
+ "AccountMaxReadCapacityUnits": 20000,
+ "AccountMaxWriteCapacityUnits": 20000,
+ "TableMaxReadCapacityUnits": 10000,
+ "TableMaxWriteCapacityUnits": 10000
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the maximum read and write capacity units per table, and for the AWS account, in the current AWS region.",
+ "id": "to-determine-capacity-limits-per-table-and-account-in-the-current-aws-region-1475884162064",
+ "title": "To determine capacity limits per table and account, in the current AWS region"
+ }
+ ],
+ "DescribeTable": [
+ {
+ "input": {
+ "TableName": "Music"
+ },
+ "output": {
+ "Table": {
+ "AttributeDefinitions": [
+ {
+ "AttributeName": "Artist",
+ "AttributeType": "S"
+ },
+ {
+ "AttributeName": "SongTitle",
+ "AttributeType": "S"
+ }
+ ],
+ "CreationDateTime": "1421866952.062",
+ "ItemCount": 0,
+ "KeySchema": [
+ {
+ "AttributeName": "Artist",
+ "KeyType": "HASH"
+ },
+ {
+ "AttributeName": "SongTitle",
+ "KeyType": "RANGE"
+ }
+ ],
+ "ProvisionedThroughput": {
+ "NumberOfDecreasesToday": 1,
+ "ReadCapacityUnits": 5,
+ "WriteCapacityUnits": 5
+ },
+ "TableName": "Music",
+ "TableSizeBytes": 0,
+ "TableStatus": "ACTIVE"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the Music table.",
+ "id": "to-describe-a-table-1475884440502",
+ "title": "To describe a table"
+ }
+ ],
+ "GetItem": [
+ {
+ "input": {
+ "Key": {
+ "Artist": {
+ "S": "Acme Band"
+ },
+ "SongTitle": {
+ "S": "Happy Day"
+ }
+ },
+ "TableName": "Music"
+ },
+ "output": {
+ "Item": {
+ "AlbumTitle": {
+ "S": "Songs About Life"
+ },
+ "Artist": {
+ "S": "Acme Band"
+ },
+ "SongTitle": {
+ "S": "Happy Day"
+ }
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example retrieves an item from the Music table. The table has a partition key and a sort key (Artist and SongTitle), so you must specify both of these attributes.",
+ "id": "to-read-an-item-from-a-table-1475884258350",
+ "title": "To read an item from a table"
+ }
+ ],
+ "ListTables": [
+ {
+ "input": {
+ },
+ "output": {
+ "TableNames": [
+ "Forum",
+ "ProductCatalog",
+ "Reply",
+ "Thread"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists all of the tables associated with the current AWS account and endpoint.",
+ "id": "to-list-tables-1475884741238",
+ "title": "To list tables"
+ }
+ ],
+ "PutItem": [
+ {
+ "input": {
+ "Item": {
+ "AlbumTitle": {
+ "S": "Somewhat Famous"
+ },
+ "Artist": {
+ "S": "No One You Know"
+ },
+ "SongTitle": {
+ "S": "Call Me Today"
+ }
+ },
+ "ReturnConsumedCapacity": "TOTAL",
+ "TableName": "Music"
+ },
+ "output": {
+ "ConsumedCapacity": {
+ "CapacityUnits": 1,
+ "TableName": "Music"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example adds a new item to the Music table.",
+ "id": "to-add-an-item-to-a-table-1476116191110",
+ "title": "To add an item to a table"
+ }
+ ],
+ "Query": [
+ {
+ "input": {
+ "ExpressionAttributeValues": {
+ ":v1": {
+ "S": "No One You Know"
+ }
+ },
+ "KeyConditionExpression": "Artist = :v1",
+ "ProjectionExpression": "SongTitle",
+ "TableName": "Music"
+ },
+ "output": {
+ "ConsumedCapacity": {
+ },
+ "Count": 2,
+ "Items": [
+ {
+ "SongTitle": {
+ "S": "Call Me Today"
+ }
+ }
+ ],
+ "ScannedCount": 2
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example queries items in the Music table. The table has a partition key and sort key (Artist and SongTitle), but this query only specifies the partition key value. It returns song titles by the artist named \"No One You Know\".",
+ "id": "to-query-an-item-1475883874631",
+ "title": "To query an item"
+ }
+ ],
+ "Scan": [
+ {
+ "input": {
+ "ExpressionAttributeNames": {
+ "#AT": "AlbumTitle",
+ "#ST": "SongTitle"
+ },
+ "ExpressionAttributeValues": {
+ ":a": {
+ "S": "No One You Know"
+ }
+ },
+ "FilterExpression": "Artist = :a",
+ "ProjectionExpression": "#ST, #AT",
+ "TableName": "Music"
+ },
+ "output": {
+ "ConsumedCapacity": {
+ },
+ "Count": 2,
+ "Items": [
+ {
+ "AlbumTitle": {
+ "S": "Somewhat Famous"
+ },
+ "SongTitle": {
+ "S": "Call Me Today"
+ }
+ },
+ {
+ "AlbumTitle": {
+ "S": "Blue Sky Blues"
+ },
+ "SongTitle": {
+ "S": "Scared of My Shadow"
+ }
+ }
+ ],
+ "ScannedCount": 3
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example scans the entire Music table, and then narrows the results to songs by the artist \"No One You Know\". For each item, only the album title and song title are returned.",
+ "id": "to-scan-a-table-1475883652470",
+ "title": "To scan a table"
+ }
+ ],
+ "UpdateItem": [
+ {
+ "input": {
+ "ExpressionAttributeNames": {
+ "#AT": "AlbumTitle",
+ "#Y": "Year"
+ },
+ "ExpressionAttributeValues": {
+ ":t": {
+ "S": "Louder Than Ever"
+ },
+ ":y": {
+ "N": "2015"
+ }
+ },
+ "Key": {
+ "Artist": {
+ "S": "Acme Band"
+ },
+ "SongTitle": {
+ "S": "Happy Day"
+ }
+ },
+ "ReturnValues": "ALL_NEW",
+ "TableName": "Music",
+ "UpdateExpression": "SET #Y = :y, #AT = :t"
+ },
+ "output": {
+ "Attributes": {
+ "AlbumTitle": {
+ "S": "Louder Than Ever"
+ },
+ "Artist": {
+ "S": "Acme Band"
+ },
+ "SongTitle": {
+ "S": "Happy Day"
+ },
+ "Year": {
+ "N": "2015"
+ }
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example updates an item in the Music table. It adds a new attribute (Year) and modifies the AlbumTitle attribute. All of the attributes in the item, as they appear after the update, are returned in the response.",
+ "id": "to-update-an-item-in-a-table-1476118250055",
+ "title": "To update an item in a table"
+ }
+ ],
+ "UpdateTable": [
+ {
+ "input": {
+ "ProvisionedThroughput": {
+ "ReadCapacityUnits": 10,
+ "WriteCapacityUnits": 10
+ },
+ "TableName": "MusicCollection"
+ },
+ "output": {
+ "TableDescription": {
+ "AttributeDefinitions": [
+ {
+ "AttributeName": "Artist",
+ "AttributeType": "S"
+ },
+ {
+ "AttributeName": "SongTitle",
+ "AttributeType": "S"
+ }
+ ],
+ "CreationDateTime": "1421866952.062",
+ "ItemCount": 0,
+ "KeySchema": [
+ {
+ "AttributeName": "Artist",
+ "KeyType": "HASH"
+ },
+ {
+ "AttributeName": "SongTitle",
+ "KeyType": "RANGE"
+ }
+ ],
+ "ProvisionedThroughput": {
+ "LastIncreaseDateTime": "1421874759.194",
+ "NumberOfDecreasesToday": 1,
+ "ReadCapacityUnits": 1,
+ "WriteCapacityUnits": 1
+ },
+ "TableName": "MusicCollection",
+ "TableSizeBytes": 0,
+ "TableStatus": "UPDATING"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example increases the provisioned read and write capacity on the Music table.",
+ "id": "to-modify-a-tables-provisioned-throughput-1476118076147",
+ "title": "To modify a table's provisioned throughput"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2012-08-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2012-08-10/paginators-1.json
new file mode 100644
index 00000000..8e10a0c7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2012-08-10/paginators-1.json
@@ -0,0 +1,47 @@
+{
+ "pagination": {
+ "ListBackups": {
+ "input_token": "ExclusiveStartBackupArn",
+ "output_token": "LastEvaluatedBackupArn",
+ "limit_key": "Limit",
+ "result_key": "BackupSummaries"
+ },
+ "ListTables": {
+ "input_token": "ExclusiveStartTableName",
+ "output_token": "LastEvaluatedTableName",
+ "limit_key": "Limit",
+ "result_key": "TableNames"
+ },
+ "Query": {
+ "input_token": "ExclusiveStartKey",
+ "output_token": "LastEvaluatedKey",
+ "limit_key": "Limit",
+ "result_key": [
+ "Items",
+ "Count",
+ "ScannedCount"
+ ],
+ "non_aggregate_keys": [
+ "ConsumedCapacity"
+ ]
+ },
+ "Scan": {
+ "input_token": "ExclusiveStartKey",
+ "output_token": "LastEvaluatedKey",
+ "limit_key": "Limit",
+ "result_key": [
+ "Items",
+ "Count",
+ "ScannedCount"
+ ],
+ "non_aggregate_keys": [
+ "ConsumedCapacity"
+ ]
+ },
+ "ListTagsOfResource": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Tags"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2012-08-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2012-08-10/service-2.json.gz
new file mode 100644
index 00000000..18eb114a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2012-08-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2012-08-10/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2012-08-10/waiters-2.json
new file mode 100644
index 00000000..43a55ca7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dynamodb/2012-08-10/waiters-2.json
@@ -0,0 +1,35 @@
+{
+ "version": 2,
+ "waiters": {
+ "TableExists": {
+ "delay": 20,
+ "operation": "DescribeTable",
+ "maxAttempts": 25,
+ "acceptors": [
+ {
+ "expected": "ACTIVE",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Table.TableStatus"
+ },
+ {
+ "expected": "ResourceNotFoundException",
+ "matcher": "error",
+ "state": "retry"
+ }
+ ]
+ },
+ "TableNotExists": {
+ "delay": 20,
+ "operation": "DescribeTable",
+ "maxAttempts": 25,
+ "acceptors": [
+ {
+ "expected": "ResourceNotFoundException",
+ "matcher": "error",
+ "state": "success"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dynamodbstreams/2012-08-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/dynamodbstreams/2012-08-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..99fd0035
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dynamodbstreams/2012-08-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dynamodbstreams/2012-08-10/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/dynamodbstreams/2012-08-10/examples-1.json
new file mode 100644
index 00000000..8287e2c4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dynamodbstreams/2012-08-10/examples-1.json
@@ -0,0 +1,212 @@
+{
+ "version": "1.0",
+ "examples": {
+ "DescribeStream": [
+ {
+ "input": {
+ "StreamArn": "arn:aws:dynamodb:us-west-2:111122223333:table/Forum/stream/2015-05-20T20:51:10.252"
+ },
+ "output": {
+ "StreamDescription": {
+ "CreationRequestDateTime": "Wed May 20 13:51:10 PDT 2015",
+ "KeySchema": [
+ {
+ "AttributeName": "ForumName",
+ "KeyType": "HASH"
+ },
+ {
+ "AttributeName": "Subject",
+ "KeyType": "RANGE"
+ }
+ ],
+ "Shards": [
+ {
+ "SequenceNumberRange": {
+ "EndingSequenceNumber": "20500000000000000910398",
+ "StartingSequenceNumber": "20500000000000000910398"
+ },
+ "ShardId": "shardId-00000001414562045508-2bac9cd2"
+ },
+ {
+ "ParentShardId": "shardId-00000001414562045508-2bac9cd2",
+ "SequenceNumberRange": {
+ "EndingSequenceNumber": "820400000000000001192334",
+ "StartingSequenceNumber": "820400000000000001192334"
+ },
+ "ShardId": "shardId-00000001414576573621-f55eea83"
+ },
+ {
+ "ParentShardId": "shardId-00000001414576573621-f55eea83",
+ "SequenceNumberRange": {
+ "EndingSequenceNumber": "1683700000000000001135967",
+ "StartingSequenceNumber": "1683700000000000001135967"
+ },
+ "ShardId": "shardId-00000001414592258131-674fd923"
+ },
+ {
+ "ParentShardId": "shardId-00000001414592258131-674fd923",
+ "SequenceNumberRange": {
+ "StartingSequenceNumber": "2574600000000000000935255"
+ },
+ "ShardId": "shardId-00000001414608446368-3a1afbaf"
+ }
+ ],
+ "StreamArn": "arn:aws:dynamodb:us-west-2:111122223333:table/Forum/stream/2015-05-20T20:51:10.252",
+ "StreamLabel": "2015-05-20T20:51:10.252",
+ "StreamStatus": "ENABLED",
+ "StreamViewType": "NEW_AND_OLD_IMAGES",
+ "TableName": "Forum"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example describes a stream with a given stream ARN.",
+ "id": "to-describe-a-stream-with-a-given-stream-arn-1473457835200",
+ "title": "To describe a stream with a given stream ARN"
+ }
+ ],
+ "GetRecords": [
+ {
+ "input": {
+ "ShardIterator": "arn:aws:dynamodb:us-west-2:111122223333:table/Forum/stream/2015-05-20T20:51:10.252|1|AAAAAAAAAAEvJp6D+zaQ... <remaining characters omitted> ..."
+ },
+ "output": {
+ "NextShardIterator": "arn:aws:dynamodb:us-west-2:111122223333:table/Forum/stream/2015-05-20T20:51:10.252|1|AAAAAAAAAAGQBYshYDEe ... <remaining characters omitted> ...",
+ "Records": [
+ {
+ "awsRegion": "us-west-2",
+ "dynamodb": {
+ "ApproximateCreationDateTime": "1.46480646E9",
+ "Keys": {
+ "ForumName": {
+ "S": "DynamoDB"
+ },
+ "Subject": {
+ "S": "DynamoDB Thread 3"
+ }
+ },
+ "SequenceNumber": "300000000000000499659",
+ "SizeBytes": 41,
+ "StreamViewType": "KEYS_ONLY"
+ },
+ "eventID": "e2fd9c34eff2d779b297b26f5fef4206",
+ "eventName": "INSERT",
+ "eventSource": "aws:dynamodb",
+ "eventVersion": "1.0"
+ },
+ {
+ "awsRegion": "us-west-2",
+ "dynamodb": {
+ "ApproximateCreationDateTime": "1.46480527E9",
+ "Keys": {
+ "ForumName": {
+ "S": "DynamoDB"
+ },
+ "Subject": {
+ "S": "DynamoDB Thread 1"
+ }
+ },
+ "SequenceNumber": "400000000000000499660",
+ "SizeBytes": 41,
+ "StreamViewType": "KEYS_ONLY"
+ },
+ "eventID": "4b25bd0da9a181a155114127e4837252",
+ "eventName": "MODIFY",
+ "eventSource": "aws:dynamodb",
+ "eventVersion": "1.0"
+ },
+ {
+ "awsRegion": "us-west-2",
+ "dynamodb": {
+ "ApproximateCreationDateTime": "1.46480646E9",
+ "Keys": {
+ "ForumName": {
+ "S": "DynamoDB"
+ },
+ "Subject": {
+ "S": "DynamoDB Thread 2"
+ }
+ },
+ "SequenceNumber": "500000000000000499661",
+ "SizeBytes": 41,
+ "StreamViewType": "KEYS_ONLY"
+ },
+ "eventID": "740280c73a3df7842edab3548a1b08ad",
+ "eventName": "REMOVE",
+ "eventSource": "aws:dynamodb",
+ "eventVersion": "1.0"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example retrieves all the stream records from a shard.",
+ "id": "to-retrieve-all-the-stream-records-from-a-shard-1473707781419",
+ "title": "To retrieve all the stream records from a shard"
+ }
+ ],
+ "GetShardIterator": [
+ {
+ "input": {
+ "ShardId": "00000001414576573621-f55eea83",
+ "ShardIteratorType": "TRIM_HORIZON",
+ "StreamArn": "arn:aws:dynamodb:us-west-2:111122223333:table/Forum/stream/2015-05-20T20:51:10.252"
+ },
+ "output": {
+ "ShardIterator": "arn:aws:dynamodb:us-west-2:111122223333:table/Forum/stream/2015-05-20T20:51:10.252|1|AAAAAAAAAAEvJp6D+zaQ... <remaining characters omitted> ..."
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns a shard iterator for the provided stream ARN and shard ID.",
+ "id": "to-obtain-a-shard-iterator-for-the-provided-stream-arn-and-shard-id-1473459941476",
+ "title": "To obtain a shard iterator for the provided stream ARN and shard ID"
+ }
+ ],
+ "ListStreams": [
+ {
+ "input": {
+ },
+ "output": {
+ "Streams": [
+ {
+ "StreamArn": "arn:aws:dynamodb:us-wesst-2:111122223333:table/Forum/stream/2015-05-20T20:51:10.252",
+ "StreamLabel": "2015-05-20T20:51:10.252",
+ "TableName": "Forum"
+ },
+ {
+ "StreamArn": "arn:aws:dynamodb:us-west-2:111122223333:table/Forum/stream/2015-05-20T20:50:02.714",
+ "StreamLabel": "2015-05-20T20:50:02.714",
+ "TableName": "Forum"
+ },
+ {
+ "StreamArn": "arn:aws:dynamodb:us-west-2:111122223333:table/Forum/stream/2015-05-19T23:03:50.641",
+ "StreamLabel": "2015-05-19T23:03:50.641",
+ "TableName": "Forum"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example lists all of the stream ARNs.",
+ "id": "to-list-all-of-the-stream-arns--1473459534285",
+ "title": "To list all of the stream ARNs "
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dynamodbstreams/2012-08-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/dynamodbstreams/2012-08-10/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dynamodbstreams/2012-08-10/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/dynamodbstreams/2012-08-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/dynamodbstreams/2012-08-10/service-2.json.gz
new file mode 100644
index 00000000..2e361a1f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/dynamodbstreams/2012-08-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ebs/2019-11-02/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ebs/2019-11-02/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..2cb17c07
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ebs/2019-11-02/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ebs/2019-11-02/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ebs/2019-11-02/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ebs/2019-11-02/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ebs/2019-11-02/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ebs/2019-11-02/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ebs/2019-11-02/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ebs/2019-11-02/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ebs/2019-11-02/service-2.json.gz
new file mode 100644
index 00000000..b295a63c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ebs/2019-11-02/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2-instance-connect/2018-04-02/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ec2-instance-connect/2018-04-02/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..a32bb787
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2-instance-connect/2018-04-02/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2-instance-connect/2018-04-02/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2-instance-connect/2018-04-02/examples-1.json
new file mode 100644
index 00000000..c5c60013
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2-instance-connect/2018-04-02/examples-1.json
@@ -0,0 +1,34 @@
+{
+ "version": "1.0",
+ "examples": {
+ "SendSSHPublicKey": [
+ {
+ "input": {
+ "AvailabilityZone": "us-west-2a",
+ "InstanceId": "i-abcd1234",
+ "InstanceOSUser": "ec2-user",
+ "SSHPublicKey": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC3FlHqj2eqCdrGHuA6dRjfZXQ4HX5lXEIRHaNbxEwE5Te7xNF7StwhrDtiV7IdT5fDqbRyGw/szPj3xGkNTVoElCZ2dDFb2qYZ1WLIpZwj/UhO9l2mgfjR56UojjQut5Jvn2KZ1OcyrNO0J83kCaJCV7JoVbXY79FBMUccYNY45zmv9+1FMCfY6i2jdIhwR6+yLk8oubL8lIPyq7X+6b9S0yKCkB7Peml1DvghlybpAIUrC9vofHt6XP4V1i0bImw1IlljQS+DUmULRFSccATDscCX9ajnj7Crhm0HAZC0tBPXpFdHkPwL3yzYo546SCS9LKEwz62ymxxbL9k7h09t"
+ },
+ "output": {
+ "RequestId": "abcd1234-abcd-1234-abcd-1234abcd1234",
+ "Success": true
+ },
+ "comments": {
+ "input": {
+ "AvailabilityZone": "The zone where the instance was launched",
+ "InstanceId": "The instance ID to publish the key to.",
+ "InstanceOSUser": "This should be the user you wish to be when ssh-ing to the instance (eg, ec2-user@[instance IP])",
+ "SSHPublicKey": "This should be in standard OpenSSH format (ssh-rsa [key body])"
+ },
+ "output": {
+ "RequestId": "This request ID should be provided when contacting AWS Support.",
+ "Success": "Should be true if the service does not return an error response."
+ }
+ },
+ "description": "The following example pushes a sample SSH public key to the EC2 instance i-abcd1234 in AZ us-west-2b for use by the instance OS user ec2-user.",
+ "id": "send-ssh-key-to-an-ec2-instance-1518124883100",
+ "title": "To push an SSH key to an EC2 instance"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2-instance-connect/2018-04-02/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2-instance-connect/2018-04-02/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2-instance-connect/2018-04-02/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2-instance-connect/2018-04-02/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ec2-instance-connect/2018-04-02/service-2.json.gz
new file mode 100644
index 00000000..64ec3fd0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2-instance-connect/2018-04-02/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-09-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-09-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..aa666da0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-09-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-09-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-09-01/paginators-1.json
new file mode 100644
index 00000000..b643e696
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-09-01/paginators-1.json
@@ -0,0 +1,45 @@
+{
+ "pagination": {
+ "DescribeInstanceStatus": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "InstanceStatuses"
+ },
+ "DescribeInstances": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Reservations"
+ },
+ "DescribeReservedInstancesModifications": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "ReservedInstancesModifications"
+ },
+ "DescribeReservedInstancesOfferings": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ReservedInstancesOfferings"
+ },
+ "DescribeSpotPriceHistory": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SpotPriceHistory"
+ },
+ "DescribeTags": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Tags"
+ },
+ "DescribeVolumeStatus": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "VolumeStatuses"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-09-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-09-01/service-2.json.gz
new file mode 100644
index 00000000..b920e12b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-09-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-09-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-09-01/waiters-2.json
new file mode 100644
index 00000000..fb8c16bd
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-09-01/waiters-2.json
@@ -0,0 +1,341 @@
+{
+ "version": 2,
+ "waiters": {
+ "BundleTaskComplete": {
+ "delay": 15,
+ "operation": "DescribeBundleTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "complete",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "BundleTasks[].State"
+ },
+ {
+ "expected": "failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "BundleTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskCancelled": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "cancelled",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskCompleted": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ },
+ {
+ "expected": "cancelled",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ConversionTasks[].State"
+ },
+ {
+ "expected": "cancelling",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskDeleted": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "CustomerGatewayAvailable": {
+ "delay": 15,
+ "operation": "DescribeCustomerGateways",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "CustomerGateways[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CustomerGateways[].State"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CustomerGateways[].State"
+ }
+ ]
+ },
+ "ExportTaskCancelled": {
+ "delay": 15,
+ "operation": "DescribeExportTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "cancelled",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ExportTasks[].State"
+ }
+ ]
+ },
+ "ExportTaskCompleted": {
+ "delay": 15,
+ "operation": "DescribeExportTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ExportTasks[].State"
+ }
+ ]
+ },
+ "InstanceRunning": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "running",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "shutting-down",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "terminated",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "stopping",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ }
+ ]
+ },
+ "InstanceStopped": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "stopped",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "terminated",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ }
+ ]
+ },
+ "InstanceTerminated": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "terminated",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "stopping",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ }
+ ]
+ },
+ "SnapshotCompleted": {
+ "delay": 15,
+ "operation": "DescribeSnapshots",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Snapshots[].State"
+ }
+ ]
+ },
+ "SubnetAvailable": {
+ "delay": 15,
+ "operation": "DescribeSubnets",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Subnets[].State"
+ }
+ ]
+ },
+ "VolumeAvailable": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Volumes[].State"
+ }
+ ]
+ },
+ "VolumeDeleted": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ }
+ ]
+ },
+ "VolumeInUse": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "in-use",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Volumes[].State"
+ }
+ ]
+ },
+ "VpcAvailable": {
+ "delay": 15,
+ "operation": "DescribeVpcs",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Vpcs[].State"
+ }
+ ]
+ },
+ "VpnConnectionAvailable": {
+ "delay": 15,
+ "operation": "DescribeVpnConnections",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ }
+ ]
+ },
+ "VpnConnectionDeleted": {
+ "delay": 15,
+ "operation": "DescribeVpnConnections",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-10-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-10-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..aa666da0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-10-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-10-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-10-01/paginators-1.json
new file mode 100644
index 00000000..ca7a8767
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-10-01/paginators-1.json
@@ -0,0 +1,51 @@
+{
+ "pagination": {
+ "DescribeInstanceStatus": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "InstanceStatuses"
+ },
+ "DescribeInstances": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Reservations"
+ },
+ "DescribeReservedInstancesModifications": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "ReservedInstancesModifications"
+ },
+ "DescribeReservedInstancesOfferings": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ReservedInstancesOfferings"
+ },
+ "DescribeSpotPriceHistory": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SpotPriceHistory"
+ },
+ "DescribeTags": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Tags"
+ },
+ "DescribeVolumeStatus": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "VolumeStatuses"
+ },
+ "DescribeSnapshots": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Snapshots"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-10-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-10-01/service-2.json.gz
new file mode 100644
index 00000000..5d6997ad
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-10-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-10-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-10-01/waiters-2.json
new file mode 100644
index 00000000..17f08705
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2014-10-01/waiters-2.json
@@ -0,0 +1,436 @@
+{
+ "version": 2,
+ "waiters": {
+ "BundleTaskComplete": {
+ "delay": 15,
+ "operation": "DescribeBundleTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "complete",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "BundleTasks[].State"
+ },
+ {
+ "expected": "failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "BundleTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskCancelled": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "cancelled",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskCompleted": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ },
+ {
+ "expected": "cancelled",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ConversionTasks[].State"
+ },
+ {
+ "expected": "cancelling",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskDeleted": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "CustomerGatewayAvailable": {
+ "delay": 15,
+ "operation": "DescribeCustomerGateways",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "CustomerGateways[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CustomerGateways[].State"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CustomerGateways[].State"
+ }
+ ]
+ },
+ "ExportTaskCancelled": {
+ "delay": 15,
+ "operation": "DescribeExportTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "cancelled",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ExportTasks[].State"
+ }
+ ]
+ },
+ "ExportTaskCompleted": {
+ "delay": 15,
+ "operation": "DescribeExportTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ExportTasks[].State"
+ }
+ ]
+ },
+ "ImageAvailable": {
+ "operation": "DescribeImages",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "Images[].State",
+ "expected": "available"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "Images[].State",
+ "expected": "failed"
+ }
+ ]
+ },
+ "InstanceRunning": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "running",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "shutting-down",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "terminated",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "stopping",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ }
+ ]
+ },
+ "InstanceStatusOk": {
+ "operation": "DescribeInstanceStatus",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "InstanceStatuses[].InstanceStatus.Status",
+ "expected": "ok"
+ }
+ ]
+ },
+ "InstanceStopped": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "stopped",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "terminated",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ }
+ ]
+ },
+ "InstanceTerminated": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "terminated",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "stopping",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ }
+ ]
+ },
+ "PasswordDataAvailable": {
+ "operation": "GetPasswordData",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "length(PasswordData) > `0`",
+ "expected": true
+ }
+ ]
+ },
+ "SnapshotCompleted": {
+ "delay": 15,
+ "operation": "DescribeSnapshots",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Snapshots[].State"
+ }
+ ]
+ },
+ "SpotInstanceRequestFulfilled": {
+ "operation": "DescribeSpotInstanceRequests",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "fulfilled"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "schedule-expired"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "canceled-before-fulfillment"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "bad-parameters"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "system-error"
+ }
+ ]
+ },
+ "SubnetAvailable": {
+ "delay": 15,
+ "operation": "DescribeSubnets",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Subnets[].State"
+ }
+ ]
+ },
+ "SystemStatusOk": {
+ "operation": "DescribeInstanceStatus",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "InstanceStatuses[].SystemStatus.Status",
+ "expected": "ok"
+ }
+ ]
+ },
+ "VolumeAvailable": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Volumes[].State"
+ }
+ ]
+ },
+ "VolumeDeleted": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ }
+ ]
+ },
+ "VolumeInUse": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "in-use",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Volumes[].State"
+ }
+ ]
+ },
+ "VpcAvailable": {
+ "delay": 15,
+ "operation": "DescribeVpcs",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Vpcs[].State"
+ }
+ ]
+ },
+ "VpnConnectionAvailable": {
+ "delay": 15,
+ "operation": "DescribeVpnConnections",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ }
+ ]
+ },
+ "VpnConnectionDeleted": {
+ "delay": 15,
+ "operation": "DescribeVpnConnections",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-03-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-03-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..aa666da0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-03-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-03-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-03-01/paginators-1.json
new file mode 100644
index 00000000..ca7a8767
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-03-01/paginators-1.json
@@ -0,0 +1,51 @@
+{
+ "pagination": {
+ "DescribeInstanceStatus": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "InstanceStatuses"
+ },
+ "DescribeInstances": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Reservations"
+ },
+ "DescribeReservedInstancesModifications": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "ReservedInstancesModifications"
+ },
+ "DescribeReservedInstancesOfferings": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ReservedInstancesOfferings"
+ },
+ "DescribeSpotPriceHistory": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SpotPriceHistory"
+ },
+ "DescribeTags": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Tags"
+ },
+ "DescribeVolumeStatus": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "VolumeStatuses"
+ },
+ "DescribeSnapshots": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Snapshots"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-03-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-03-01/service-2.json.gz
new file mode 100644
index 00000000..5df71c20
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-03-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-03-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-03-01/waiters-2.json
new file mode 100644
index 00000000..17f08705
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-03-01/waiters-2.json
@@ -0,0 +1,436 @@
+{
+ "version": 2,
+ "waiters": {
+ "BundleTaskComplete": {
+ "delay": 15,
+ "operation": "DescribeBundleTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "complete",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "BundleTasks[].State"
+ },
+ {
+ "expected": "failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "BundleTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskCancelled": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "cancelled",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskCompleted": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ },
+ {
+ "expected": "cancelled",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ConversionTasks[].State"
+ },
+ {
+ "expected": "cancelling",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskDeleted": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "CustomerGatewayAvailable": {
+ "delay": 15,
+ "operation": "DescribeCustomerGateways",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "CustomerGateways[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CustomerGateways[].State"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CustomerGateways[].State"
+ }
+ ]
+ },
+ "ExportTaskCancelled": {
+ "delay": 15,
+ "operation": "DescribeExportTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "cancelled",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ExportTasks[].State"
+ }
+ ]
+ },
+ "ExportTaskCompleted": {
+ "delay": 15,
+ "operation": "DescribeExportTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ExportTasks[].State"
+ }
+ ]
+ },
+ "ImageAvailable": {
+ "operation": "DescribeImages",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "Images[].State",
+ "expected": "available"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "Images[].State",
+ "expected": "failed"
+ }
+ ]
+ },
+ "InstanceRunning": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "running",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "shutting-down",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "terminated",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "stopping",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ }
+ ]
+ },
+ "InstanceStatusOk": {
+ "operation": "DescribeInstanceStatus",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "InstanceStatuses[].InstanceStatus.Status",
+ "expected": "ok"
+ }
+ ]
+ },
+ "InstanceStopped": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "stopped",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "terminated",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ }
+ ]
+ },
+ "InstanceTerminated": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "terminated",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "stopping",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ }
+ ]
+ },
+ "PasswordDataAvailable": {
+ "operation": "GetPasswordData",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "length(PasswordData) > `0`",
+ "expected": true
+ }
+ ]
+ },
+ "SnapshotCompleted": {
+ "delay": 15,
+ "operation": "DescribeSnapshots",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Snapshots[].State"
+ }
+ ]
+ },
+ "SpotInstanceRequestFulfilled": {
+ "operation": "DescribeSpotInstanceRequests",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "fulfilled"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "schedule-expired"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "canceled-before-fulfillment"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "bad-parameters"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "system-error"
+ }
+ ]
+ },
+ "SubnetAvailable": {
+ "delay": 15,
+ "operation": "DescribeSubnets",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Subnets[].State"
+ }
+ ]
+ },
+ "SystemStatusOk": {
+ "operation": "DescribeInstanceStatus",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "InstanceStatuses[].SystemStatus.Status",
+ "expected": "ok"
+ }
+ ]
+ },
+ "VolumeAvailable": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Volumes[].State"
+ }
+ ]
+ },
+ "VolumeDeleted": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ }
+ ]
+ },
+ "VolumeInUse": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "in-use",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Volumes[].State"
+ }
+ ]
+ },
+ "VpcAvailable": {
+ "delay": 15,
+ "operation": "DescribeVpcs",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Vpcs[].State"
+ }
+ ]
+ },
+ "VpnConnectionAvailable": {
+ "delay": 15,
+ "operation": "DescribeVpnConnections",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ }
+ ]
+ },
+ "VpnConnectionDeleted": {
+ "delay": 15,
+ "operation": "DescribeVpnConnections",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-04-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-04-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..aa666da0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-04-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-04-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-04-15/paginators-1.json
new file mode 100644
index 00000000..ca7a8767
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-04-15/paginators-1.json
@@ -0,0 +1,51 @@
+{
+ "pagination": {
+ "DescribeInstanceStatus": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "InstanceStatuses"
+ },
+ "DescribeInstances": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Reservations"
+ },
+ "DescribeReservedInstancesModifications": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "ReservedInstancesModifications"
+ },
+ "DescribeReservedInstancesOfferings": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ReservedInstancesOfferings"
+ },
+ "DescribeSpotPriceHistory": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SpotPriceHistory"
+ },
+ "DescribeTags": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Tags"
+ },
+ "DescribeVolumeStatus": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "VolumeStatuses"
+ },
+ "DescribeSnapshots": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Snapshots"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-04-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-04-15/service-2.json.gz
new file mode 100644
index 00000000..2bb28427
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-04-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-04-15/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-04-15/waiters-2.json
new file mode 100644
index 00000000..5a6dbbc9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-04-15/waiters-2.json
@@ -0,0 +1,458 @@
+{
+ "version": 2,
+ "waiters": {
+ "InstanceExists": {
+ "delay": 5,
+ "maxAttempts": 40,
+ "operation": "DescribeInstances",
+ "acceptors": [
+ {
+ "matcher": "status",
+ "expected": 200,
+ "state": "success"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidInstanceIDNotFound",
+ "state": "retry"
+ }
+ ]
+ },
+ "BundleTaskComplete": {
+ "delay": 15,
+ "operation": "DescribeBundleTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "complete",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "BundleTasks[].State"
+ },
+ {
+ "expected": "failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "BundleTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskCancelled": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "cancelled",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskCompleted": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ },
+ {
+ "expected": "cancelled",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ConversionTasks[].State"
+ },
+ {
+ "expected": "cancelling",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskDeleted": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "CustomerGatewayAvailable": {
+ "delay": 15,
+ "operation": "DescribeCustomerGateways",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "CustomerGateways[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CustomerGateways[].State"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CustomerGateways[].State"
+ }
+ ]
+ },
+ "ExportTaskCancelled": {
+ "delay": 15,
+ "operation": "DescribeExportTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "cancelled",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ExportTasks[].State"
+ }
+ ]
+ },
+ "ExportTaskCompleted": {
+ "delay": 15,
+ "operation": "DescribeExportTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ExportTasks[].State"
+ }
+ ]
+ },
+ "ImageAvailable": {
+ "operation": "DescribeImages",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "Images[].State",
+ "expected": "available"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "Images[].State",
+ "expected": "failed"
+ }
+ ]
+ },
+ "InstanceRunning": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "running",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "shutting-down",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "terminated",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "stopping",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ }
+ ]
+ },
+ "InstanceStatusOk": {
+ "operation": "DescribeInstanceStatus",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "InstanceStatuses[].InstanceStatus.Status",
+ "expected": "ok"
+ }
+ ]
+ },
+ "InstanceStopped": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "stopped",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "terminated",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ }
+ ]
+ },
+ "InstanceTerminated": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "terminated",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "stopping",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ }
+ ]
+ },
+ "PasswordDataAvailable": {
+ "operation": "GetPasswordData",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "length(PasswordData) > `0`",
+ "expected": true
+ }
+ ]
+ },
+ "SnapshotCompleted": {
+ "delay": 15,
+ "operation": "DescribeSnapshots",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Snapshots[].State"
+ }
+ ]
+ },
+ "SpotInstanceRequestFulfilled": {
+ "operation": "DescribeSpotInstanceRequests",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "fulfilled"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "schedule-expired"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "canceled-before-fulfillment"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "bad-parameters"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "system-error"
+ }
+ ]
+ },
+ "SubnetAvailable": {
+ "delay": 15,
+ "operation": "DescribeSubnets",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Subnets[].State"
+ }
+ ]
+ },
+ "SystemStatusOk": {
+ "operation": "DescribeInstanceStatus",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "InstanceStatuses[].SystemStatus.Status",
+ "expected": "ok"
+ }
+ ]
+ },
+ "VolumeAvailable": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Volumes[].State"
+ }
+ ]
+ },
+ "VolumeDeleted": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidVolumeNotFound",
+ "state": "success"
+ }
+ ]
+ },
+ "VolumeInUse": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "in-use",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Volumes[].State"
+ }
+ ]
+ },
+ "VpcAvailable": {
+ "delay": 15,
+ "operation": "DescribeVpcs",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Vpcs[].State"
+ }
+ ]
+ },
+ "VpnConnectionAvailable": {
+ "delay": 15,
+ "operation": "DescribeVpnConnections",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ }
+ ]
+ },
+ "VpnConnectionDeleted": {
+ "delay": 15,
+ "operation": "DescribeVpnConnections",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-10-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-10-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..5c789e5a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-10-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-10-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-10-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-10-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-10-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-10-01/paginators-1.json
new file mode 100644
index 00000000..2bd01ad5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-10-01/paginators-1.json
@@ -0,0 +1,63 @@
+{
+ "pagination": {
+ "DescribeInstanceStatus": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "InstanceStatuses"
+ },
+ "DescribeInstances": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Reservations"
+ },
+ "DescribeReservedInstancesOfferings": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ReservedInstancesOfferings"
+ },
+ "DescribeReservedInstancesModifications": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "ReservedInstancesModifications"
+ },
+ "DescribeSnapshots": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Snapshots"
+ },
+ "DescribeSpotFleetRequests": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SpotFleetRequestConfigs"
+ },
+ "DescribeSpotPriceHistory": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SpotPriceHistory"
+ },
+ "DescribeTags": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Tags"
+ },
+ "DescribeVolumeStatus": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "VolumeStatuses"
+ },
+ "DescribeVolumes": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Volumes"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-10-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-10-01/service-2.json.gz
new file mode 100644
index 00000000..c887c99b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-10-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-10-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-10-01/waiters-2.json
new file mode 100644
index 00000000..652a8cad
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2015-10-01/waiters-2.json
@@ -0,0 +1,589 @@
+{
+ "version": 2,
+ "waiters": {
+ "InstanceExists": {
+ "delay": 5,
+ "maxAttempts": 40,
+ "operation": "DescribeInstances",
+ "acceptors": [
+ {
+ "matcher": "path",
+ "expected": true,
+ "argument": "length(Reservations[]) > `0`",
+ "state": "success"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidInstanceID.NotFound",
+ "state": "retry"
+ }
+ ]
+ },
+ "BundleTaskComplete": {
+ "delay": 15,
+ "operation": "DescribeBundleTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "complete",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "BundleTasks[].State"
+ },
+ {
+ "expected": "failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "BundleTasks[].State"
+ }
+ ]
+ },
+ "ConsoleOutputAvailable": {
+ "operation": "GetConsoleOutput",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "length(Output || '') > `0`",
+ "expected": true
+ }
+ ]
+ },
+ "ConversionTaskCancelled": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "cancelled",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskCompleted": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ },
+ {
+ "expected": "cancelled",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ConversionTasks[].State"
+ },
+ {
+ "expected": "cancelling",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskDeleted": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "CustomerGatewayAvailable": {
+ "delay": 15,
+ "operation": "DescribeCustomerGateways",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "CustomerGateways[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CustomerGateways[].State"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CustomerGateways[].State"
+ }
+ ]
+ },
+ "ExportTaskCancelled": {
+ "delay": 15,
+ "operation": "DescribeExportTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "cancelled",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ExportTasks[].State"
+ }
+ ]
+ },
+ "ExportTaskCompleted": {
+ "delay": 15,
+ "operation": "DescribeExportTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ExportTasks[].State"
+ }
+ ]
+ },
+ "ImageExists": {
+ "operation": "DescribeImages",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "matcher": "path",
+ "expected": true,
+ "argument": "length(Images[]) > `0`",
+ "state": "success"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidAMIID.NotFound",
+ "state": "retry"
+ }
+ ]
+ },
+ "ImageAvailable": {
+ "operation": "DescribeImages",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "Images[].State",
+ "expected": "available"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "Images[].State",
+ "expected": "failed"
+ }
+ ]
+ },
+ "InstanceRunning": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "running",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "shutting-down",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "terminated",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "stopping",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidInstanceID.NotFound",
+ "state": "retry"
+ }
+ ]
+ },
+ "InstanceStatusOk": {
+ "operation": "DescribeInstanceStatus",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "InstanceStatuses[].InstanceStatus.Status",
+ "expected": "ok"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidInstanceID.NotFound",
+ "state": "retry"
+ }
+ ]
+ },
+ "InstanceStopped": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "stopped",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "terminated",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ }
+ ]
+ },
+ "InstanceTerminated": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "terminated",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "stopping",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ }
+ ]
+ },
+ "KeyPairExists": {
+ "operation": "DescribeKeyPairs",
+ "delay": 5,
+ "maxAttempts": 6,
+ "acceptors": [
+ {
+ "expected": true,
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "length(KeyPairs[].KeyName) > `0`"
+ },
+ {
+ "expected": "InvalidKeyPair.NotFound",
+ "matcher": "error",
+ "state": "retry"
+ }
+ ]
+ },
+ "NatGatewayAvailable": {
+ "operation": "DescribeNatGateways",
+ "delay": 15,
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "NatGateways[].State",
+ "expected": "available"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "NatGateways[].State",
+ "expected": "failed"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "NatGateways[].State",
+ "expected": "deleting"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "NatGateways[].State",
+ "expected": "deleted"
+ },
+ {
+ "state": "retry",
+ "matcher": "error",
+ "expected": "NatGatewayNotFound"
+ }
+ ]
+ },
+ "NetworkInterfaceAvailable": {
+ "operation": "DescribeNetworkInterfaces",
+ "delay": 20,
+ "maxAttempts": 10,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "NetworkInterfaces[].Status"
+ },
+ {
+ "expected": "InvalidNetworkInterfaceID.NotFound",
+ "matcher": "error",
+ "state": "failure"
+ }
+ ]
+ },
+ "PasswordDataAvailable": {
+ "operation": "GetPasswordData",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "length(PasswordData) > `0`",
+ "expected": true
+ }
+ ]
+ },
+ "SnapshotCompleted": {
+ "delay": 15,
+ "operation": "DescribeSnapshots",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Snapshots[].State"
+ }
+ ]
+ },
+ "SpotInstanceRequestFulfilled": {
+ "operation": "DescribeSpotInstanceRequests",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "fulfilled"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "schedule-expired"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "canceled-before-fulfillment"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "bad-parameters"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "system-error"
+ }
+ ]
+ },
+ "SubnetAvailable": {
+ "delay": 15,
+ "operation": "DescribeSubnets",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Subnets[].State"
+ }
+ ]
+ },
+ "SystemStatusOk": {
+ "operation": "DescribeInstanceStatus",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "InstanceStatuses[].SystemStatus.Status",
+ "expected": "ok"
+ }
+ ]
+ },
+ "VolumeAvailable": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Volumes[].State"
+ }
+ ]
+ },
+ "VolumeDeleted": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidVolume.NotFound",
+ "state": "success"
+ }
+ ]
+ },
+ "VolumeInUse": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "in-use",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Volumes[].State"
+ }
+ ]
+ },
+ "VpcAvailable": {
+ "delay": 15,
+ "operation": "DescribeVpcs",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Vpcs[].State"
+ }
+ ]
+ },
+ "VpnConnectionAvailable": {
+ "delay": 60,
+ "operation": "DescribeVpnConnections",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ }
+ ]
+ },
+ "VpnConnectionDeleted": {
+ "delay": 15,
+ "operation": "DescribeVpnConnections",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ }
+ ]
+ },
+ "VpcPeeringConnectionExists": {
+ "delay": 15,
+ "operation": "DescribeVpcPeeringConnections",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "matcher": "status",
+ "expected": 200,
+ "state": "success"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidVpcPeeringConnectionID.NotFound",
+ "state": "retry"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-04-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-04-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..5c789e5a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-04-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-04-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-04-01/examples-1.json
new file mode 100644
index 00000000..3f584e9f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-04-01/examples-1.json
@@ -0,0 +1,3729 @@
+{
+ "version": "1.0",
+ "examples": {
+ "AllocateAddress": [
+ {
+ "input": {
+ "Domain": "vpc"
+ },
+ "output": {
+ "AllocationId": "eipalloc-64d5890a",
+ "Domain": "vpc",
+ "PublicIp": "203.0.113.0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example allocates an Elastic IP address to use with an instance in a VPC.",
+ "id": "ec2-allocate-address-1",
+ "title": "To allocate an Elastic IP address for EC2-VPC"
+ },
+ {
+ "output": {
+ "Domain": "standard",
+ "PublicIp": "198.51.100.0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example allocates an Elastic IP address to use with an instance in EC2-Classic.",
+ "id": "ec2-allocate-address-2",
+ "title": "To allocate an Elastic IP address for EC2-Classic"
+ }
+ ],
+ "AssignPrivateIpAddresses": [
+ {
+ "input": {
+ "NetworkInterfaceId": "eni-e5aa89a3",
+ "PrivateIpAddresses": [
+ "10.0.0.82"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example assigns the specified secondary private IP address to the specified network interface.",
+ "id": "ec2-assign-private-ip-addresses-1",
+ "title": "To assign a specific secondary private IP address to an interface"
+ },
+ {
+ "input": {
+ "NetworkInterfaceId": "eni-e5aa89a3",
+ "SecondaryPrivateIpAddressCount": 2
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example assigns two secondary private IP addresses to the specified network interface. Amazon EC2 automatically assigns these IP addresses from the available IP addresses in the CIDR block range of the subnet the network interface is associated with.",
+ "id": "ec2-assign-private-ip-addresses-2",
+ "title": "To assign secondary private IP addresses that Amazon EC2 selects to an interface"
+ }
+ ],
+ "AssociateAddress": [
+ {
+ "input": {
+ "AllocationId": "eipalloc-64d5890a",
+ "InstanceId": "i-0b263919b6498b123"
+ },
+ "output": {
+ "AssociationId": "eipassoc-2bebb745"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the specified Elastic IP address with the specified instance in a VPC.",
+ "id": "ec2-associate-address-1",
+ "title": "To associate an Elastic IP address in EC2-VPC"
+ },
+ {
+ "input": {
+ "AllocationId": "eipalloc-64d5890a",
+ "NetworkInterfaceId": "eni-1a2b3c4d"
+ },
+ "output": {
+ "AssociationId": "eipassoc-2bebb745"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the specified Elastic IP address with the specified network interface.",
+ "id": "ec2-associate-address-2",
+ "title": "To associate an Elastic IP address with a network interface"
+ },
+ {
+ "input": {
+ "InstanceId": "i-07ffe74c7330ebf53",
+ "PublicIp": "198.51.100.0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates an Elastic IP address with an instance in EC2-Classic.",
+ "id": "ec2-associate-address-3",
+ "title": "To associate an Elastic IP address in EC2-Classic"
+ }
+ ],
+ "AssociateDhcpOptions": [
+ {
+ "input": {
+ "DhcpOptionsId": "dopt-d9070ebb",
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the specified DHCP options set with the specified VPC.",
+ "id": "ec2-associate-dhcp-options-1",
+ "title": "To associate a DHCP options set with a VPC"
+ },
+ {
+ "input": {
+ "DhcpOptionsId": "default",
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the default DHCP options set with the specified VPC.",
+ "id": "ec2-associate-dhcp-options-2",
+ "title": "To associate the default DHCP options set with a VPC"
+ }
+ ],
+ "AssociateRouteTable": [
+ {
+ "input": {
+ "RouteTableId": "rtb-22574640",
+ "SubnetId": "subnet-9d4a7b6"
+ },
+ "output": {
+ "AssociationId": "rtbassoc-781d0d1a"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the specified route table with the specified subnet.",
+ "id": "ec2-associate-route-table-1",
+ "title": "To associate a route table with a subnet"
+ }
+ ],
+ "AttachInternetGateway": [
+ {
+ "input": {
+ "InternetGatewayId": "igw-c0a643a9",
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example attaches the specified Internet gateway to the specified VPC.",
+ "id": "ec2-attach-internet-gateway-1",
+ "title": "To attach an Internet gateway to a VPC"
+ }
+ ],
+ "AttachNetworkInterface": [
+ {
+ "input": {
+ "DeviceIndex": 1,
+ "InstanceId": "i-1234567890abcdef0",
+ "NetworkInterfaceId": "eni-e5aa89a3"
+ },
+ "output": {
+ "AttachmentId": "eni-attach-66c4350a"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example attaches the specified network interface to the specified instance.",
+ "id": "ec2-attach-network-interface-1",
+ "title": "To attach a network interface to an instance"
+ }
+ ],
+ "AttachVolume": [
+ {
+ "input": {
+ "Device": "/dev/sdf",
+ "InstanceId": "i-01474ef662b89480",
+ "VolumeId": "vol-1234567890abcdef0"
+ },
+ "output": {
+ "AttachTime": "2016-08-29T18:52:32.724Z",
+ "Device": "/dev/sdf",
+ "InstanceId": "i-01474ef662b89480",
+ "State": "attaching",
+ "VolumeId": "vol-1234567890abcdef0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example attaches a volume (``vol-1234567890abcdef0``) to an instance (``i-01474ef662b89480``) as ``/dev/sdf``.",
+ "id": "to-attach-a-volume-to-an-instance-1472499213109",
+ "title": "To attach a volume to an instance"
+ }
+ ],
+ "CancelSpotFleetRequests": [
+ {
+ "input": {
+ "SpotFleetRequestIds": [
+ "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ ],
+ "TerminateInstances": true
+ },
+ "output": {
+ "SuccessfulFleetRequests": [
+ {
+ "CurrentSpotFleetRequestState": "cancelled_running",
+ "PreviousSpotFleetRequestState": "active",
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example cancels the specified Spot fleet request and terminates its associated Spot Instances.",
+ "id": "ec2-cancel-spot-fleet-requests-1",
+ "title": "To cancel a Spot fleet request"
+ },
+ {
+ "input": {
+ "SpotFleetRequestIds": [
+ "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ ],
+ "TerminateInstances": false
+ },
+ "output": {
+ "SuccessfulFleetRequests": [
+ {
+ "CurrentSpotFleetRequestState": "cancelled_terminating",
+ "PreviousSpotFleetRequestState": "active",
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example cancels the specified Spot fleet request without terminating its associated Spot Instances.",
+ "id": "ec2-cancel-spot-fleet-requests-2",
+ "title": "To cancel a Spot fleet request without terminating its Spot Instances"
+ }
+ ],
+ "CancelSpotInstanceRequests": [
+ {
+ "input": {
+ "SpotInstanceRequestIds": [
+ "sir-08b93456"
+ ]
+ },
+ "output": {
+ "CancelledSpotInstanceRequests": [
+ {
+ "SpotInstanceRequestId": "sir-08b93456",
+ "State": "cancelled"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example cancels a Spot Instance request.",
+ "id": "ec2-cancel-spot-instance-requests-1",
+ "title": "To cancel Spot Instance requests"
+ }
+ ],
+ "ConfirmProductInstance": [
+ {
+ "input": {
+ "InstanceId": "i-1234567890abcdef0",
+ "ProductCode": "774F4FF8"
+ },
+ "output": {
+ "OwnerId": "123456789012"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example determines whether the specified product code is associated with the specified instance.",
+ "id": "to-confirm-the-product-instance-1472712108494",
+ "title": "To confirm the product instance"
+ }
+ ],
+ "CopySnapshot": [
+ {
+ "input": {
+ "Description": "This is my copied snapshot.",
+ "DestinationRegion": "us-east-1",
+ "SourceRegion": "us-west-2",
+ "SourceSnapshotId": "snap-066877671789bd71b"
+ },
+ "output": {
+ "SnapshotId": "snap-066877671789bd71b"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example copies a snapshot with the snapshot ID of ``snap-066877671789bd71b`` from the ``us-west-2`` region to the ``us-east-1`` region and adds a short description to identify the snapshot.",
+ "id": "to-copy-a-snapshot-1472502259774",
+ "title": "To copy a snapshot"
+ }
+ ],
+ "CreateCustomerGateway": [
+ {
+ "input": {
+ "BgpAsn": 65534,
+ "PublicIp": "12.1.2.3",
+ "Type": "ipsec.1"
+ },
+ "output": {
+ "CustomerGateway": {
+ "BgpAsn": "65534",
+ "CustomerGatewayId": "cgw-0e11f167",
+ "IpAddress": "12.1.2.3",
+ "State": "available",
+ "Type": "ipsec.1"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a customer gateway with the specified IP address for its outside interface.",
+ "id": "ec2-create-customer-gateway-1",
+ "title": "To create a customer gateway"
+ }
+ ],
+ "CreateDhcpOptions": [
+ {
+ "input": {
+ "DhcpConfigurations": [
+ {
+ "Key": "domain-name-servers",
+ "Values": [
+ "10.2.5.1",
+ "10.2.5.2"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "DhcpOptions": {
+ "DhcpConfigurations": [
+ {
+ "Key": "domain-name-servers",
+ "Values": [
+ "10.2.5.2",
+ "10.2.5.1"
+ ]
+ }
+ ],
+ "DhcpOptionsId": "dopt-d9070ebb"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a DHCP options set.",
+ "id": "ec2-create-dhcp-options-1",
+ "title": "To create a DHCP options set"
+ }
+ ],
+ "CreateInternetGateway": [
+ {
+ "output": {
+ "InternetGateway": {
+ "Attachments": [
+
+ ],
+ "InternetGatewayId": "igw-c0a643a9",
+ "Tags": [
+
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an Internet gateway.",
+ "id": "ec2-create-internet-gateway-1",
+ "title": "To create an Internet gateway"
+ }
+ ],
+ "CreateKeyPair": [
+ {
+ "input": {
+ "KeyName": "my-key-pair"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a key pair named my-key-pair.",
+ "id": "ec2-create-key-pair-1",
+ "title": "To create a key pair"
+ }
+ ],
+ "CreateNatGateway": [
+ {
+ "input": {
+ "AllocationId": "eipalloc-37fc1a52",
+ "SubnetId": "subnet-1a2b3c4d"
+ },
+ "output": {
+ "NatGateway": {
+ "CreateTime": "2015-12-17T12:45:26.732Z",
+ "NatGatewayAddresses": [
+ {
+ "AllocationId": "eipalloc-37fc1a52"
+ }
+ ],
+ "NatGatewayId": "nat-08d48af2a8e83edfd",
+ "State": "pending",
+ "SubnetId": "subnet-1a2b3c4d",
+ "VpcId": "vpc-1122aabb"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a NAT gateway in subnet subnet-1a2b3c4d and associates an Elastic IP address with the allocation ID eipalloc-37fc1a52 with the NAT gateway.",
+ "id": "ec2-create-nat-gateway-1",
+ "title": "To create a NAT gateway"
+ }
+ ],
+ "CreateNetworkAcl": [
+ {
+ "input": {
+ "VpcId": "vpc-a01106c2"
+ },
+ "output": {
+ "NetworkAcl": {
+ "Associations": [
+
+ ],
+ "Entries": [
+ {
+ "CidrBlock": "0.0.0.0/0",
+ "Egress": true,
+ "Protocol": "-1",
+ "RuleAction": "deny",
+ "RuleNumber": 32767
+ },
+ {
+ "CidrBlock": "0.0.0.0/0",
+ "Egress": false,
+ "Protocol": "-1",
+ "RuleAction": "deny",
+ "RuleNumber": 32767
+ }
+ ],
+ "IsDefault": false,
+ "NetworkAclId": "acl-5fb85d36",
+ "Tags": [
+
+ ],
+ "VpcId": "vpc-a01106c2"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a network ACL for the specified VPC.",
+ "id": "ec2-create-network-acl-1",
+ "title": "To create a network ACL"
+ }
+ ],
+ "CreateNetworkAclEntry": [
+ {
+ "input": {
+ "CidrBlock": "0.0.0.0/0",
+ "Egress": false,
+ "NetworkAclId": "acl-5fb85d36",
+ "PortRange": {
+ "From": 53,
+ "To": 53
+ },
+ "Protocol": "udp",
+ "RuleAction": "allow",
+ "RuleNumber": 100
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an entry for the specified network ACL. The rule allows ingress traffic from anywhere (0.0.0.0/0) on UDP port 53 (DNS) into any associated subnet.",
+ "id": "ec2-create-network-acl-entry-1",
+ "title": "To create a network ACL entry"
+ }
+ ],
+ "CreateNetworkInterface": [
+ {
+ "input": {
+ "Description": "my network interface",
+ "Groups": [
+ "sg-903004f8"
+ ],
+ "PrivateIpAddress": "10.0.2.17",
+ "SubnetId": "subnet-9d4a7b6c"
+ },
+ "output": {
+ "NetworkInterface": {
+ "AvailabilityZone": "us-east-1d",
+ "Description": "my network interface",
+ "Groups": [
+ {
+ "GroupId": "sg-903004f8",
+ "GroupName": "default"
+ }
+ ],
+ "MacAddress": "02:1a:80:41:52:9c",
+ "NetworkInterfaceId": "eni-e5aa89a3",
+ "OwnerId": "123456789012",
+ "PrivateIpAddress": "10.0.2.17",
+ "PrivateIpAddresses": [
+ {
+ "Primary": true,
+ "PrivateIpAddress": "10.0.2.17"
+ }
+ ],
+ "RequesterManaged": false,
+ "SourceDestCheck": true,
+ "Status": "pending",
+ "SubnetId": "subnet-9d4a7b6c",
+ "TagSet": [
+
+ ],
+ "VpcId": "vpc-a01106c2"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a network interface for the specified subnet.",
+ "id": "ec2-create-network-interface-1",
+ "title": "To create a network interface"
+ }
+ ],
+ "CreatePlacementGroup": [
+ {
+ "input": {
+ "GroupName": "my-cluster",
+ "Strategy": "cluster"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a placement group with the specified name.",
+ "id": "to-create-a-placement-group-1472712245768",
+ "title": "To create a placement group"
+ }
+ ],
+ "CreateRoute": [
+ {
+ "input": {
+ "DestinationCidrBlock": "0.0.0.0/0",
+ "GatewayId": "igw-c0a643a9",
+ "RouteTableId": "rtb-22574640"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a route for the specified route table. The route matches all traffic (0.0.0.0/0) and routes it to the specified Internet gateway.",
+ "id": "ec2-create-route-1",
+ "title": "To create a route"
+ }
+ ],
+ "CreateRouteTable": [
+ {
+ "input": {
+ "VpcId": "vpc-a01106c2"
+ },
+ "output": {
+ "RouteTable": {
+ "Associations": [
+
+ ],
+ "PropagatingVgws": [
+
+ ],
+ "RouteTableId": "rtb-22574640",
+ "Routes": [
+ {
+ "DestinationCidrBlock": "10.0.0.0/16",
+ "GatewayId": "local",
+ "State": "active"
+ }
+ ],
+ "Tags": [
+
+ ],
+ "VpcId": "vpc-a01106c2"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a route table for the specified VPC.",
+ "id": "ec2-create-route-table-1",
+ "title": "To create a route table"
+ }
+ ],
+ "CreateSnapshot": [
+ {
+ "input": {
+ "Description": "This is my root volume snapshot.",
+ "VolumeId": "vol-1234567890abcdef0"
+ },
+ "output": {
+ "Description": "This is my root volume snapshot.",
+ "OwnerId": "012345678910",
+ "SnapshotId": "snap-066877671789bd71b",
+ "StartTime": "2014-02-28T21:06:01.000Z",
+ "State": "pending",
+ "Tags": [
+
+ ],
+ "VolumeId": "vol-1234567890abcdef0",
+ "VolumeSize": 8
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a snapshot of the volume with a volume ID of ``vol-1234567890abcdef0`` and a short description to identify the snapshot.",
+ "id": "to-create-a-snapshot-1472502529790",
+ "title": "To create a snapshot"
+ }
+ ],
+ "CreateSpotDatafeedSubscription": [
+ {
+ "input": {
+ "Bucket": "my-s3-bucket",
+ "Prefix": "spotdata"
+ },
+ "output": {
+ "SpotDatafeedSubscription": {
+ "Bucket": "my-s3-bucket",
+ "OwnerId": "123456789012",
+ "Prefix": "spotdata",
+ "State": "Active"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a Spot Instance data feed for your AWS account.",
+ "id": "ec2-create-spot-datafeed-subscription-1",
+ "title": "To create a Spot Instance datafeed"
+ }
+ ],
+ "CreateSubnet": [
+ {
+ "input": {
+ "CidrBlock": "10.0.1.0/24",
+ "VpcId": "vpc-a01106c2"
+ },
+ "output": {
+ "Subnet": {
+ "AvailabilityZone": "us-west-2c",
+ "AvailableIpAddressCount": 251,
+ "CidrBlock": "10.0.1.0/24",
+ "State": "pending",
+ "SubnetId": "subnet-9d4a7b6c",
+ "VpcId": "vpc-a01106c2"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a subnet in the specified VPC with the specified CIDR block. We recommend that you let us select an Availability Zone for you.",
+ "id": "ec2-create-subnet-1",
+ "title": "To create a subnet"
+ }
+ ],
+ "CreateTags": [
+ {
+ "input": {
+ "Resources": [
+ "ami-78a54011"
+ ],
+ "Tags": [
+ {
+ "Key": "Stack",
+ "Value": "production"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example adds the tag Stack=production to the specified image, or overwrites an existing tag for the AMI where the tag key is Stack.",
+ "id": "ec2-create-tags-1",
+ "title": "To add a tag to a resource"
+ }
+ ],
+ "CreateVolume": [
+ {
+ "input": {
+ "AvailabilityZone": "us-east-1a",
+ "Size": 80,
+ "VolumeType": "gp2"
+ },
+ "output": {
+ "AvailabilityZone": "us-east-1a",
+ "CreateTime": "2016-08-29T18:52:32.724Z",
+ "Encrypted": false,
+ "Iops": 240,
+ "Size": 80,
+ "SnapshotId": "",
+ "State": "creating",
+ "VolumeId": "vol-6b60b7c7",
+ "VolumeType": "gp2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an 80 GiB General Purpose (SSD) volume in the Availability Zone ``us-east-1a``.",
+ "id": "to-create-a-new-volume-1472496724296",
+ "title": "To create a new volume"
+ },
+ {
+ "input": {
+ "AvailabilityZone": "us-east-1a",
+ "Iops": 1000,
+ "SnapshotId": "snap-066877671789bd71b",
+ "VolumeType": "io1"
+ },
+ "output": {
+ "Attachments": [
+
+ ],
+ "AvailabilityZone": "us-east-1a",
+ "CreateTime": "2016-08-29T18:52:32.724Z",
+ "Iops": 1000,
+ "Size": 500,
+ "SnapshotId": "snap-066877671789bd71b",
+ "State": "creating",
+ "Tags": [
+
+ ],
+ "VolumeId": "vol-1234567890abcdef0",
+ "VolumeType": "io1"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a new Provisioned IOPS (SSD) volume with 1000 provisioned IOPS from a snapshot in the Availability Zone ``us-east-1a``.",
+ "id": "to-create-a-new-provisioned-iops-ssd-volume-from-a-snapshot-1472498975176",
+ "title": "To create a new Provisioned IOPS (SSD) volume from a snapshot"
+ }
+ ],
+ "CreateVpc": [
+ {
+ "input": {
+ "CidrBlock": "10.0.0.0/16"
+ },
+ "output": {
+ "Vpc": {
+ "CidrBlock": "10.0.0.0/16",
+ "DhcpOptionsId": "dopt-7a8b9c2d",
+ "InstanceTenancy": "default",
+ "State": "pending",
+ "VpcId": "vpc-a01106c2"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a VPC with the specified CIDR block.",
+ "id": "ec2-create-vpc-1",
+ "title": "To create a VPC"
+ }
+ ],
+ "DeleteCustomerGateway": [
+ {
+ "input": {
+ "CustomerGatewayId": "cgw-0e11f167"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified customer gateway.",
+ "id": "ec2-delete-customer-gateway-1",
+ "title": "To delete a customer gateway"
+ }
+ ],
+ "DeleteDhcpOptions": [
+ {
+ "input": {
+ "DhcpOptionsId": "dopt-d9070ebb"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified DHCP options set.",
+ "id": "ec2-delete-dhcp-options-1",
+ "title": "To delete a DHCP options set"
+ }
+ ],
+ "DeleteInternetGateway": [
+ {
+ "input": {
+ "InternetGatewayId": "igw-c0a643a9"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified Internet gateway.",
+ "id": "ec2-delete-internet-gateway-1",
+ "title": "To delete an Internet gateway"
+ }
+ ],
+ "DeleteKeyPair": [
+ {
+ "input": {
+ "KeyName": "my-key-pair"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified key pair.",
+ "id": "ec2-delete-key-pair-1",
+ "title": "To delete a key pair"
+ }
+ ],
+ "DeleteNatGateway": [
+ {
+ "input": {
+ "NatGatewayId": "nat-04ae55e711cec5680"
+ },
+ "output": {
+ "NatGatewayId": "nat-04ae55e711cec5680"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified NAT gateway.",
+ "id": "ec2-delete-nat-gateway-1",
+ "title": "To delete a NAT gateway"
+ }
+ ],
+ "DeleteNetworkAcl": [
+ {
+ "input": {
+ "NetworkAclId": "acl-5fb85d36"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified network ACL.",
+ "id": "ec2-delete-network-acl-1",
+ "title": "To delete a network ACL"
+ }
+ ],
+ "DeleteNetworkAclEntry": [
+ {
+ "input": {
+ "Egress": true,
+ "NetworkAclId": "acl-5fb85d36",
+ "RuleNumber": 100
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes ingress rule number 100 from the specified network ACL.",
+ "id": "ec2-delete-network-acl-entry-1",
+ "title": "To delete a network ACL entry"
+ }
+ ],
+ "DeleteNetworkInterface": [
+ {
+ "input": {
+ "NetworkInterfaceId": "eni-e5aa89a3"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified network interface.",
+ "id": "ec2-delete-network-interface-1",
+ "title": "To delete a network interface"
+ }
+ ],
+ "DeletePlacementGroup": [
+ {
+ "input": {
+ "GroupName": "my-cluster"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified placement group.\n",
+ "id": "to-delete-a-placement-group-1472712349959",
+ "title": "To delete a placement group"
+ }
+ ],
+ "DeleteRoute": [
+ {
+ "input": {
+ "DestinationCidrBlock": "0.0.0.0/0",
+ "RouteTableId": "rtb-22574640"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified route from the specified route table.",
+ "id": "ec2-delete-route-1",
+ "title": "To delete a route"
+ }
+ ],
+ "DeleteRouteTable": [
+ {
+ "input": {
+ "RouteTableId": "rtb-22574640"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified route table.",
+ "id": "ec2-delete-route-table-1",
+ "title": "To delete a route table"
+ }
+ ],
+ "DeleteSnapshot": [
+ {
+ "input": {
+ "SnapshotId": "snap-1234567890abcdef0"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes a snapshot with the snapshot ID of ``snap-1234567890abcdef0``. If the command succeeds, no output is returned.",
+ "id": "to-delete-a-snapshot-1472503042567",
+ "title": "To delete a snapshot"
+ }
+ ],
+ "DeleteSpotDatafeedSubscription": [
+ {
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes a Spot data feed subscription for the account.",
+ "id": "ec2-delete-spot-datafeed-subscription-1",
+ "title": "To cancel a Spot Instance data feed subscription"
+ }
+ ],
+ "DeleteSubnet": [
+ {
+ "input": {
+ "SubnetId": "subnet-9d4a7b6c"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified subnet.",
+ "id": "ec2-delete-subnet-1",
+ "title": "To delete a subnet"
+ }
+ ],
+ "DeleteTags": [
+ {
+ "input": {
+ "Resources": [
+ "ami-78a54011"
+ ],
+ "Tags": [
+ {
+ "Key": "Stack",
+ "Value": "test"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the tag Stack=test from the specified image.",
+ "id": "ec2-delete-tags-1",
+ "title": "To delete a tag from a resource"
+ }
+ ],
+ "DeleteVolume": [
+ {
+ "input": {
+ "VolumeId": "vol-049df61146c4d7901"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes an available volume with the volume ID of ``vol-049df61146c4d7901``. If the command succeeds, no output is returned.",
+ "id": "to-delete-a-volume-1472503111160",
+ "title": "To delete a volume"
+ }
+ ],
+ "DeleteVpc": [
+ {
+ "input": {
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified VPC.",
+ "id": "ec2-delete-vpc-1",
+ "title": "To delete a VPC"
+ }
+ ],
+ "DescribeAccountAttributes": [
+ {
+ "input": {
+ "AttributeNames": [
+ "supported-platforms"
+ ]
+ },
+ "output": {
+ "AccountAttributes": [
+ {
+ "AttributeName": "supported-platforms",
+ "AttributeValues": [
+ {
+ "AttributeValue": "EC2"
+ },
+ {
+ "AttributeValue": "VPC"
+ }
+ ]
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the supported-platforms attribute for your AWS account.",
+ "id": "ec2-describe-account-attributes-1",
+ "title": "To describe a single attribute for your AWS account"
+ },
+ {
+ "output": {
+ "AccountAttributes": [
+ {
+ "AttributeName": "supported-platforms",
+ "AttributeValues": [
+ {
+ "AttributeValue": "EC2"
+ },
+ {
+ "AttributeValue": "VPC"
+ }
+ ]
+ },
+ {
+ "AttributeName": "vpc-max-security-groups-per-interface",
+ "AttributeValues": [
+ {
+ "AttributeValue": "5"
+ }
+ ]
+ },
+ {
+ "AttributeName": "max-elastic-ips",
+ "AttributeValues": [
+ {
+ "AttributeValue": "5"
+ }
+ ]
+ },
+ {
+ "AttributeName": "max-instances",
+ "AttributeValues": [
+ {
+ "AttributeValue": "20"
+ }
+ ]
+ },
+ {
+ "AttributeName": "vpc-max-elastic-ips",
+ "AttributeValues": [
+ {
+ "AttributeValue": "5"
+ }
+ ]
+ },
+ {
+ "AttributeName": "default-vpc",
+ "AttributeValues": [
+ {
+ "AttributeValue": "none"
+ }
+ ]
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the attributes for your AWS account.",
+ "id": "ec2-describe-account-attributes-2",
+ "title": "To describe all attributes for your AWS account"
+ }
+ ],
+ "DescribeAddresses": [
+ {
+ "output": {
+ "Addresses": [
+ {
+ "Domain": "standard",
+ "InstanceId": "i-1234567890abcdef0",
+ "PublicIp": "198.51.100.0"
+ },
+ {
+ "AllocationId": "eipalloc-12345678",
+ "AssociationId": "eipassoc-12345678",
+ "Domain": "vpc",
+ "InstanceId": "i-1234567890abcdef0",
+ "NetworkInterfaceId": "eni-12345678",
+ "NetworkInterfaceOwnerId": "123456789012",
+ "PrivateIpAddress": "10.0.1.241",
+ "PublicIp": "203.0.113.0"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes your Elastic IP addresses.",
+ "id": "ec2-describe-addresses-1",
+ "title": "To describe your Elastic IP addresses"
+ },
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "domain",
+ "Values": [
+ "vpc"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "Addresses": [
+ {
+ "AllocationId": "eipalloc-12345678",
+ "AssociationId": "eipassoc-12345678",
+ "Domain": "vpc",
+ "InstanceId": "i-1234567890abcdef0",
+ "NetworkInterfaceId": "eni-12345678",
+ "NetworkInterfaceOwnerId": "123456789012",
+ "PrivateIpAddress": "10.0.1.241",
+ "PublicIp": "203.0.113.0"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes your Elastic IP addresses for use with instances in a VPC.",
+ "id": "ec2-describe-addresses-2",
+ "title": "To describe your Elastic IP addresses for EC2-VPC"
+ },
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "domain",
+ "Values": [
+ "standard"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "Addresses": [
+ {
+ "Domain": "standard",
+ "InstanceId": "i-1234567890abcdef0",
+ "PublicIp": "198.51.100.0"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes your Elastic IP addresses for use with instances in EC2-Classic.",
+ "id": "ec2-describe-addresses-3",
+ "title": "To describe your Elastic IP addresses for EC2-Classic"
+ }
+ ],
+ "DescribeAvailabilityZones": [
+ {
+ "output": {
+ "AvailabilityZones": [
+ {
+ "Messages": [
+
+ ],
+ "RegionName": "us-east-1",
+ "State": "available",
+ "ZoneName": "us-east-1b"
+ },
+ {
+ "Messages": [
+
+ ],
+ "RegionName": "us-east-1",
+ "State": "available",
+ "ZoneName": "us-east-1c"
+ },
+ {
+ "Messages": [
+
+ ],
+ "RegionName": "us-east-1",
+ "State": "available",
+ "ZoneName": "us-east-1d"
+ },
+ {
+ "Messages": [
+
+ ],
+ "RegionName": "us-east-1",
+ "State": "available",
+ "ZoneName": "us-east-1e"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the Availability Zones that are available to you. The response includes Availability Zones only for the current region.",
+ "id": "ec2-describe-availability-zones-1",
+ "title": "To describe your Availability Zones"
+ }
+ ],
+ "DescribeCustomerGateways": [
+ {
+ "input": {
+ "CustomerGatewayIds": [
+ "cgw-0e11f167"
+ ]
+ },
+ "output": {
+ "CustomerGateways": [
+ {
+ "BgpAsn": "65534",
+ "CustomerGatewayId": "cgw-0e11f167",
+ "IpAddress": "12.1.2.3",
+ "State": "available",
+ "Type": "ipsec.1"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified customer gateway.",
+ "id": "ec2-describe-customer-gateways-1",
+ "title": "To describe a customer gateway"
+ }
+ ],
+ "DescribeDhcpOptions": [
+ {
+ "input": {
+ "DhcpOptionsIds": [
+ "dopt-d9070ebb"
+ ]
+ },
+ "output": {
+ "DhcpOptions": [
+ {
+ "DhcpConfigurations": [
+ {
+ "Key": "domain-name-servers",
+ "Values": [
+ "10.2.5.2",
+ "10.2.5.1"
+ ]
+ }
+ ],
+ "DhcpOptionsId": "dopt-d9070ebb"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified DHCP options set.",
+ "id": "ec2-describe-dhcp-options-1",
+ "title": "To describe a DHCP options set"
+ }
+ ],
+ "DescribeInstanceAttribute": [
+ {
+ "input": {
+ "Attribute": "instanceType",
+ "InstanceId": "i-1234567890abcdef0"
+ },
+ "output": {
+ "InstanceId": "i-1234567890abcdef0",
+ "InstanceType": {
+ "Value": "t1.micro"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the instance type of the specified instance.\n",
+ "id": "to-describe-the-instance-type-1472712432132",
+ "title": "To describe the instance type"
+ },
+ {
+ "input": {
+ "Attribute": "disableApiTermination",
+ "InstanceId": "i-1234567890abcdef0"
+ },
+ "output": {
+ "DisableApiTermination": {
+ "Value": "false"
+ },
+ "InstanceId": "i-1234567890abcdef0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the ``disableApiTermination`` attribute of the specified instance.\n",
+ "id": "to-describe-the-disableapitermination-attribute-1472712533466",
+ "title": "To describe the disableApiTermination attribute"
+ },
+ {
+ "input": {
+ "Attribute": "blockDeviceMapping",
+ "InstanceId": "i-1234567890abcdef0"
+ },
+ "output": {
+ "BlockDeviceMappings": [
+ {
+ "DeviceName": "/dev/sda1",
+ "Ebs": {
+ "AttachTime": "2013-05-17T22:42:34.000Z",
+ "DeleteOnTermination": true,
+ "Status": "attached",
+ "VolumeId": "vol-049df61146c4d7901"
+ }
+ },
+ {
+ "DeviceName": "/dev/sdf",
+ "Ebs": {
+ "AttachTime": "2013-09-10T23:07:00.000Z",
+ "DeleteOnTermination": false,
+ "Status": "attached",
+ "VolumeId": "vol-049df61146c4d7901"
+ }
+ }
+ ],
+ "InstanceId": "i-1234567890abcdef0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the ``blockDeviceMapping`` attribute of the specified instance.\n",
+ "id": "to-describe-the-block-device-mapping-for-an-instance-1472712645423",
+ "title": "To describe the block device mapping for an instance"
+ }
+ ],
+ "DescribeInternetGateways": [
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "attachment.vpc-id",
+ "Values": [
+ "vpc-a01106c2"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "InternetGateways": [
+ {
+ "Attachments": [
+ {
+ "State": "available",
+ "VpcId": "vpc-a01106c2"
+ }
+ ],
+ "InternetGatewayId": "igw-c0a643a9",
+ "Tags": [
+
+ ]
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the Internet gateway for the specified VPC.",
+ "id": "ec2-describe-internet-gateways-1",
+ "title": "To describe the Internet gateway for a VPC"
+ }
+ ],
+ "DescribeKeyPairs": [
+ {
+ "input": {
+ "KeyNames": [
+ "my-key-pair"
+ ]
+ },
+ "output": {
+ "KeyPairs": [
+ {
+ "KeyFingerprint": "1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f",
+ "KeyName": "my-key-pair"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example displays the fingerprint for the specified key.",
+ "id": "ec2-describe-key-pairs-1",
+ "title": "To display a key pair"
+ }
+ ],
+ "DescribeMovingAddresses": [
+ {
+ "output": {
+ "MovingAddressStatuses": [
+ {
+ "MoveStatus": "MovingToVpc",
+ "PublicIp": "198.51.100.0"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes all of your moving Elastic IP addresses.",
+ "id": "ec2-describe-moving-addresses-1",
+ "title": "To describe your moving addresses"
+ }
+ ],
+ "DescribeNatGateways": [
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "vpc-id",
+ "Values": [
+ "vpc-1a2b3c4d"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "NatGateways": [
+ {
+ "CreateTime": "2015-12-01T12:26:55.983Z",
+ "NatGatewayAddresses": [
+ {
+ "AllocationId": "eipalloc-89c620ec",
+ "NetworkInterfaceId": "eni-9dec76cd",
+ "PrivateIp": "10.0.0.149",
+ "PublicIp": "198.11.222.333"
+ }
+ ],
+ "NatGatewayId": "nat-05dba92075d71c408",
+ "State": "available",
+ "SubnetId": "subnet-847e4dc2",
+ "VpcId": "vpc-1a2b3c4d"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the NAT gateway for the specified VPC.",
+ "id": "ec2-describe-nat-gateways-1",
+ "title": "To describe a NAT gateway"
+ }
+ ],
+ "DescribeNetworkAcls": [
+ {
+ "input": {
+ "NetworkAclIds": [
+ "acl-5fb85d36"
+ ]
+ },
+ "output": {
+ "NetworkAcls": [
+ {
+ "Associations": [
+ {
+ "NetworkAclAssociationId": "aclassoc-66ea5f0b",
+ "NetworkAclId": "acl-9aeb5ef7",
+ "SubnetId": "subnet-65ea5f08"
+ }
+ ],
+ "Entries": [
+ {
+ "CidrBlock": "0.0.0.0/0",
+ "Egress": true,
+ "Protocol": "-1",
+ "RuleAction": "deny",
+ "RuleNumber": 32767
+ },
+ {
+ "CidrBlock": "0.0.0.0/0",
+ "Egress": false,
+ "Protocol": "-1",
+ "RuleAction": "deny",
+ "RuleNumber": 32767
+ }
+ ],
+ "IsDefault": false,
+ "NetworkAclId": "acl-5fb85d36",
+ "Tags": [
+
+ ],
+ "VpcId": "vpc-a01106c2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified network ACL.",
+ "id": "ec2-",
+ "title": "To describe a network ACL"
+ }
+ ],
+ "DescribeNetworkInterfaceAttribute": [
+ {
+ "input": {
+ "Attribute": "attachment",
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "output": {
+ "Attachment": {
+ "AttachTime": "2015-05-21T20:02:20.000Z",
+ "AttachmentId": "eni-attach-43348162",
+ "DeleteOnTermination": true,
+ "DeviceIndex": 0,
+ "InstanceId": "i-1234567890abcdef0",
+ "InstanceOwnerId": "123456789012",
+ "Status": "attached"
+ },
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the attachment attribute of the specified network interface.",
+ "id": "ec2-describe-network-interface-attribute-1",
+ "title": "To describe the attachment attribute of a network interface"
+ },
+ {
+ "input": {
+ "Attribute": "description",
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "output": {
+ "Description": {
+ "Value": "My description"
+ },
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the description attribute of the specified network interface.",
+ "id": "ec2-describe-network-interface-attribute-2",
+ "title": "To describe the description attribute of a network interface"
+ },
+ {
+ "input": {
+ "Attribute": "groupSet",
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "output": {
+ "Groups": [
+ {
+ "GroupId": "sg-903004f8",
+ "GroupName": "my-security-group"
+ }
+ ],
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the groupSet attribute of the specified network interface.",
+ "id": "ec2-describe-network-interface-attribute-3",
+ "title": "To describe the groupSet attribute of a network interface"
+ },
+ {
+ "input": {
+ "Attribute": "sourceDestCheck",
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "output": {
+ "NetworkInterfaceId": "eni-686ea200",
+ "SourceDestCheck": {
+ "Value": true
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the sourceDestCheck attribute of the specified network interface.",
+ "id": "ec2-describe-network-interface-attribute-4",
+ "title": "To describe the sourceDestCheck attribute of a network interface"
+ }
+ ],
+ "DescribeNetworkInterfaces": [
+ {
+ "input": {
+ "NetworkInterfaceIds": [
+ "eni-e5aa89a3"
+ ]
+ },
+ "output": {
+ "NetworkInterfaces": [
+ {
+ "Association": {
+ "AssociationId": "eipassoc-0fbb766a",
+ "IpOwnerId": "123456789012",
+ "PublicDnsName": "ec2-203-0-113-12.compute-1.amazonaws.com",
+ "PublicIp": "203.0.113.12"
+ },
+ "Attachment": {
+ "AttachTime": "2013-11-30T23:36:42.000Z",
+ "AttachmentId": "eni-attach-66c4350a",
+ "DeleteOnTermination": false,
+ "DeviceIndex": 1,
+ "InstanceId": "i-1234567890abcdef0",
+ "InstanceOwnerId": "123456789012",
+ "Status": "attached"
+ },
+ "AvailabilityZone": "us-east-1d",
+ "Description": "my network interface",
+ "Groups": [
+ {
+ "GroupId": "sg-8637d3e3",
+ "GroupName": "default"
+ }
+ ],
+ "MacAddress": "02:2f:8f:b0:cf:75",
+ "NetworkInterfaceId": "eni-e5aa89a3",
+ "OwnerId": "123456789012",
+ "PrivateDnsName": "ip-10-0-1-17.ec2.internal",
+ "PrivateIpAddress": "10.0.1.17",
+ "PrivateIpAddresses": [
+ {
+ "Association": {
+ "AssociationId": "eipassoc-0fbb766a",
+ "IpOwnerId": "123456789012",
+ "PublicDnsName": "ec2-203-0-113-12.compute-1.amazonaws.com",
+ "PublicIp": "203.0.113.12"
+ },
+ "Primary": true,
+ "PrivateDnsName": "ip-10-0-1-17.ec2.internal",
+ "PrivateIpAddress": "10.0.1.17"
+ }
+ ],
+ "RequesterManaged": false,
+ "SourceDestCheck": true,
+ "Status": "in-use",
+ "SubnetId": "subnet-b61f49f0",
+ "TagSet": [
+
+ ],
+ "VpcId": "vpc-a01106c2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "",
+ "id": "ec2-describe-network-interfaces-1",
+ "title": "To describe a network interface"
+ }
+ ],
+ "DescribeRegions": [
+ {
+ "output": {
+ "Regions": [
+ {
+ "Endpoint": "ec2.ap-south-1.amazonaws.com",
+ "RegionName": "ap-south-1"
+ },
+ {
+ "Endpoint": "ec2.eu-west-1.amazonaws.com",
+ "RegionName": "eu-west-1"
+ },
+ {
+ "Endpoint": "ec2.ap-southeast-1.amazonaws.com",
+ "RegionName": "ap-southeast-1"
+ },
+ {
+ "Endpoint": "ec2.ap-southeast-2.amazonaws.com",
+ "RegionName": "ap-southeast-2"
+ },
+ {
+ "Endpoint": "ec2.eu-central-1.amazonaws.com",
+ "RegionName": "eu-central-1"
+ },
+ {
+ "Endpoint": "ec2.ap-northeast-2.amazonaws.com",
+ "RegionName": "ap-northeast-2"
+ },
+ {
+ "Endpoint": "ec2.ap-northeast-1.amazonaws.com",
+ "RegionName": "ap-northeast-1"
+ },
+ {
+ "Endpoint": "ec2.us-east-1.amazonaws.com",
+ "RegionName": "us-east-1"
+ },
+ {
+ "Endpoint": "ec2.sa-east-1.amazonaws.com",
+ "RegionName": "sa-east-1"
+ },
+ {
+ "Endpoint": "ec2.us-west-1.amazonaws.com",
+ "RegionName": "us-west-1"
+ },
+ {
+ "Endpoint": "ec2.us-west-2.amazonaws.com",
+ "RegionName": "us-west-2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes all the regions that are available to you.",
+ "id": "ec2-describe-regions-1",
+ "title": "To describe your regions"
+ }
+ ],
+ "DescribeRouteTables": [
+ {
+ "input": {
+ "RouteTableIds": [
+ "rtb-1f382e7d"
+ ]
+ },
+ "output": {
+ "RouteTables": [
+ {
+ "Associations": [
+ {
+ "Main": true,
+ "RouteTableAssociationId": "rtbassoc-d8ccddba",
+ "RouteTableId": "rtb-1f382e7d"
+ }
+ ],
+ "PropagatingVgws": [
+
+ ],
+ "RouteTableId": "rtb-1f382e7d",
+ "Routes": [
+ {
+ "DestinationCidrBlock": "10.0.0.0/16",
+ "GatewayId": "local",
+ "State": "active"
+ }
+ ],
+ "Tags": [
+
+ ],
+ "VpcId": "vpc-a01106c2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified route table.",
+ "id": "ec2-describe-route-tables-1",
+ "title": "To describe a route table"
+ }
+ ],
+ "DescribeScheduledInstanceAvailability": [
+ {
+ "input": {
+ "FirstSlotStartTimeRange": {
+ "EarliestTime": "2016-01-31T00:00:00Z",
+ "LatestTime": "2016-01-31T04:00:00Z"
+ },
+ "Recurrence": {
+ "Frequency": "Weekly",
+ "Interval": 1,
+ "OccurrenceDays": [
+ 1
+ ]
+ }
+ },
+ "output": {
+ "ScheduledInstanceAvailabilitySet": [
+ {
+ "AvailabilityZone": "us-west-2b",
+ "AvailableInstanceCount": 20,
+ "FirstSlotStartTime": "2016-01-31T00:00:00Z",
+ "HourlyPrice": "0.095",
+ "InstanceType": "c4.large",
+ "MaxTermDurationInDays": 366,
+ "MinTermDurationInDays": 366,
+ "NetworkPlatform": "EC2-VPC",
+ "Platform": "Linux/UNIX",
+ "PurchaseToken": "eyJ2IjoiMSIsInMiOjEsImMiOi...",
+ "Recurrence": {
+ "Frequency": "Weekly",
+ "Interval": 1,
+ "OccurrenceDaySet": [
+ 1
+ ],
+ "OccurrenceRelativeToEnd": false
+ },
+ "SlotDurationInHours": 23,
+ "TotalScheduledInstanceHours": 1219
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes a schedule that occurs every week on Sunday, starting on the specified date. Note that the output contains a single schedule as an example.",
+ "id": "ec2-describe-scheduled-instance-availability-1",
+ "title": "To describe an available schedule"
+ }
+ ],
+ "DescribeScheduledInstances": [
+ {
+ "input": {
+ "ScheduledInstanceIds": [
+ "sci-1234-1234-1234-1234-123456789012"
+ ]
+ },
+ "output": {
+ "ScheduledInstanceSet": [
+ {
+ "AvailabilityZone": "us-west-2b",
+ "CreateDate": "2016-01-25T21:43:38.612Z",
+ "HourlyPrice": "0.095",
+ "InstanceCount": 1,
+ "InstanceType": "c4.large",
+ "NetworkPlatform": "EC2-VPC",
+ "NextSlotStartTime": "2016-01-31T09:00:00Z",
+ "Platform": "Linux/UNIX",
+ "Recurrence": {
+ "Frequency": "Weekly",
+ "Interval": 1,
+ "OccurrenceDaySet": [
+ 1
+ ],
+ "OccurrenceRelativeToEnd": false,
+ "OccurrenceUnit": ""
+ },
+ "ScheduledInstanceId": "sci-1234-1234-1234-1234-123456789012",
+ "SlotDurationInHours": 32,
+ "TermEndDate": "2017-01-31T09:00:00Z",
+ "TermStartDate": "2016-01-31T09:00:00Z",
+ "TotalScheduledInstanceHours": 1696
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified Scheduled Instance.",
+ "id": "ec2-describe-scheduled-instances-1",
+ "title": "To describe your Scheduled Instances"
+ }
+ ],
+ "DescribeSnapshotAttribute": [
+ {
+ "input": {
+ "Attribute": "createVolumePermission",
+ "SnapshotId": "snap-066877671789bd71b"
+ },
+ "output": {
+ "CreateVolumePermissions": [
+
+ ],
+ "SnapshotId": "snap-066877671789bd71b"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the ``createVolumePermission`` attribute on a snapshot with the snapshot ID of ``snap-066877671789bd71b``.",
+ "id": "to-describe-snapshot-attributes-1472503199736",
+ "title": "To describe snapshot attributes"
+ }
+ ],
+ "DescribeSnapshots": [
+ {
+ "input": {
+ "SnapshotIds": [
+ "snap-1234567890abcdef0"
+ ]
+ },
+ "output": {
+ "NextToken": "",
+ "Snapshots": [
+ {
+ "Description": "This is my snapshot.",
+ "OwnerId": "012345678910",
+ "Progress": "100%",
+ "SnapshotId": "snap-1234567890abcdef0",
+ "StartTime": "2014-02-28T21:28:32.000Z",
+ "State": "completed",
+ "VolumeId": "vol-049df61146c4d7901",
+ "VolumeSize": 8
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes a snapshot with the snapshot ID of ``snap-1234567890abcdef0``.",
+ "id": "to-describe-a-snapshot-1472503807850",
+ "title": "To describe a snapshot"
+ },
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "status",
+ "Values": [
+ "pending"
+ ]
+ }
+ ],
+ "OwnerIds": [
+ "012345678910"
+ ]
+ },
+ "output": {
+ "NextToken": "",
+ "Snapshots": [
+ {
+ "Description": "This is my copied snapshot.",
+ "OwnerId": "012345678910",
+ "Progress": "87%",
+ "SnapshotId": "snap-066877671789bd71b",
+ "StartTime": "2014-02-28T21:37:27.000Z",
+ "State": "pending",
+ "VolumeId": "vol-1234567890abcdef0",
+ "VolumeSize": 8
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes all snapshots owned by the ID 012345678910 that are in the ``pending`` status.",
+ "id": "to-describe-snapshots-using-filters-1472503929793",
+ "title": "To describe snapshots using filters"
+ }
+ ],
+ "DescribeSpotDatafeedSubscription": [
+ {
+ "output": {
+ "SpotDatafeedSubscription": {
+ "Bucket": "my-s3-bucket",
+ "OwnerId": "123456789012",
+ "Prefix": "spotdata",
+ "State": "Active"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the Spot Instance datafeed subscription for your AWS account.",
+ "id": "ec2-describe-spot-datafeed-subscription-1",
+ "title": "To describe the datafeed for your AWS account"
+ }
+ ],
+ "DescribeSpotFleetInstances": [
+ {
+ "input": {
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ },
+ "output": {
+ "ActiveInstances": [
+ {
+ "InstanceId": "i-1234567890abcdef0",
+ "InstanceType": "m3.medium",
+ "SpotInstanceRequestId": "sir-08b93456"
+ }
+ ],
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists the Spot Instances associated with the specified Spot fleet.",
+ "id": "ec2-describe-spot-fleet-instances-1",
+ "title": "To describe the Spot Instances associated with a Spot fleet"
+ }
+ ],
+ "DescribeSpotFleetRequestHistory": [
+ {
+ "input": {
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE",
+ "StartTime": "2015-05-26T00:00:00Z"
+ },
+ "output": {
+ "HistoryRecords": [
+ {
+ "EventInformation": {
+ "EventSubType": "submitted"
+ },
+ "EventType": "fleetRequestChange",
+ "Timestamp": "2015-05-26T23:17:20.697Z"
+ },
+ {
+ "EventInformation": {
+ "EventSubType": "active"
+ },
+ "EventType": "fleetRequestChange",
+ "Timestamp": "2015-05-26T23:17:20.873Z"
+ },
+ {
+ "EventInformation": {
+ "EventSubType": "launched",
+ "InstanceId": "i-1234567890abcdef0"
+ },
+ "EventType": "instanceChange",
+ "Timestamp": "2015-05-26T23:21:21.712Z"
+ },
+ {
+ "EventInformation": {
+ "EventSubType": "launched",
+ "InstanceId": "i-1234567890abcdef1"
+ },
+ "EventType": "instanceChange",
+ "Timestamp": "2015-05-26T23:21:21.816Z"
+ }
+ ],
+ "NextToken": "CpHNsscimcV5oH7bSbub03CI2Qms5+ypNpNm+53MNlR0YcXAkp0xFlfKf91yVxSExmbtma3awYxMFzNA663ZskT0AHtJ6TCb2Z8bQC2EnZgyELbymtWPfpZ1ZbauVg+P+TfGlWxWWB/Vr5dk5d4LfdgA/DRAHUrYgxzrEXAMPLE=",
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE",
+ "StartTime": "2015-05-26T00:00:00Z"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example returns the history for the specified Spot fleet starting at the specified time.",
+ "id": "ec2-describe-spot-fleet-request-history-1",
+ "title": "To describe Spot fleet history"
+ }
+ ],
+ "DescribeSpotFleetRequests": [
+ {
+ "input": {
+ "SpotFleetRequestIds": [
+ "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ ]
+ },
+ "output": {
+ "SpotFleetRequestConfigs": [
+ {
+ "SpotFleetRequestConfig": {
+ "IamFleetRole": "arn:aws:iam::123456789012:role/my-spot-fleet-role",
+ "LaunchSpecifications": [
+ {
+ "EbsOptimized": false,
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "cc2.8xlarge",
+ "NetworkInterfaces": [
+ {
+ "AssociatePublicIpAddress": true,
+ "DeleteOnTermination": false,
+ "DeviceIndex": 0,
+ "SecondaryPrivateIpAddressCount": 0,
+ "SubnetId": "subnet-a61dafcf"
+ }
+ ]
+ },
+ {
+ "EbsOptimized": false,
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "r3.8xlarge",
+ "NetworkInterfaces": [
+ {
+ "AssociatePublicIpAddress": true,
+ "DeleteOnTermination": false,
+ "DeviceIndex": 0,
+ "SecondaryPrivateIpAddressCount": 0,
+ "SubnetId": "subnet-a61dafcf"
+ }
+ ]
+ }
+ ],
+ "SpotPrice": "0.05",
+ "TargetCapacity": 20
+ },
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE",
+ "SpotFleetRequestState": "active"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified Spot fleet request.",
+ "id": "ec2-describe-spot-fleet-requests-1",
+ "title": "To describe a Spot fleet request"
+ }
+ ],
+ "DescribeSpotInstanceRequests": [
+ {
+ "input": {
+ "SpotInstanceRequestIds": [
+ "sir-08b93456"
+ ]
+ },
+ "output": {
+ "SpotInstanceRequests": [
+ {
+ "CreateTime": "2014-04-30T18:14:55.000Z",
+ "InstanceId": "i-1234567890abcdef0",
+ "LaunchSpecification": {
+ "BlockDeviceMappings": [
+ {
+ "DeviceName": "/dev/sda1",
+ "Ebs": {
+ "DeleteOnTermination": true,
+ "VolumeSize": 8,
+ "VolumeType": "standard"
+ }
+ }
+ ],
+ "EbsOptimized": false,
+ "ImageId": "ami-7aba833f",
+ "InstanceType": "m1.small",
+ "KeyName": "my-key-pair",
+ "SecurityGroups": [
+ {
+ "GroupId": "sg-e38f24a7",
+ "GroupName": "my-security-group"
+ }
+ ]
+ },
+ "LaunchedAvailabilityZone": "us-west-1b",
+ "ProductDescription": "Linux/UNIX",
+ "SpotInstanceRequestId": "sir-08b93456",
+ "SpotPrice": "0.010000",
+ "State": "active",
+ "Status": {
+ "Code": "fulfilled",
+ "Message": "Your Spot request is fulfilled.",
+ "UpdateTime": "2014-04-30T18:16:21.000Z"
+ },
+ "Type": "one-time"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified Spot Instance request.",
+ "id": "ec2-describe-spot-instance-requests-1",
+ "title": "To describe a Spot Instance request"
+ }
+ ],
+ "DescribeSpotPriceHistory": [
+ {
+ "input": {
+ "EndTime": "2014-01-06T08:09:10",
+ "InstanceTypes": [
+ "m1.xlarge"
+ ],
+ "ProductDescriptions": [
+ "Linux/UNIX (Amazon VPC)"
+ ],
+ "StartTime": "2014-01-06T07:08:09"
+ },
+ "output": {
+ "SpotPriceHistory": [
+ {
+ "AvailabilityZone": "us-west-1a",
+ "InstanceType": "m1.xlarge",
+ "ProductDescription": "Linux/UNIX (Amazon VPC)",
+ "SpotPrice": "0.080000",
+ "Timestamp": "2014-01-06T04:32:53.000Z"
+ },
+ {
+ "AvailabilityZone": "us-west-1c",
+ "InstanceType": "m1.xlarge",
+ "ProductDescription": "Linux/UNIX (Amazon VPC)",
+ "SpotPrice": "0.080000",
+ "Timestamp": "2014-01-05T11:28:26.000Z"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example returns the Spot Price history for m1.xlarge, Linux/UNIX (Amazon VPC) instances for a particular day in January.",
+ "id": "ec2-describe-spot-price-history-1",
+ "title": "To describe Spot price history for Linux/UNIX (Amazon VPC)"
+ }
+ ],
+ "DescribeSubnets": [
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "vpc-id",
+ "Values": [
+ "vpc-a01106c2"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "Subnets": [
+ {
+ "AvailabilityZone": "us-east-1c",
+ "AvailableIpAddressCount": 251,
+ "CidrBlock": "10.0.1.0/24",
+ "DefaultForAz": false,
+ "MapPublicIpOnLaunch": false,
+ "State": "available",
+ "SubnetId": "subnet-9d4a7b6c",
+ "VpcId": "vpc-a01106c2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the subnets for the specified VPC.",
+ "id": "ec2-describe-subnets-1",
+ "title": "To describe the subnets for a VPC"
+ }
+ ],
+ "DescribeTags": [
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "resource-id",
+ "Values": [
+ "i-1234567890abcdef8"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "Tags": [
+ {
+ "Key": "Stack",
+ "ResourceId": "i-1234567890abcdef8",
+ "ResourceType": "instance",
+ "Value": "test"
+ },
+ {
+ "Key": "Name",
+ "ResourceId": "i-1234567890abcdef8",
+ "ResourceType": "instance",
+ "Value": "Beta Server"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the tags for the specified instance.",
+ "id": "ec2-describe-tags-1",
+ "title": "To describe the tags for a single resource"
+ }
+ ],
+ "DescribeVolumeAttribute": [
+ {
+ "input": {
+ "Attribute": "autoEnableIO",
+ "VolumeId": "vol-049df61146c4d7901"
+ },
+ "output": {
+ "AutoEnableIO": {
+ "Value": false
+ },
+ "VolumeId": "vol-049df61146c4d7901"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the ``autoEnableIo`` attribute of the volume with the ID ``vol-049df61146c4d7901``.",
+ "id": "to-describe-a-volume-attribute-1472505773492",
+ "title": "To describe a volume attribute"
+ }
+ ],
+ "DescribeVolumeStatus": [
+ {
+ "input": {
+ "VolumeIds": [
+ "vol-1234567890abcdef0"
+ ]
+ },
+ "output": {
+ "VolumeStatuses": [
+ {
+ "Actions": [
+
+ ],
+ "AvailabilityZone": "us-east-1a",
+ "Events": [
+
+ ],
+ "VolumeId": "vol-1234567890abcdef0",
+ "VolumeStatus": {
+ "Details": [
+ {
+ "Name": "io-enabled",
+ "Status": "passed"
+ },
+ {
+ "Name": "io-performance",
+ "Status": "not-applicable"
+ }
+ ],
+ "Status": "ok"
+ }
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the status for the volume ``vol-1234567890abcdef0``.",
+ "id": "to-describe-the-status-of-a-single-volume-1472507016193",
+ "title": "To describe the status of a single volume"
+ },
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "volume-status.status",
+ "Values": [
+ "impaired"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "VolumeStatuses": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the status for all volumes that are impaired. In this example output, there are no impaired volumes.",
+ "id": "to-describe-the-status-of-impaired-volumes-1472507239821",
+ "title": "To describe the status of impaired volumes"
+ }
+ ],
+ "DescribeVolumes": [
+ {
+ "input": {
+ },
+ "output": {
+ "NextToken": "",
+ "Volumes": [
+ {
+ "Attachments": [
+ {
+ "AttachTime": "2013-12-18T22:35:00.000Z",
+ "DeleteOnTermination": true,
+ "Device": "/dev/sda1",
+ "InstanceId": "i-1234567890abcdef0",
+ "State": "attached",
+ "VolumeId": "vol-049df61146c4d7901"
+ }
+ ],
+ "AvailabilityZone": "us-east-1a",
+ "CreateTime": "2013-12-18T22:35:00.084Z",
+ "Size": 8,
+ "SnapshotId": "snap-1234567890abcdef0",
+ "State": "in-use",
+ "VolumeId": "vol-049df61146c4d7901",
+ "VolumeType": "standard"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes all of your volumes in the default region.",
+ "id": "to-describe-all-volumes-1472506358883",
+ "title": "To describe all volumes"
+ },
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "attachment.instance-id",
+ "Values": [
+ "i-1234567890abcdef0"
+ ]
+ },
+ {
+ "Name": "attachment.delete-on-termination",
+ "Values": [
+ "true"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "Volumes": [
+ {
+ "Attachments": [
+ {
+ "AttachTime": "2013-12-18T22:35:00.000Z",
+ "DeleteOnTermination": true,
+ "Device": "/dev/sda1",
+ "InstanceId": "i-1234567890abcdef0",
+ "State": "attached",
+ "VolumeId": "vol-049df61146c4d7901"
+ }
+ ],
+ "AvailabilityZone": "us-east-1a",
+ "CreateTime": "2013-12-18T22:35:00.084Z",
+ "Size": 8,
+ "SnapshotId": "snap-1234567890abcdef0",
+ "State": "in-use",
+ "VolumeId": "vol-049df61146c4d7901",
+ "VolumeType": "standard"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes all volumes that are both attached to the instance with the ID i-1234567890abcdef0 and set to delete when the instance terminates.",
+ "id": "to-describe-volumes-that-are-attached-to-a-specific-instance-1472506613578",
+ "title": "To describe volumes that are attached to a specific instance"
+ }
+ ],
+ "DescribeVpcAttribute": [
+ {
+ "input": {
+ "Attribute": "enableDnsSupport",
+ "VpcId": "vpc-a01106c2"
+ },
+ "output": {
+ "EnableDnsSupport": {
+ "Value": true
+ },
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the enableDnsSupport attribute. This attribute indicates whether DNS resolution is enabled for the VPC. If this attribute is true, the Amazon DNS server resolves DNS hostnames for your instances to their corresponding IP addresses; otherwise, it does not.",
+ "id": "ec2-describe-vpc-attribute-1",
+ "title": "To describe the enableDnsSupport attribute"
+ },
+ {
+ "input": {
+ "Attribute": "enableDnsHostnames",
+ "VpcId": "vpc-a01106c2"
+ },
+ "output": {
+ "EnableDnsHostnames": {
+ "Value": true
+ },
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the enableDnsHostnames attribute. This attribute indicates whether the instances launched in the VPC get DNS hostnames. If this attribute is true, instances in the VPC get DNS hostnames; otherwise, they do not.",
+ "id": "ec2-describe-vpc-attribute-2",
+ "title": "To describe the enableDnsHostnames attribute"
+ }
+ ],
+ "DescribeVpcs": [
+ {
+ "input": {
+ "VpcIds": [
+ "vpc-a01106c2"
+ ]
+ },
+ "output": {
+ "Vpcs": [
+ {
+ "CidrBlock": "10.0.0.0/16",
+ "DhcpOptionsId": "dopt-7a8b9c2d",
+ "InstanceTenancy": "default",
+ "IsDefault": false,
+ "State": "available",
+ "Tags": [
+ {
+ "Key": "Name",
+ "Value": "MyVPC"
+ }
+ ],
+ "VpcId": "vpc-a01106c2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified VPC.",
+ "id": "ec2-describe-vpcs-1",
+ "title": "To describe a VPC"
+ }
+ ],
+ "DetachInternetGateway": [
+ {
+ "input": {
+ "InternetGatewayId": "igw-c0a643a9",
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example detaches the specified Internet gateway from the specified VPC.",
+ "id": "ec2-detach-internet-gateway-1",
+ "title": "To detach an Internet gateway from a VPC"
+ }
+ ],
+ "DetachNetworkInterface": [
+ {
+ "input": {
+ "AttachmentId": "eni-attach-66c4350a"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example detaches the specified network interface from its attached instance.",
+ "id": "ec2-detach-network-interface-1",
+ "title": "To detach a network interface from an instance"
+ }
+ ],
+ "DetachVolume": [
+ {
+ "input": {
+ "VolumeId": "vol-1234567890abcdef0"
+ },
+ "output": {
+ "AttachTime": "2014-02-27T19:23:06.000Z",
+ "Device": "/dev/sdb",
+ "InstanceId": "i-1234567890abcdef0",
+ "State": "detaching",
+ "VolumeId": "vol-049df61146c4d7901"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example detaches the volume (``vol-049df61146c4d7901``) from the instance it is attached to.",
+ "id": "to-detach-a-volume-from-an-instance-1472507977694",
+ "title": "To detach a volume from an instance"
+ }
+ ],
+ "DisableVgwRoutePropagation": [
+ {
+ "input": {
+ "GatewayId": "vgw-9a4cacf3",
+ "RouteTableId": "rtb-22574640"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example disables the specified virtual private gateway from propagating static routes to the specified route table.",
+ "id": "ec2-disable-vgw-route-propagation-1",
+ "title": "To disable route propagation"
+ }
+ ],
+ "DisassociateAddress": [
+ {
+ "input": {
+ "AssociationId": "eipassoc-2bebb745"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example disassociates an Elastic IP address from an instance in a VPC.",
+ "id": "ec2-disassociate-address-1",
+ "title": "To disassociate an Elastic IP address in EC2-VPC"
+ },
+ {
+ "input": {
+ "PublicIp": "198.51.100.0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example disassociates an Elastic IP address from an instance in EC2-Classic.",
+ "id": "ec2-disassociate-address-2",
+ "title": "To disassociate an Elastic IP addresses in EC2-Classic"
+ }
+ ],
+ "DisassociateRouteTable": [
+ {
+ "input": {
+ "AssociationId": "rtbassoc-781d0d1a"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example disassociates the specified route table from its associated subnet.",
+ "id": "ec2-disassociate-route-table-1",
+ "title": "To disassociate a route table"
+ }
+ ],
+ "EnableVgwRoutePropagation": [
+ {
+ "input": {
+ "GatewayId": "vgw-9a4cacf3",
+ "RouteTableId": "rtb-22574640"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example enables the specified virtual private gateway to propagate static routes to the specified route table.",
+ "id": "ec2-enable-vgw-route-propagation-1",
+ "title": "To enable route propagation"
+ }
+ ],
+ "EnableVolumeIO": [
+ {
+ "input": {
+ "VolumeId": "vol-1234567890abcdef0"
+ },
+ "output": {
+ "Return": true
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example enables I/O on volume ``vol-1234567890abcdef0``.",
+ "id": "to-enable-io-for-a-volume-1472508114867",
+ "title": "To enable I/O for a volume"
+ }
+ ],
+ "ModifyNetworkInterfaceAttribute": [
+ {
+ "input": {
+ "Attachment": {
+ "AttachmentId": "eni-attach-43348162",
+ "DeleteOnTermination": false
+ },
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies the attachment attribute of the specified network interface.",
+ "id": "ec2-modify-network-interface-attribute-1",
+ "title": "To modify the attachment attribute of a network interface"
+ },
+ {
+ "input": {
+ "Description": "My description",
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies the description attribute of the specified network interface.",
+ "id": "ec2-modify-network-interface-attribute-2",
+ "title": "To modify the description attribute of a network interface"
+ },
+ {
+ "input": {
+ "Groups": [
+ "sg-903004f8",
+ "sg-1a2b3c4d"
+ ],
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example command modifies the groupSet attribute of the specified network interface.",
+ "id": "ec2-modify-network-interface-attribute-3",
+ "title": "To modify the groupSet attribute of a network interface"
+ },
+ {
+ "input": {
+ "NetworkInterfaceId": "eni-686ea200",
+ "SourceDestCheck": false
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example command modifies the sourceDestCheck attribute of the specified network interface.",
+ "id": "ec2-modify-network-interface-attribute-4",
+ "title": "To modify the sourceDestCheck attribute of a network interface"
+ }
+ ],
+ "ModifySnapshotAttribute": [
+ {
+ "input": {
+ "Attribute": "createVolumePermission",
+ "OperationType": "remove",
+ "SnapshotId": "snap-1234567890abcdef0",
+ "UserIds": [
+ "123456789012"
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies snapshot ``snap-1234567890abcdef0`` to remove the create volume permission for a user with the account ID ``123456789012``. If the command succeeds, no output is returned.",
+ "id": "to-modify-a-snapshot-attribute-1472508385907",
+ "title": "To modify a snapshot attribute"
+ },
+ {
+ "input": {
+ "Attribute": "createVolumePermission",
+ "GroupNames": [
+ "all"
+ ],
+ "OperationType": "add",
+ "SnapshotId": "snap-1234567890abcdef0"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example makes the snapshot ``snap-1234567890abcdef0`` public.",
+ "id": "to-make-a-snapshot-public-1472508470529",
+ "title": "To make a snapshot public"
+ }
+ ],
+ "ModifySpotFleetRequest": [
+ {
+ "input": {
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE",
+ "TargetCapacity": 20
+ },
+ "output": {
+ "Return": true
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example increases the target capacity of the specified Spot fleet request.",
+ "id": "ec2-modify-spot-fleet-request-1",
+ "title": "To increase the target capacity of a Spot fleet request"
+ },
+ {
+ "input": {
+ "ExcessCapacityTerminationPolicy": "NoTermination ",
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE",
+ "TargetCapacity": 10
+ },
+ "output": {
+ "Return": true
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example decreases the target capacity of the specified Spot fleet request without terminating any Spot Instances as a result.",
+ "id": "ec2-modify-spot-fleet-request-2",
+ "title": "To decrease the target capacity of a Spot fleet request"
+ }
+ ],
+ "ModifySubnetAttribute": [
+ {
+ "input": {
+ "MapPublicIpOnLaunch": true,
+ "SubnetId": "subnet-1a2b3c4d"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies the specified subnet so that all instances launched into this subnet are assigned a public IP address.",
+ "id": "ec2-modify-subnet-attribute-1",
+ "title": "To change a subnet's public IP addressing behavior"
+ }
+ ],
+ "ModifyVolumeAttribute": [
+ {
+ "input": {
+ "AutoEnableIO": {
+ "Value": true
+ },
+ "DryRun": true,
+ "VolumeId": "vol-1234567890abcdef0"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example sets the ``autoEnableIo`` attribute of the volume with the ID ``vol-1234567890abcdef0`` to ``true``. If the command succeeds, no output is returned.",
+ "id": "to-modify-a-volume-attribute-1472508596749",
+ "title": "To modify a volume attribute"
+ }
+ ],
+ "ModifyVpcAttribute": [
+ {
+ "input": {
+ "EnableDnsSupport": {
+ "Value": false
+ },
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies the enableDnsSupport attribute. This attribute indicates whether DNS resolution is enabled for the VPC. If this attribute is true, the Amazon DNS server resolves DNS hostnames for instances in the VPC to their corresponding IP addresses; otherwise, it does not.",
+ "id": "ec2-modify-vpc-attribute-1",
+ "title": "To modify the enableDnsSupport attribute"
+ },
+ {
+ "input": {
+ "EnableDnsHostnames": {
+ "Value": false
+ },
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies the enableDnsHostnames attribute. This attribute indicates whether instances launched in the VPC get DNS hostnames. If this attribute is true, instances in the VPC get DNS hostnames; otherwise, they do not.",
+ "id": "ec2-modify-vpc-attribute-2",
+ "title": "To modify the enableDnsHostnames attribute"
+ }
+ ],
+ "MoveAddressToVpc": [
+ {
+ "input": {
+ "PublicIp": "54.123.4.56"
+ },
+ "output": {
+ "Status": "MoveInProgress"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example moves the specified Elastic IP address to the EC2-VPC platform.",
+ "id": "ec2-move-address-to-vpc-1",
+ "title": "To move an address to EC2-VPC"
+ }
+ ],
+ "PurchaseScheduledInstances": [
+ {
+ "input": {
+ "PurchaseRequests": [
+ {
+ "InstanceCount": 1,
+ "PurchaseToken": "eyJ2IjoiMSIsInMiOjEsImMiOi..."
+ }
+ ]
+ },
+ "output": {
+ "ScheduledInstanceSet": [
+ {
+ "AvailabilityZone": "us-west-2b",
+ "CreateDate": "2016-01-25T21:43:38.612Z",
+ "HourlyPrice": "0.095",
+ "InstanceCount": 1,
+ "InstanceType": "c4.large",
+ "NetworkPlatform": "EC2-VPC",
+ "NextSlotStartTime": "2016-01-31T09:00:00Z",
+ "Platform": "Linux/UNIX",
+ "Recurrence": {
+ "Frequency": "Weekly",
+ "Interval": 1,
+ "OccurrenceDaySet": [
+ 1
+ ],
+ "OccurrenceRelativeToEnd": false,
+ "OccurrenceUnit": ""
+ },
+ "ScheduledInstanceId": "sci-1234-1234-1234-1234-123456789012",
+ "SlotDurationInHours": 32,
+ "TermEndDate": "2017-01-31T09:00:00Z",
+ "TermStartDate": "2016-01-31T09:00:00Z",
+ "TotalScheduledInstanceHours": 1696
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example purchases a Scheduled Instance.",
+ "id": "ec2-purchase-scheduled-instances-1",
+ "title": "To purchase a Scheduled Instance"
+ }
+ ],
+ "ReleaseAddress": [
+ {
+ "input": {
+ "AllocationId": "eipalloc-64d5890a"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example releases an Elastic IP address for use with instances in a VPC.",
+ "id": "ec2-release-address-1",
+ "title": "To release an Elastic IP address for EC2-VPC"
+ },
+ {
+ "input": {
+ "PublicIp": "198.51.100.0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example releases an Elastic IP address for use with instances in EC2-Classic.",
+ "id": "ec2-release-address-2",
+ "title": "To release an Elastic IP addresses for EC2-Classic"
+ }
+ ],
+ "ReplaceNetworkAclAssociation": [
+ {
+ "input": {
+ "AssociationId": "aclassoc-e5b95c8c",
+ "NetworkAclId": "acl-5fb85d36"
+ },
+ "output": {
+ "NewAssociationId": "aclassoc-3999875b"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the specified network ACL with the subnet for the specified network ACL association.",
+ "id": "ec2-replace-network-acl-association-1",
+ "title": "To replace the network ACL associated with a subnet"
+ }
+ ],
+ "ReplaceNetworkAclEntry": [
+ {
+ "input": {
+ "CidrBlock": "203.0.113.12/24",
+ "Egress": false,
+ "NetworkAclId": "acl-5fb85d36",
+ "PortRange": {
+ "From": 53,
+ "To": 53
+ },
+ "Protocol": "udp",
+ "RuleAction": "allow",
+ "RuleNumber": 100
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example replaces an entry for the specified network ACL. The new rule 100 allows ingress traffic from 203.0.113.12/24 on UDP port 53 (DNS) into any associated subnet.",
+ "id": "ec2-replace-network-acl-entry-1",
+ "title": "To replace a network ACL entry"
+ }
+ ],
+ "ReplaceRoute": [
+ {
+ "input": {
+ "DestinationCidrBlock": "10.0.0.0/16",
+ "GatewayId": "vgw-9a4cacf3",
+ "RouteTableId": "rtb-22574640"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example replaces the specified route in the specified table table. The new route matches the specified CIDR and sends the traffic to the specified virtual private gateway.",
+ "id": "ec2-replace-route-1",
+ "title": "To replace a route"
+ }
+ ],
+ "ReplaceRouteTableAssociation": [
+ {
+ "input": {
+ "AssociationId": "rtbassoc-781d0d1a",
+ "RouteTableId": "rtb-22574640"
+ },
+ "output": {
+ "NewAssociationId": "rtbassoc-3a1f0f58"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the specified route table with the subnet for the specified route table association.",
+ "id": "ec2-replace-route-table-association-1",
+ "title": "To replace the route table associated with a subnet"
+ }
+ ],
+ "RequestSpotFleet": [
+ {
+ "input": {
+ "SpotFleetRequestConfig": {
+ "IamFleetRole": "arn:aws:iam::123456789012:role/my-spot-fleet-role",
+ "LaunchSpecifications": [
+ {
+ "IamInstanceProfile": {
+ "Arn": "arn:aws:iam::123456789012:instance-profile/my-iam-role"
+ },
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "m3.medium",
+ "KeyName": "my-key-pair",
+ "SecurityGroups": [
+ {
+ "GroupId": "sg-1a2b3c4d"
+ }
+ ],
+ "SubnetId": "subnet-1a2b3c4d, subnet-3c4d5e6f"
+ }
+ ],
+ "SpotPrice": "0.04",
+ "TargetCapacity": 2
+ }
+ },
+ "output": {
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a Spot fleet request with two launch specifications that differ only by subnet. The Spot fleet launches the instances in the specified subnet with the lowest price. If the instances are launched in a default VPC, they receive a public IP address by default. If the instances are launched in a nondefault VPC, they do not receive a public IP address by default. Note that you can't specify different subnets from the same Availability Zone in a Spot fleet request.",
+ "id": "ec2-request-spot-fleet-1",
+ "title": "To request a Spot fleet in the subnet with the lowest price"
+ },
+ {
+ "input": {
+ "SpotFleetRequestConfig": {
+ "IamFleetRole": "arn:aws:iam::123456789012:role/my-spot-fleet-role",
+ "LaunchSpecifications": [
+ {
+ "IamInstanceProfile": {
+ "Arn": "arn:aws:iam::123456789012:instance-profile/my-iam-role"
+ },
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "m3.medium",
+ "KeyName": "my-key-pair",
+ "Placement": {
+ "AvailabilityZone": "us-west-2a, us-west-2b"
+ },
+ "SecurityGroups": [
+ {
+ "GroupId": "sg-1a2b3c4d"
+ }
+ ]
+ }
+ ],
+ "SpotPrice": "0.04",
+ "TargetCapacity": 2
+ }
+ },
+ "output": {
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a Spot fleet request with two launch specifications that differ only by Availability Zone. The Spot fleet launches the instances in the specified Availability Zone with the lowest price. If your account supports EC2-VPC only, Amazon EC2 launches the Spot instances in the default subnet of the Availability Zone. If your account supports EC2-Classic, Amazon EC2 launches the instances in EC2-Classic in the Availability Zone.",
+ "id": "ec2-request-spot-fleet-2",
+ "title": "To request a Spot fleet in the Availability Zone with the lowest price"
+ },
+ {
+ "input": {
+ "SpotFleetRequestConfig": {
+ "IamFleetRole": "arn:aws:iam::123456789012:role/my-spot-fleet-role",
+ "LaunchSpecifications": [
+ {
+ "IamInstanceProfile": {
+ "Arn": "arn:aws:iam::880185128111:instance-profile/my-iam-role"
+ },
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "m3.medium",
+ "KeyName": "my-key-pair",
+ "NetworkInterfaces": [
+ {
+ "AssociatePublicIpAddress": true,
+ "DeviceIndex": 0,
+ "Groups": [
+ "sg-1a2b3c4d"
+ ],
+ "SubnetId": "subnet-1a2b3c4d"
+ }
+ ]
+ }
+ ],
+ "SpotPrice": "0.04",
+ "TargetCapacity": 2
+ }
+ },
+ "output": {
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example assigns public addresses to instances launched in a nondefault VPC. Note that when you specify a network interface, you must include the subnet ID and security group ID using the network interface.",
+ "id": "ec2-request-spot-fleet-3",
+ "title": "To launch Spot instances in a subnet and assign them public IP addresses"
+ },
+ {
+ "input": {
+ "SpotFleetRequestConfig": {
+ "AllocationStrategy": "diversified",
+ "IamFleetRole": "arn:aws:iam::123456789012:role/my-spot-fleet-role",
+ "LaunchSpecifications": [
+ {
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "c4.2xlarge",
+ "SubnetId": "subnet-1a2b3c4d"
+ },
+ {
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "m3.2xlarge",
+ "SubnetId": "subnet-1a2b3c4d"
+ },
+ {
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "r3.2xlarge",
+ "SubnetId": "subnet-1a2b3c4d"
+ }
+ ],
+ "SpotPrice": "0.70",
+ "TargetCapacity": 30
+ }
+ },
+ "output": {
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a Spot fleet request that launches 30 instances using the diversified allocation strategy. The launch specifications differ by instance type. The Spot fleet distributes the instances across the launch specifications such that there are 10 instances of each type.",
+ "id": "ec2-request-spot-fleet-4",
+ "title": "To request a Spot fleet using the diversified allocation strategy"
+ }
+ ],
+ "RequestSpotInstances": [
+ {
+ "input": {
+ "InstanceCount": 5,
+ "LaunchSpecification": {
+ "IamInstanceProfile": {
+ "Arn": "arn:aws:iam::123456789012:instance-profile/my-iam-role"
+ },
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "m3.medium",
+ "KeyName": "my-key-pair",
+ "Placement": {
+ "AvailabilityZone": "us-west-2a"
+ },
+ "SecurityGroupIds": [
+ "sg-1a2b3c4d"
+ ]
+ },
+ "SpotPrice": "0.03",
+ "Type": "one-time"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a one-time Spot Instance request for five instances in the specified Availability Zone. If your account supports EC2-VPC only, Amazon EC2 launches the instances in the default subnet of the specified Availability Zone. If your account supports EC2-Classic, Amazon EC2 launches the instances in EC2-Classic in the specified Availability Zone.",
+ "id": "ec2-request-spot-instances-1",
+ "title": "To create a one-time Spot Instance request"
+ },
+ {
+ "input": {
+ "InstanceCount": 5,
+ "LaunchSpecification": {
+ "IamInstanceProfile": {
+ "Arn": "arn:aws:iam::123456789012:instance-profile/my-iam-role"
+ },
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "m3.medium",
+ "SecurityGroupIds": [
+ "sg-1a2b3c4d"
+ ],
+ "SubnetId": "subnet-1a2b3c4d"
+ },
+ "SpotPrice": "0.050",
+ "Type": "one-time"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example command creates a one-time Spot Instance request for five instances in the specified subnet. Amazon EC2 launches the instances in the specified subnet. If the VPC is a nondefault VPC, the instances do not receive a public IP address by default.",
+ "id": "ec2-request-spot-instances-2",
+ "title": "To create a one-time Spot Instance request"
+ }
+ ],
+ "ResetSnapshotAttribute": [
+ {
+ "input": {
+ "Attribute": "createVolumePermission",
+ "SnapshotId": "snap-1234567890abcdef0"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example resets the create volume permissions for snapshot ``snap-1234567890abcdef0``. If the command succeeds, no output is returned.",
+ "id": "to-reset-a-snapshot-attribute-1472508825735",
+ "title": "To reset a snapshot attribute"
+ }
+ ],
+ "RestoreAddressToClassic": [
+ {
+ "input": {
+ "PublicIp": "198.51.100.0"
+ },
+ "output": {
+ "PublicIp": "198.51.100.0",
+ "Status": "MoveInProgress"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example restores the specified Elastic IP address to the EC2-Classic platform.",
+ "id": "ec2-restore-address-to-classic-1",
+ "title": "To restore an address to EC2-Classic"
+ }
+ ],
+ "RunScheduledInstances": [
+ {
+ "input": {
+ "InstanceCount": 1,
+ "LaunchSpecification": {
+ "IamInstanceProfile": {
+ "Name": "my-iam-role"
+ },
+ "ImageId": "ami-12345678",
+ "InstanceType": "c4.large",
+ "KeyName": "my-key-pair",
+ "NetworkInterfaces": [
+ {
+ "AssociatePublicIpAddress": true,
+ "DeviceIndex": 0,
+ "Groups": [
+ "sg-12345678"
+ ],
+ "SubnetId": "subnet-12345678"
+ }
+ ]
+ },
+ "ScheduledInstanceId": "sci-1234-1234-1234-1234-123456789012"
+ },
+ "output": {
+ "InstanceIdSet": [
+ "i-1234567890abcdef0"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example launches the specified Scheduled Instance in a VPC.",
+ "id": "ec2-run-scheduled-instances-1",
+ "title": "To launch a Scheduled Instance in a VPC"
+ },
+ {
+ "input": {
+ "InstanceCount": 1,
+ "LaunchSpecification": {
+ "IamInstanceProfile": {
+ "Name": "my-iam-role"
+ },
+ "ImageId": "ami-12345678",
+ "InstanceType": "c4.large",
+ "KeyName": "my-key-pair",
+ "Placement": {
+ "AvailabilityZone": "us-west-2b"
+ },
+ "SecurityGroupIds": [
+ "sg-12345678"
+ ]
+ },
+ "ScheduledInstanceId": "sci-1234-1234-1234-1234-123456789012"
+ },
+ "output": {
+ "InstanceIdSet": [
+ "i-1234567890abcdef0"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example launches the specified Scheduled Instance in EC2-Classic.",
+ "id": "ec2-run-scheduled-instances-2",
+ "title": "To launch a Scheduled Instance in EC2-Classic"
+ }
+ ],
+ "UnassignPrivateIpAddresses": [
+ {
+ "input": {
+ "NetworkInterfaceId": "eni-e5aa89a3",
+ "PrivateIpAddresses": [
+ "10.0.0.82"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example unassigns the specified private IP address from the specified network interface.",
+ "id": "ec2-unassign-private-ip-addresses-1",
+ "title": "To unassign a secondary private IP address from a network interface"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-04-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-04-01/paginators-1.json
new file mode 100644
index 00000000..2bd01ad5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-04-01/paginators-1.json
@@ -0,0 +1,63 @@
+{
+ "pagination": {
+ "DescribeInstanceStatus": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "InstanceStatuses"
+ },
+ "DescribeInstances": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Reservations"
+ },
+ "DescribeReservedInstancesOfferings": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ReservedInstancesOfferings"
+ },
+ "DescribeReservedInstancesModifications": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "ReservedInstancesModifications"
+ },
+ "DescribeSnapshots": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Snapshots"
+ },
+ "DescribeSpotFleetRequests": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SpotFleetRequestConfigs"
+ },
+ "DescribeSpotPriceHistory": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SpotPriceHistory"
+ },
+ "DescribeTags": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Tags"
+ },
+ "DescribeVolumeStatus": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "VolumeStatuses"
+ },
+ "DescribeVolumes": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Volumes"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-04-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-04-01/service-2.json.gz
new file mode 100644
index 00000000..030f1207
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-04-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-04-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-04-01/waiters-2.json
new file mode 100644
index 00000000..aa36a044
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-04-01/waiters-2.json
@@ -0,0 +1,607 @@
+{
+ "version": 2,
+ "waiters": {
+ "InstanceExists": {
+ "delay": 5,
+ "maxAttempts": 40,
+ "operation": "DescribeInstances",
+ "acceptors": [
+ {
+ "matcher": "path",
+ "expected": true,
+ "argument": "length(Reservations[]) > `0`",
+ "state": "success"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidInstanceID.NotFound",
+ "state": "retry"
+ }
+ ]
+ },
+ "BundleTaskComplete": {
+ "delay": 15,
+ "operation": "DescribeBundleTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "complete",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "BundleTasks[].State"
+ },
+ {
+ "expected": "failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "BundleTasks[].State"
+ }
+ ]
+ },
+ "ConsoleOutputAvailable": {
+ "operation": "GetConsoleOutput",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "length(Output || '') > `0`",
+ "expected": true
+ }
+ ]
+ },
+ "ConversionTaskCancelled": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "cancelled",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskCompleted": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ },
+ {
+ "expected": "cancelled",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ConversionTasks[].State"
+ },
+ {
+ "expected": "cancelling",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskDeleted": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "CustomerGatewayAvailable": {
+ "delay": 15,
+ "operation": "DescribeCustomerGateways",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "CustomerGateways[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CustomerGateways[].State"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CustomerGateways[].State"
+ }
+ ]
+ },
+ "ExportTaskCancelled": {
+ "delay": 15,
+ "operation": "DescribeExportTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "cancelled",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ExportTasks[].State"
+ }
+ ]
+ },
+ "ExportTaskCompleted": {
+ "delay": 15,
+ "operation": "DescribeExportTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ExportTasks[].State"
+ }
+ ]
+ },
+ "ImageExists": {
+ "operation": "DescribeImages",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "matcher": "path",
+ "expected": true,
+ "argument": "length(Images[]) > `0`",
+ "state": "success"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidAMIID.NotFound",
+ "state": "retry"
+ }
+ ]
+ },
+ "ImageAvailable": {
+ "operation": "DescribeImages",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "Images[].State",
+ "expected": "available"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "Images[].State",
+ "expected": "failed"
+ }
+ ]
+ },
+ "InstanceRunning": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "running",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "shutting-down",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "terminated",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "stopping",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidInstanceID.NotFound",
+ "state": "retry"
+ }
+ ]
+ },
+ "InstanceStatusOk": {
+ "operation": "DescribeInstanceStatus",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "InstanceStatuses[].InstanceStatus.Status",
+ "expected": "ok"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidInstanceID.NotFound",
+ "state": "retry"
+ }
+ ]
+ },
+ "InstanceStopped": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "stopped",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "terminated",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ }
+ ]
+ },
+ "InstanceTerminated": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "terminated",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "stopping",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ }
+ ]
+ },
+ "KeyPairExists": {
+ "operation": "DescribeKeyPairs",
+ "delay": 5,
+ "maxAttempts": 6,
+ "acceptors": [
+ {
+ "expected": true,
+ "matcher": "path",
+ "state": "success",
+ "argument": "length(KeyPairs[].KeyName) > `0`"
+ },
+ {
+ "expected": "InvalidKeyPair.NotFound",
+ "matcher": "error",
+ "state": "retry"
+ }
+ ]
+ },
+ "NatGatewayAvailable": {
+ "operation": "DescribeNatGateways",
+ "delay": 15,
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "NatGateways[].State",
+ "expected": "available"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "NatGateways[].State",
+ "expected": "failed"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "NatGateways[].State",
+ "expected": "deleting"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "NatGateways[].State",
+ "expected": "deleted"
+ },
+ {
+ "state": "retry",
+ "matcher": "error",
+ "expected": "NatGatewayNotFound"
+ }
+ ]
+ },
+ "NetworkAclExists": {
+ "operation": "DescribeNetworkAcls",
+ "delay": 20,
+ "maxAttempts": 10,
+ "acceptors": [
+ {
+ "matcher": "path",
+ "expected": true,
+ "argument": "length(NetworkAcls[]) > `0`",
+ "state": "success"
+ },
+ {
+ "expected": "InvalidNetworkAclID.NotFound",
+ "matcher": "error",
+ "state": "retry"
+ }
+ ]
+ },
+ "NetworkInterfaceAvailable": {
+ "operation": "DescribeNetworkInterfaces",
+ "delay": 20,
+ "maxAttempts": 10,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "NetworkInterfaces[].Status"
+ },
+ {
+ "expected": "InvalidNetworkInterfaceID.NotFound",
+ "matcher": "error",
+ "state": "failure"
+ }
+ ]
+ },
+ "PasswordDataAvailable": {
+ "operation": "GetPasswordData",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "length(PasswordData) > `0`",
+ "expected": true
+ }
+ ]
+ },
+ "SnapshotCompleted": {
+ "delay": 15,
+ "operation": "DescribeSnapshots",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Snapshots[].State"
+ }
+ ]
+ },
+ "SpotInstanceRequestFulfilled": {
+ "operation": "DescribeSpotInstanceRequests",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "fulfilled"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "schedule-expired"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "canceled-before-fulfillment"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "bad-parameters"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "system-error"
+ }
+ ]
+ },
+ "SubnetAvailable": {
+ "delay": 15,
+ "operation": "DescribeSubnets",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Subnets[].State"
+ }
+ ]
+ },
+ "SystemStatusOk": {
+ "operation": "DescribeInstanceStatus",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "InstanceStatuses[].SystemStatus.Status",
+ "expected": "ok"
+ }
+ ]
+ },
+ "VolumeAvailable": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Volumes[].State"
+ }
+ ]
+ },
+ "VolumeDeleted": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidVolume.NotFound",
+ "state": "success"
+ }
+ ]
+ },
+ "VolumeInUse": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "in-use",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Volumes[].State"
+ }
+ ]
+ },
+ "VpcAvailable": {
+ "delay": 15,
+ "operation": "DescribeVpcs",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Vpcs[].State"
+ }
+ ]
+ },
+ "VpnConnectionAvailable": {
+ "delay": 60,
+ "operation": "DescribeVpnConnections",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ }
+ ]
+ },
+ "VpnConnectionDeleted": {
+ "delay": 15,
+ "operation": "DescribeVpnConnections",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ }
+ ]
+ },
+ "VpcPeeringConnectionExists": {
+ "delay": 15,
+ "operation": "DescribeVpcPeeringConnections",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "matcher": "status",
+ "expected": 200,
+ "state": "success"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidVpcPeeringConnectionID.NotFound",
+ "state": "retry"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-09-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-09-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..5c789e5a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-09-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-09-15/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-09-15/examples-1.json
new file mode 100644
index 00000000..f6a8719f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-09-15/examples-1.json
@@ -0,0 +1,3740 @@
+{
+ "version": "1.0",
+ "examples": {
+ "AllocateAddress": [
+ {
+ "input": {
+ "Domain": "vpc"
+ },
+ "output": {
+ "AllocationId": "eipalloc-64d5890a",
+ "Domain": "vpc",
+ "PublicIp": "203.0.113.0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example allocates an Elastic IP address to use with an instance in a VPC.",
+ "id": "ec2-allocate-address-1",
+ "title": "To allocate an Elastic IP address for EC2-VPC"
+ },
+ {
+ "output": {
+ "Domain": "standard",
+ "PublicIp": "198.51.100.0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example allocates an Elastic IP address to use with an instance in EC2-Classic.",
+ "id": "ec2-allocate-address-2",
+ "title": "To allocate an Elastic IP address for EC2-Classic"
+ }
+ ],
+ "AssignPrivateIpAddresses": [
+ {
+ "input": {
+ "NetworkInterfaceId": "eni-e5aa89a3",
+ "PrivateIpAddresses": [
+ "10.0.0.82"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example assigns the specified secondary private IP address to the specified network interface.",
+ "id": "ec2-assign-private-ip-addresses-1",
+ "title": "To assign a specific secondary private IP address to an interface"
+ },
+ {
+ "input": {
+ "NetworkInterfaceId": "eni-e5aa89a3",
+ "SecondaryPrivateIpAddressCount": 2
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example assigns two secondary private IP addresses to the specified network interface. Amazon EC2 automatically assigns these IP addresses from the available IP addresses in the CIDR block range of the subnet the network interface is associated with.",
+ "id": "ec2-assign-private-ip-addresses-2",
+ "title": "To assign secondary private IP addresses that Amazon EC2 selects to an interface"
+ }
+ ],
+ "AssociateAddress": [
+ {
+ "input": {
+ "AllocationId": "eipalloc-64d5890a",
+ "InstanceId": "i-0b263919b6498b123"
+ },
+ "output": {
+ "AssociationId": "eipassoc-2bebb745"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the specified Elastic IP address with the specified instance in a VPC.",
+ "id": "ec2-associate-address-1",
+ "title": "To associate an Elastic IP address in EC2-VPC"
+ },
+ {
+ "input": {
+ "AllocationId": "eipalloc-64d5890a",
+ "NetworkInterfaceId": "eni-1a2b3c4d"
+ },
+ "output": {
+ "AssociationId": "eipassoc-2bebb745"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the specified Elastic IP address with the specified network interface.",
+ "id": "ec2-associate-address-2",
+ "title": "To associate an Elastic IP address with a network interface"
+ },
+ {
+ "input": {
+ "InstanceId": "i-07ffe74c7330ebf53",
+ "PublicIp": "198.51.100.0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates an Elastic IP address with an instance in EC2-Classic.",
+ "id": "ec2-associate-address-3",
+ "title": "To associate an Elastic IP address in EC2-Classic"
+ }
+ ],
+ "AssociateDhcpOptions": [
+ {
+ "input": {
+ "DhcpOptionsId": "dopt-d9070ebb",
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the specified DHCP options set with the specified VPC.",
+ "id": "ec2-associate-dhcp-options-1",
+ "title": "To associate a DHCP options set with a VPC"
+ },
+ {
+ "input": {
+ "DhcpOptionsId": "default",
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the default DHCP options set with the specified VPC.",
+ "id": "ec2-associate-dhcp-options-2",
+ "title": "To associate the default DHCP options set with a VPC"
+ }
+ ],
+ "AssociateRouteTable": [
+ {
+ "input": {
+ "RouteTableId": "rtb-22574640",
+ "SubnetId": "subnet-9d4a7b6"
+ },
+ "output": {
+ "AssociationId": "rtbassoc-781d0d1a"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the specified route table with the specified subnet.",
+ "id": "ec2-associate-route-table-1",
+ "title": "To associate a route table with a subnet"
+ }
+ ],
+ "AttachInternetGateway": [
+ {
+ "input": {
+ "InternetGatewayId": "igw-c0a643a9",
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example attaches the specified Internet gateway to the specified VPC.",
+ "id": "ec2-attach-internet-gateway-1",
+ "title": "To attach an Internet gateway to a VPC"
+ }
+ ],
+ "AttachNetworkInterface": [
+ {
+ "input": {
+ "DeviceIndex": 1,
+ "InstanceId": "i-1234567890abcdef0",
+ "NetworkInterfaceId": "eni-e5aa89a3"
+ },
+ "output": {
+ "AttachmentId": "eni-attach-66c4350a"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example attaches the specified network interface to the specified instance.",
+ "id": "ec2-attach-network-interface-1",
+ "title": "To attach a network interface to an instance"
+ }
+ ],
+ "AttachVolume": [
+ {
+ "input": {
+ "Device": "/dev/sdf",
+ "InstanceId": "i-01474ef662b89480",
+ "VolumeId": "vol-1234567890abcdef0"
+ },
+ "output": {
+ "AttachTime": "2016-08-29T18:52:32.724Z",
+ "Device": "/dev/sdf",
+ "InstanceId": "i-01474ef662b89480",
+ "State": "attaching",
+ "VolumeId": "vol-1234567890abcdef0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example attaches a volume (``vol-1234567890abcdef0``) to an instance (``i-01474ef662b89480``) as ``/dev/sdf``.",
+ "id": "to-attach-a-volume-to-an-instance-1472499213109",
+ "title": "To attach a volume to an instance"
+ }
+ ],
+ "CancelSpotFleetRequests": [
+ {
+ "input": {
+ "SpotFleetRequestIds": [
+ "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ ],
+ "TerminateInstances": true
+ },
+ "output": {
+ "SuccessfulFleetRequests": [
+ {
+ "CurrentSpotFleetRequestState": "cancelled_running",
+ "PreviousSpotFleetRequestState": "active",
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example cancels the specified Spot fleet request and terminates its associated Spot Instances.",
+ "id": "ec2-cancel-spot-fleet-requests-1",
+ "title": "To cancel a Spot fleet request"
+ },
+ {
+ "input": {
+ "SpotFleetRequestIds": [
+ "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ ],
+ "TerminateInstances": false
+ },
+ "output": {
+ "SuccessfulFleetRequests": [
+ {
+ "CurrentSpotFleetRequestState": "cancelled_terminating",
+ "PreviousSpotFleetRequestState": "active",
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example cancels the specified Spot fleet request without terminating its associated Spot Instances.",
+ "id": "ec2-cancel-spot-fleet-requests-2",
+ "title": "To cancel a Spot fleet request without terminating its Spot Instances"
+ }
+ ],
+ "CancelSpotInstanceRequests": [
+ {
+ "input": {
+ "SpotInstanceRequestIds": [
+ "sir-08b93456"
+ ]
+ },
+ "output": {
+ "CancelledSpotInstanceRequests": [
+ {
+ "SpotInstanceRequestId": "sir-08b93456",
+ "State": "cancelled"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example cancels a Spot Instance request.",
+ "id": "ec2-cancel-spot-instance-requests-1",
+ "title": "To cancel Spot Instance requests"
+ }
+ ],
+ "ConfirmProductInstance": [
+ {
+ "input": {
+ "InstanceId": "i-1234567890abcdef0",
+ "ProductCode": "774F4FF8"
+ },
+ "output": {
+ "OwnerId": "123456789012"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example determines whether the specified product code is associated with the specified instance.",
+ "id": "to-confirm-the-product-instance-1472712108494",
+ "title": "To confirm the product instance"
+ }
+ ],
+ "CopySnapshot": [
+ {
+ "input": {
+ "Description": "This is my copied snapshot.",
+ "DestinationRegion": "us-east-1",
+ "SourceRegion": "us-west-2",
+ "SourceSnapshotId": "snap-066877671789bd71b"
+ },
+ "output": {
+ "SnapshotId": "snap-066877671789bd71b"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example copies a snapshot with the snapshot ID of ``snap-066877671789bd71b`` from the ``us-west-2`` region to the ``us-east-1`` region and adds a short description to identify the snapshot.",
+ "id": "to-copy-a-snapshot-1472502259774",
+ "title": "To copy a snapshot"
+ }
+ ],
+ "CreateCustomerGateway": [
+ {
+ "input": {
+ "BgpAsn": 65534,
+ "PublicIp": "12.1.2.3",
+ "Type": "ipsec.1"
+ },
+ "output": {
+ "CustomerGateway": {
+ "BgpAsn": "65534",
+ "CustomerGatewayId": "cgw-0e11f167",
+ "IpAddress": "12.1.2.3",
+ "State": "available",
+ "Type": "ipsec.1"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a customer gateway with the specified IP address for its outside interface.",
+ "id": "ec2-create-customer-gateway-1",
+ "title": "To create a customer gateway"
+ }
+ ],
+ "CreateDhcpOptions": [
+ {
+ "input": {
+ "DhcpConfigurations": [
+ {
+ "Key": "domain-name-servers",
+ "Values": [
+ "10.2.5.1",
+ "10.2.5.2"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "DhcpOptions": {
+ "DhcpConfigurations": [
+ {
+ "Key": "domain-name-servers",
+ "Values": [
+ {
+ "Value": "10.2.5.2"
+ },
+ {
+ "Value": "10.2.5.1"
+ }
+ ]
+ }
+ ],
+ "DhcpOptionsId": "dopt-d9070ebb"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a DHCP options set.",
+ "id": "ec2-create-dhcp-options-1",
+ "title": "To create a DHCP options set"
+ }
+ ],
+ "CreateInternetGateway": [
+ {
+ "output": {
+ "InternetGateway": {
+ "Attachments": [
+
+ ],
+ "InternetGatewayId": "igw-c0a643a9",
+ "Tags": [
+
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an Internet gateway.",
+ "id": "ec2-create-internet-gateway-1",
+ "title": "To create an Internet gateway"
+ }
+ ],
+ "CreateKeyPair": [
+ {
+ "input": {
+ "KeyName": "my-key-pair"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a key pair named my-key-pair.",
+ "id": "ec2-create-key-pair-1",
+ "title": "To create a key pair"
+ }
+ ],
+ "CreateNatGateway": [
+ {
+ "input": {
+ "AllocationId": "eipalloc-37fc1a52",
+ "SubnetId": "subnet-1a2b3c4d"
+ },
+ "output": {
+ "NatGateway": {
+ "CreateTime": "2015-12-17T12:45:26.732Z",
+ "NatGatewayAddresses": [
+ {
+ "AllocationId": "eipalloc-37fc1a52"
+ }
+ ],
+ "NatGatewayId": "nat-08d48af2a8e83edfd",
+ "State": "pending",
+ "SubnetId": "subnet-1a2b3c4d",
+ "VpcId": "vpc-1122aabb"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a NAT gateway in subnet subnet-1a2b3c4d and associates an Elastic IP address with the allocation ID eipalloc-37fc1a52 with the NAT gateway.",
+ "id": "ec2-create-nat-gateway-1",
+ "title": "To create a NAT gateway"
+ }
+ ],
+ "CreateNetworkAcl": [
+ {
+ "input": {
+ "VpcId": "vpc-a01106c2"
+ },
+ "output": {
+ "NetworkAcl": {
+ "Associations": [
+
+ ],
+ "Entries": [
+ {
+ "CidrBlock": "0.0.0.0/0",
+ "Egress": true,
+ "Protocol": "-1",
+ "RuleAction": "deny",
+ "RuleNumber": 32767
+ },
+ {
+ "CidrBlock": "0.0.0.0/0",
+ "Egress": false,
+ "Protocol": "-1",
+ "RuleAction": "deny",
+ "RuleNumber": 32767
+ }
+ ],
+ "IsDefault": false,
+ "NetworkAclId": "acl-5fb85d36",
+ "Tags": [
+
+ ],
+ "VpcId": "vpc-a01106c2"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a network ACL for the specified VPC.",
+ "id": "ec2-create-network-acl-1",
+ "title": "To create a network ACL"
+ }
+ ],
+ "CreateNetworkAclEntry": [
+ {
+ "input": {
+ "CidrBlock": "0.0.0.0/0",
+ "Egress": false,
+ "NetworkAclId": "acl-5fb85d36",
+ "PortRange": {
+ "From": 53,
+ "To": 53
+ },
+ "Protocol": "udp",
+ "RuleAction": "allow",
+ "RuleNumber": 100
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an entry for the specified network ACL. The rule allows ingress traffic from anywhere (0.0.0.0/0) on UDP port 53 (DNS) into any associated subnet.",
+ "id": "ec2-create-network-acl-entry-1",
+ "title": "To create a network ACL entry"
+ }
+ ],
+ "CreateNetworkInterface": [
+ {
+ "input": {
+ "Description": "my network interface",
+ "Groups": [
+ "sg-903004f8"
+ ],
+ "PrivateIpAddress": "10.0.2.17",
+ "SubnetId": "subnet-9d4a7b6c"
+ },
+ "output": {
+ "NetworkInterface": {
+ "AvailabilityZone": "us-east-1d",
+ "Description": "my network interface",
+ "Groups": [
+ {
+ "GroupId": "sg-903004f8",
+ "GroupName": "default"
+ }
+ ],
+ "MacAddress": "02:1a:80:41:52:9c",
+ "NetworkInterfaceId": "eni-e5aa89a3",
+ "OwnerId": "123456789012",
+ "PrivateIpAddress": "10.0.2.17",
+ "PrivateIpAddresses": [
+ {
+ "Primary": true,
+ "PrivateIpAddress": "10.0.2.17"
+ }
+ ],
+ "RequesterManaged": false,
+ "SourceDestCheck": true,
+ "Status": "pending",
+ "SubnetId": "subnet-9d4a7b6c",
+ "TagSet": [
+
+ ],
+ "VpcId": "vpc-a01106c2"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a network interface for the specified subnet.",
+ "id": "ec2-create-network-interface-1",
+ "title": "To create a network interface"
+ }
+ ],
+ "CreatePlacementGroup": [
+ {
+ "input": {
+ "GroupName": "my-cluster",
+ "Strategy": "cluster"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a placement group with the specified name.",
+ "id": "to-create-a-placement-group-1472712245768",
+ "title": "To create a placement group"
+ }
+ ],
+ "CreateRoute": [
+ {
+ "input": {
+ "DestinationCidrBlock": "0.0.0.0/0",
+ "GatewayId": "igw-c0a643a9",
+ "RouteTableId": "rtb-22574640"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a route for the specified route table. The route matches all traffic (0.0.0.0/0) and routes it to the specified Internet gateway.",
+ "id": "ec2-create-route-1",
+ "title": "To create a route"
+ }
+ ],
+ "CreateRouteTable": [
+ {
+ "input": {
+ "VpcId": "vpc-a01106c2"
+ },
+ "output": {
+ "RouteTable": {
+ "Associations": [
+
+ ],
+ "PropagatingVgws": [
+
+ ],
+ "RouteTableId": "rtb-22574640",
+ "Routes": [
+ {
+ "DestinationCidrBlock": "10.0.0.0/16",
+ "GatewayId": "local",
+ "State": "active"
+ }
+ ],
+ "Tags": [
+
+ ],
+ "VpcId": "vpc-a01106c2"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a route table for the specified VPC.",
+ "id": "ec2-create-route-table-1",
+ "title": "To create a route table"
+ }
+ ],
+ "CreateSnapshot": [
+ {
+ "input": {
+ "Description": "This is my root volume snapshot.",
+ "VolumeId": "vol-1234567890abcdef0"
+ },
+ "output": {
+ "Description": "This is my root volume snapshot.",
+ "OwnerId": "012345678910",
+ "SnapshotId": "snap-066877671789bd71b",
+ "StartTime": "2014-02-28T21:06:01.000Z",
+ "State": "pending",
+ "Tags": [
+
+ ],
+ "VolumeId": "vol-1234567890abcdef0",
+ "VolumeSize": 8
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a snapshot of the volume with a volume ID of ``vol-1234567890abcdef0`` and a short description to identify the snapshot.",
+ "id": "to-create-a-snapshot-1472502529790",
+ "title": "To create a snapshot"
+ }
+ ],
+ "CreateSpotDatafeedSubscription": [
+ {
+ "input": {
+ "Bucket": "my-s3-bucket",
+ "Prefix": "spotdata"
+ },
+ "output": {
+ "SpotDatafeedSubscription": {
+ "Bucket": "my-s3-bucket",
+ "OwnerId": "123456789012",
+ "Prefix": "spotdata",
+ "State": "Active"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a Spot Instance data feed for your AWS account.",
+ "id": "ec2-create-spot-datafeed-subscription-1",
+ "title": "To create a Spot Instance datafeed"
+ }
+ ],
+ "CreateSubnet": [
+ {
+ "input": {
+ "CidrBlock": "10.0.1.0/24",
+ "VpcId": "vpc-a01106c2"
+ },
+ "output": {
+ "Subnet": {
+ "AvailabilityZone": "us-west-2c",
+ "AvailableIpAddressCount": 251,
+ "CidrBlock": "10.0.1.0/24",
+ "State": "pending",
+ "SubnetId": "subnet-9d4a7b6c",
+ "VpcId": "vpc-a01106c2"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a subnet in the specified VPC with the specified CIDR block. We recommend that you let us select an Availability Zone for you.",
+ "id": "ec2-create-subnet-1",
+ "title": "To create a subnet"
+ }
+ ],
+ "CreateTags": [
+ {
+ "input": {
+ "Resources": [
+ "ami-78a54011"
+ ],
+ "Tags": [
+ {
+ "Key": "Stack",
+ "Value": "production"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example adds the tag Stack=production to the specified image, or overwrites an existing tag for the AMI where the tag key is Stack.",
+ "id": "ec2-create-tags-1",
+ "title": "To add a tag to a resource"
+ }
+ ],
+ "CreateVolume": [
+ {
+ "input": {
+ "AvailabilityZone": "us-east-1a",
+ "Size": 80,
+ "VolumeType": "gp2"
+ },
+ "output": {
+ "AvailabilityZone": "us-east-1a",
+ "CreateTime": "2016-08-29T18:52:32.724Z",
+ "Encrypted": false,
+ "Iops": 240,
+ "Size": 80,
+ "SnapshotId": "",
+ "State": "creating",
+ "VolumeId": "vol-6b60b7c7",
+ "VolumeType": "gp2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an 80 GiB General Purpose (SSD) volume in the Availability Zone ``us-east-1a``.",
+ "id": "to-create-a-new-volume-1472496724296",
+ "title": "To create a new volume"
+ },
+ {
+ "input": {
+ "AvailabilityZone": "us-east-1a",
+ "Iops": 1000,
+ "SnapshotId": "snap-066877671789bd71b",
+ "VolumeType": "io1"
+ },
+ "output": {
+ "Attachments": [
+
+ ],
+ "AvailabilityZone": "us-east-1a",
+ "CreateTime": "2016-08-29T18:52:32.724Z",
+ "Iops": 1000,
+ "Size": 500,
+ "SnapshotId": "snap-066877671789bd71b",
+ "State": "creating",
+ "Tags": [
+
+ ],
+ "VolumeId": "vol-1234567890abcdef0",
+ "VolumeType": "io1"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a new Provisioned IOPS (SSD) volume with 1000 provisioned IOPS from a snapshot in the Availability Zone ``us-east-1a``.",
+ "id": "to-create-a-new-provisioned-iops-ssd-volume-from-a-snapshot-1472498975176",
+ "title": "To create a new Provisioned IOPS (SSD) volume from a snapshot"
+ }
+ ],
+ "CreateVpc": [
+ {
+ "input": {
+ "CidrBlock": "10.0.0.0/16"
+ },
+ "output": {
+ "Vpc": {
+ "CidrBlock": "10.0.0.0/16",
+ "DhcpOptionsId": "dopt-7a8b9c2d",
+ "InstanceTenancy": "default",
+ "State": "pending",
+ "VpcId": "vpc-a01106c2"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a VPC with the specified CIDR block.",
+ "id": "ec2-create-vpc-1",
+ "title": "To create a VPC"
+ }
+ ],
+ "DeleteCustomerGateway": [
+ {
+ "input": {
+ "CustomerGatewayId": "cgw-0e11f167"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified customer gateway.",
+ "id": "ec2-delete-customer-gateway-1",
+ "title": "To delete a customer gateway"
+ }
+ ],
+ "DeleteDhcpOptions": [
+ {
+ "input": {
+ "DhcpOptionsId": "dopt-d9070ebb"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified DHCP options set.",
+ "id": "ec2-delete-dhcp-options-1",
+ "title": "To delete a DHCP options set"
+ }
+ ],
+ "DeleteInternetGateway": [
+ {
+ "input": {
+ "InternetGatewayId": "igw-c0a643a9"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified Internet gateway.",
+ "id": "ec2-delete-internet-gateway-1",
+ "title": "To delete an Internet gateway"
+ }
+ ],
+ "DeleteKeyPair": [
+ {
+ "input": {
+ "KeyName": "my-key-pair"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified key pair.",
+ "id": "ec2-delete-key-pair-1",
+ "title": "To delete a key pair"
+ }
+ ],
+ "DeleteNatGateway": [
+ {
+ "input": {
+ "NatGatewayId": "nat-04ae55e711cec5680"
+ },
+ "output": {
+ "NatGatewayId": "nat-04ae55e711cec5680"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified NAT gateway.",
+ "id": "ec2-delete-nat-gateway-1",
+ "title": "To delete a NAT gateway"
+ }
+ ],
+ "DeleteNetworkAcl": [
+ {
+ "input": {
+ "NetworkAclId": "acl-5fb85d36"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified network ACL.",
+ "id": "ec2-delete-network-acl-1",
+ "title": "To delete a network ACL"
+ }
+ ],
+ "DeleteNetworkAclEntry": [
+ {
+ "input": {
+ "Egress": true,
+ "NetworkAclId": "acl-5fb85d36",
+ "RuleNumber": 100
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes ingress rule number 100 from the specified network ACL.",
+ "id": "ec2-delete-network-acl-entry-1",
+ "title": "To delete a network ACL entry"
+ }
+ ],
+ "DeleteNetworkInterface": [
+ {
+ "input": {
+ "NetworkInterfaceId": "eni-e5aa89a3"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified network interface.",
+ "id": "ec2-delete-network-interface-1",
+ "title": "To delete a network interface"
+ }
+ ],
+ "DeletePlacementGroup": [
+ {
+ "input": {
+ "GroupName": "my-cluster"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified placement group.\n",
+ "id": "to-delete-a-placement-group-1472712349959",
+ "title": "To delete a placement group"
+ }
+ ],
+ "DeleteRoute": [
+ {
+ "input": {
+ "DestinationCidrBlock": "0.0.0.0/0",
+ "RouteTableId": "rtb-22574640"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified route from the specified route table.",
+ "id": "ec2-delete-route-1",
+ "title": "To delete a route"
+ }
+ ],
+ "DeleteRouteTable": [
+ {
+ "input": {
+ "RouteTableId": "rtb-22574640"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified route table.",
+ "id": "ec2-delete-route-table-1",
+ "title": "To delete a route table"
+ }
+ ],
+ "DeleteSnapshot": [
+ {
+ "input": {
+ "SnapshotId": "snap-1234567890abcdef0"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes a snapshot with the snapshot ID of ``snap-1234567890abcdef0``. If the command succeeds, no output is returned.",
+ "id": "to-delete-a-snapshot-1472503042567",
+ "title": "To delete a snapshot"
+ }
+ ],
+ "DeleteSpotDatafeedSubscription": [
+ {
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes a Spot data feed subscription for the account.",
+ "id": "ec2-delete-spot-datafeed-subscription-1",
+ "title": "To cancel a Spot Instance data feed subscription"
+ }
+ ],
+ "DeleteSubnet": [
+ {
+ "input": {
+ "SubnetId": "subnet-9d4a7b6c"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified subnet.",
+ "id": "ec2-delete-subnet-1",
+ "title": "To delete a subnet"
+ }
+ ],
+ "DeleteTags": [
+ {
+ "input": {
+ "Resources": [
+ "ami-78a54011"
+ ],
+ "Tags": [
+ {
+ "Key": "Stack",
+ "Value": "test"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the tag Stack=test from the specified image.",
+ "id": "ec2-delete-tags-1",
+ "title": "To delete a tag from a resource"
+ }
+ ],
+ "DeleteVolume": [
+ {
+ "input": {
+ "VolumeId": "vol-049df61146c4d7901"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes an available volume with the volume ID of ``vol-049df61146c4d7901``. If the command succeeds, no output is returned.",
+ "id": "to-delete-a-volume-1472503111160",
+ "title": "To delete a volume"
+ }
+ ],
+ "DeleteVpc": [
+ {
+ "input": {
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified VPC.",
+ "id": "ec2-delete-vpc-1",
+ "title": "To delete a VPC"
+ }
+ ],
+ "DescribeAccountAttributes": [
+ {
+ "input": {
+ "AttributeNames": [
+ "supported-platforms"
+ ]
+ },
+ "output": {
+ "AccountAttributes": [
+ {
+ "AttributeName": "supported-platforms",
+ "AttributeValues": [
+ {
+ "AttributeValue": "EC2"
+ },
+ {
+ "AttributeValue": "VPC"
+ }
+ ]
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the supported-platforms attribute for your AWS account.",
+ "id": "ec2-describe-account-attributes-1",
+ "title": "To describe a single attribute for your AWS account"
+ },
+ {
+ "output": {
+ "AccountAttributes": [
+ {
+ "AttributeName": "supported-platforms",
+ "AttributeValues": [
+ {
+ "AttributeValue": "EC2"
+ },
+ {
+ "AttributeValue": "VPC"
+ }
+ ]
+ },
+ {
+ "AttributeName": "vpc-max-security-groups-per-interface",
+ "AttributeValues": [
+ {
+ "AttributeValue": "5"
+ }
+ ]
+ },
+ {
+ "AttributeName": "max-elastic-ips",
+ "AttributeValues": [
+ {
+ "AttributeValue": "5"
+ }
+ ]
+ },
+ {
+ "AttributeName": "max-instances",
+ "AttributeValues": [
+ {
+ "AttributeValue": "20"
+ }
+ ]
+ },
+ {
+ "AttributeName": "vpc-max-elastic-ips",
+ "AttributeValues": [
+ {
+ "AttributeValue": "5"
+ }
+ ]
+ },
+ {
+ "AttributeName": "default-vpc",
+ "AttributeValues": [
+ {
+ "AttributeValue": "none"
+ }
+ ]
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the attributes for your AWS account.",
+ "id": "ec2-describe-account-attributes-2",
+ "title": "To describe all attributes for your AWS account"
+ }
+ ],
+ "DescribeAddresses": [
+ {
+ "output": {
+ "Addresses": [
+ {
+ "Domain": "standard",
+ "InstanceId": "i-1234567890abcdef0",
+ "PublicIp": "198.51.100.0"
+ },
+ {
+ "AllocationId": "eipalloc-12345678",
+ "AssociationId": "eipassoc-12345678",
+ "Domain": "vpc",
+ "InstanceId": "i-1234567890abcdef0",
+ "NetworkInterfaceId": "eni-12345678",
+ "NetworkInterfaceOwnerId": "123456789012",
+ "PrivateIpAddress": "10.0.1.241",
+ "PublicIp": "203.0.113.0"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes your Elastic IP addresses.",
+ "id": "ec2-describe-addresses-1",
+ "title": "To describe your Elastic IP addresses"
+ },
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "domain",
+ "Values": [
+ "vpc"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "Addresses": [
+ {
+ "AllocationId": "eipalloc-12345678",
+ "AssociationId": "eipassoc-12345678",
+ "Domain": "vpc",
+ "InstanceId": "i-1234567890abcdef0",
+ "NetworkInterfaceId": "eni-12345678",
+ "NetworkInterfaceOwnerId": "123456789012",
+ "PrivateIpAddress": "10.0.1.241",
+ "PublicIp": "203.0.113.0"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes your Elastic IP addresses for use with instances in a VPC.",
+ "id": "ec2-describe-addresses-2",
+ "title": "To describe your Elastic IP addresses for EC2-VPC"
+ },
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "domain",
+ "Values": [
+ "standard"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "Addresses": [
+ {
+ "Domain": "standard",
+ "InstanceId": "i-1234567890abcdef0",
+ "PublicIp": "198.51.100.0"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes your Elastic IP addresses for use with instances in EC2-Classic.",
+ "id": "ec2-describe-addresses-3",
+ "title": "To describe your Elastic IP addresses for EC2-Classic"
+ }
+ ],
+ "DescribeAvailabilityZones": [
+ {
+ "output": {
+ "AvailabilityZones": [
+ {
+ "Messages": [
+
+ ],
+ "RegionName": "us-east-1",
+ "State": "available",
+ "ZoneName": "us-east-1b"
+ },
+ {
+ "Messages": [
+
+ ],
+ "RegionName": "us-east-1",
+ "State": "available",
+ "ZoneName": "us-east-1c"
+ },
+ {
+ "Messages": [
+
+ ],
+ "RegionName": "us-east-1",
+ "State": "available",
+ "ZoneName": "us-east-1d"
+ },
+ {
+ "Messages": [
+
+ ],
+ "RegionName": "us-east-1",
+ "State": "available",
+ "ZoneName": "us-east-1e"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the Availability Zones that are available to you. The response includes Availability Zones only for the current region.",
+ "id": "ec2-describe-availability-zones-1",
+ "title": "To describe your Availability Zones"
+ }
+ ],
+ "DescribeCustomerGateways": [
+ {
+ "input": {
+ "CustomerGatewayIds": [
+ "cgw-0e11f167"
+ ]
+ },
+ "output": {
+ "CustomerGateways": [
+ {
+ "BgpAsn": "65534",
+ "CustomerGatewayId": "cgw-0e11f167",
+ "IpAddress": "12.1.2.3",
+ "State": "available",
+ "Type": "ipsec.1"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified customer gateway.",
+ "id": "ec2-describe-customer-gateways-1",
+ "title": "To describe a customer gateway"
+ }
+ ],
+ "DescribeDhcpOptions": [
+ {
+ "input": {
+ "DhcpOptionsIds": [
+ "dopt-d9070ebb"
+ ]
+ },
+ "output": {
+ "DhcpOptions": [
+ {
+ "DhcpConfigurations": [
+ {
+ "Key": "domain-name-servers",
+ "Values": [
+ {
+ "Value": "10.2.5.2"
+ },
+ {
+ "Value": "10.2.5.1"
+ }
+ ]
+ }
+ ],
+ "DhcpOptionsId": "dopt-d9070ebb"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified DHCP options set.",
+ "id": "ec2-describe-dhcp-options-1",
+ "title": "To describe a DHCP options set"
+ }
+ ],
+ "DescribeInstanceAttribute": [
+ {
+ "input": {
+ "Attribute": "instanceType",
+ "InstanceId": "i-1234567890abcdef0"
+ },
+ "output": {
+ "InstanceId": "i-1234567890abcdef0",
+ "InstanceType": {
+ "Value": "t1.micro"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the instance type of the specified instance.\n",
+ "id": "to-describe-the-instance-type-1472712432132",
+ "title": "To describe the instance type"
+ },
+ {
+ "input": {
+ "Attribute": "disableApiTermination",
+ "InstanceId": "i-1234567890abcdef0"
+ },
+ "output": {
+ "DisableApiTermination": {
+ "Value": "false"
+ },
+ "InstanceId": "i-1234567890abcdef0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the ``disableApiTermination`` attribute of the specified instance.\n",
+ "id": "to-describe-the-disableapitermination-attribute-1472712533466",
+ "title": "To describe the disableApiTermination attribute"
+ },
+ {
+ "input": {
+ "Attribute": "blockDeviceMapping",
+ "InstanceId": "i-1234567890abcdef0"
+ },
+ "output": {
+ "BlockDeviceMappings": [
+ {
+ "DeviceName": "/dev/sda1",
+ "Ebs": {
+ "AttachTime": "2013-05-17T22:42:34.000Z",
+ "DeleteOnTermination": true,
+ "Status": "attached",
+ "VolumeId": "vol-049df61146c4d7901"
+ }
+ },
+ {
+ "DeviceName": "/dev/sdf",
+ "Ebs": {
+ "AttachTime": "2013-09-10T23:07:00.000Z",
+ "DeleteOnTermination": false,
+ "Status": "attached",
+ "VolumeId": "vol-049df61146c4d7901"
+ }
+ }
+ ],
+ "InstanceId": "i-1234567890abcdef0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the ``blockDeviceMapping`` attribute of the specified instance.\n",
+ "id": "to-describe-the-block-device-mapping-for-an-instance-1472712645423",
+ "title": "To describe the block device mapping for an instance"
+ }
+ ],
+ "DescribeInternetGateways": [
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "attachment.vpc-id",
+ "Values": [
+ "vpc-a01106c2"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "InternetGateways": [
+ {
+ "Attachments": [
+ {
+ "State": "available",
+ "VpcId": "vpc-a01106c2"
+ }
+ ],
+ "InternetGatewayId": "igw-c0a643a9",
+ "Tags": [
+
+ ]
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the Internet gateway for the specified VPC.",
+ "id": "ec2-describe-internet-gateways-1",
+ "title": "To describe the Internet gateway for a VPC"
+ }
+ ],
+ "DescribeKeyPairs": [
+ {
+ "input": {
+ "KeyNames": [
+ "my-key-pair"
+ ]
+ },
+ "output": {
+ "KeyPairs": [
+ {
+ "KeyFingerprint": "1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f",
+ "KeyName": "my-key-pair"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example displays the fingerprint for the specified key.",
+ "id": "ec2-describe-key-pairs-1",
+ "title": "To display a key pair"
+ }
+ ],
+ "DescribeMovingAddresses": [
+ {
+ "output": {
+ "MovingAddressStatuses": [
+ {
+ "MoveStatus": "MovingToVpc",
+ "PublicIp": "198.51.100.0"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes all of your moving Elastic IP addresses.",
+ "id": "ec2-describe-moving-addresses-1",
+ "title": "To describe your moving addresses"
+ }
+ ],
+ "DescribeNatGateways": [
+ {
+ "input": {
+ "Filter": [
+ {
+ "Name": "vpc-id",
+ "Values": [
+ "vpc-1a2b3c4d"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "NatGateways": [
+ {
+ "CreateTime": "2015-12-01T12:26:55.983Z",
+ "NatGatewayAddresses": [
+ {
+ "AllocationId": "eipalloc-89c620ec",
+ "NetworkInterfaceId": "eni-9dec76cd",
+ "PrivateIp": "10.0.0.149",
+ "PublicIp": "198.11.222.333"
+ }
+ ],
+ "NatGatewayId": "nat-05dba92075d71c408",
+ "State": "available",
+ "SubnetId": "subnet-847e4dc2",
+ "VpcId": "vpc-1a2b3c4d"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the NAT gateway for the specified VPC.",
+ "id": "ec2-describe-nat-gateways-1",
+ "title": "To describe a NAT gateway"
+ }
+ ],
+ "DescribeNetworkAcls": [
+ {
+ "input": {
+ "NetworkAclIds": [
+ "acl-5fb85d36"
+ ]
+ },
+ "output": {
+ "NetworkAcls": [
+ {
+ "Associations": [
+ {
+ "NetworkAclAssociationId": "aclassoc-66ea5f0b",
+ "NetworkAclId": "acl-9aeb5ef7",
+ "SubnetId": "subnet-65ea5f08"
+ }
+ ],
+ "Entries": [
+ {
+ "CidrBlock": "0.0.0.0/0",
+ "Egress": true,
+ "Protocol": "-1",
+ "RuleAction": "deny",
+ "RuleNumber": 32767
+ },
+ {
+ "CidrBlock": "0.0.0.0/0",
+ "Egress": false,
+ "Protocol": "-1",
+ "RuleAction": "deny",
+ "RuleNumber": 32767
+ }
+ ],
+ "IsDefault": false,
+ "NetworkAclId": "acl-5fb85d36",
+ "Tags": [
+
+ ],
+ "VpcId": "vpc-a01106c2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified network ACL.",
+ "id": "ec2-",
+ "title": "To describe a network ACL"
+ }
+ ],
+ "DescribeNetworkInterfaceAttribute": [
+ {
+ "input": {
+ "Attribute": "attachment",
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "output": {
+ "Attachment": {
+ "AttachTime": "2015-05-21T20:02:20.000Z",
+ "AttachmentId": "eni-attach-43348162",
+ "DeleteOnTermination": true,
+ "DeviceIndex": 0,
+ "InstanceId": "i-1234567890abcdef0",
+ "InstanceOwnerId": "123456789012",
+ "Status": "attached"
+ },
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the attachment attribute of the specified network interface.",
+ "id": "ec2-describe-network-interface-attribute-1",
+ "title": "To describe the attachment attribute of a network interface"
+ },
+ {
+ "input": {
+ "Attribute": "description",
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "output": {
+ "Description": {
+ "Value": "My description"
+ },
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the description attribute of the specified network interface.",
+ "id": "ec2-describe-network-interface-attribute-2",
+ "title": "To describe the description attribute of a network interface"
+ },
+ {
+ "input": {
+ "Attribute": "groupSet",
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "output": {
+ "Groups": [
+ {
+ "GroupId": "sg-903004f8",
+ "GroupName": "my-security-group"
+ }
+ ],
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the groupSet attribute of the specified network interface.",
+ "id": "ec2-describe-network-interface-attribute-3",
+ "title": "To describe the groupSet attribute of a network interface"
+ },
+ {
+ "input": {
+ "Attribute": "sourceDestCheck",
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "output": {
+ "NetworkInterfaceId": "eni-686ea200",
+ "SourceDestCheck": {
+ "Value": true
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the sourceDestCheck attribute of the specified network interface.",
+ "id": "ec2-describe-network-interface-attribute-4",
+ "title": "To describe the sourceDestCheck attribute of a network interface"
+ }
+ ],
+ "DescribeNetworkInterfaces": [
+ {
+ "input": {
+ "NetworkInterfaceIds": [
+ "eni-e5aa89a3"
+ ]
+ },
+ "output": {
+ "NetworkInterfaces": [
+ {
+ "Association": {
+ "AssociationId": "eipassoc-0fbb766a",
+ "IpOwnerId": "123456789012",
+ "PublicDnsName": "ec2-203-0-113-12.compute-1.amazonaws.com",
+ "PublicIp": "203.0.113.12"
+ },
+ "Attachment": {
+ "AttachTime": "2013-11-30T23:36:42.000Z",
+ "AttachmentId": "eni-attach-66c4350a",
+ "DeleteOnTermination": false,
+ "DeviceIndex": 1,
+ "InstanceId": "i-1234567890abcdef0",
+ "InstanceOwnerId": "123456789012",
+ "Status": "attached"
+ },
+ "AvailabilityZone": "us-east-1d",
+ "Description": "my network interface",
+ "Groups": [
+ {
+ "GroupId": "sg-8637d3e3",
+ "GroupName": "default"
+ }
+ ],
+ "MacAddress": "02:2f:8f:b0:cf:75",
+ "NetworkInterfaceId": "eni-e5aa89a3",
+ "OwnerId": "123456789012",
+ "PrivateDnsName": "ip-10-0-1-17.ec2.internal",
+ "PrivateIpAddress": "10.0.1.17",
+ "PrivateIpAddresses": [
+ {
+ "Association": {
+ "AssociationId": "eipassoc-0fbb766a",
+ "IpOwnerId": "123456789012",
+ "PublicDnsName": "ec2-203-0-113-12.compute-1.amazonaws.com",
+ "PublicIp": "203.0.113.12"
+ },
+ "Primary": true,
+ "PrivateDnsName": "ip-10-0-1-17.ec2.internal",
+ "PrivateIpAddress": "10.0.1.17"
+ }
+ ],
+ "RequesterManaged": false,
+ "SourceDestCheck": true,
+ "Status": "in-use",
+ "SubnetId": "subnet-b61f49f0",
+ "TagSet": [
+
+ ],
+ "VpcId": "vpc-a01106c2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "",
+ "id": "ec2-describe-network-interfaces-1",
+ "title": "To describe a network interface"
+ }
+ ],
+ "DescribeRegions": [
+ {
+ "output": {
+ "Regions": [
+ {
+ "Endpoint": "ec2.ap-south-1.amazonaws.com",
+ "RegionName": "ap-south-1"
+ },
+ {
+ "Endpoint": "ec2.eu-west-1.amazonaws.com",
+ "RegionName": "eu-west-1"
+ },
+ {
+ "Endpoint": "ec2.ap-southeast-1.amazonaws.com",
+ "RegionName": "ap-southeast-1"
+ },
+ {
+ "Endpoint": "ec2.ap-southeast-2.amazonaws.com",
+ "RegionName": "ap-southeast-2"
+ },
+ {
+ "Endpoint": "ec2.eu-central-1.amazonaws.com",
+ "RegionName": "eu-central-1"
+ },
+ {
+ "Endpoint": "ec2.ap-northeast-2.amazonaws.com",
+ "RegionName": "ap-northeast-2"
+ },
+ {
+ "Endpoint": "ec2.ap-northeast-1.amazonaws.com",
+ "RegionName": "ap-northeast-1"
+ },
+ {
+ "Endpoint": "ec2.us-east-1.amazonaws.com",
+ "RegionName": "us-east-1"
+ },
+ {
+ "Endpoint": "ec2.sa-east-1.amazonaws.com",
+ "RegionName": "sa-east-1"
+ },
+ {
+ "Endpoint": "ec2.us-west-1.amazonaws.com",
+ "RegionName": "us-west-1"
+ },
+ {
+ "Endpoint": "ec2.us-west-2.amazonaws.com",
+ "RegionName": "us-west-2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes all the regions that are available to you.",
+ "id": "ec2-describe-regions-1",
+ "title": "To describe your regions"
+ }
+ ],
+ "DescribeRouteTables": [
+ {
+ "input": {
+ "RouteTableIds": [
+ "rtb-1f382e7d"
+ ]
+ },
+ "output": {
+ "RouteTables": [
+ {
+ "Associations": [
+ {
+ "Main": true,
+ "RouteTableAssociationId": "rtbassoc-d8ccddba",
+ "RouteTableId": "rtb-1f382e7d"
+ }
+ ],
+ "PropagatingVgws": [
+
+ ],
+ "RouteTableId": "rtb-1f382e7d",
+ "Routes": [
+ {
+ "DestinationCidrBlock": "10.0.0.0/16",
+ "GatewayId": "local",
+ "State": "active"
+ }
+ ],
+ "Tags": [
+
+ ],
+ "VpcId": "vpc-a01106c2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified route table.",
+ "id": "ec2-describe-route-tables-1",
+ "title": "To describe a route table"
+ }
+ ],
+ "DescribeScheduledInstanceAvailability": [
+ {
+ "input": {
+ "FirstSlotStartTimeRange": {
+ "EarliestTime": "2016-01-31T00:00:00Z",
+ "LatestTime": "2016-01-31T04:00:00Z"
+ },
+ "Recurrence": {
+ "Frequency": "Weekly",
+ "Interval": 1,
+ "OccurrenceDays": [
+ 1
+ ]
+ }
+ },
+ "output": {
+ "ScheduledInstanceAvailabilitySet": [
+ {
+ "AvailabilityZone": "us-west-2b",
+ "AvailableInstanceCount": 20,
+ "FirstSlotStartTime": "2016-01-31T00:00:00Z",
+ "HourlyPrice": "0.095",
+ "InstanceType": "c4.large",
+ "MaxTermDurationInDays": 366,
+ "MinTermDurationInDays": 366,
+ "NetworkPlatform": "EC2-VPC",
+ "Platform": "Linux/UNIX",
+ "PurchaseToken": "eyJ2IjoiMSIsInMiOjEsImMiOi...",
+ "Recurrence": {
+ "Frequency": "Weekly",
+ "Interval": 1,
+ "OccurrenceDaySet": [
+ 1
+ ],
+ "OccurrenceRelativeToEnd": false
+ },
+ "SlotDurationInHours": 23,
+ "TotalScheduledInstanceHours": 1219
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes a schedule that occurs every week on Sunday, starting on the specified date. Note that the output contains a single schedule as an example.",
+ "id": "ec2-describe-scheduled-instance-availability-1",
+ "title": "To describe an available schedule"
+ }
+ ],
+ "DescribeScheduledInstances": [
+ {
+ "input": {
+ "ScheduledInstanceIds": [
+ "sci-1234-1234-1234-1234-123456789012"
+ ]
+ },
+ "output": {
+ "ScheduledInstanceSet": [
+ {
+ "AvailabilityZone": "us-west-2b",
+ "CreateDate": "2016-01-25T21:43:38.612Z",
+ "HourlyPrice": "0.095",
+ "InstanceCount": 1,
+ "InstanceType": "c4.large",
+ "NetworkPlatform": "EC2-VPC",
+ "NextSlotStartTime": "2016-01-31T09:00:00Z",
+ "Platform": "Linux/UNIX",
+ "Recurrence": {
+ "Frequency": "Weekly",
+ "Interval": 1,
+ "OccurrenceDaySet": [
+ 1
+ ],
+ "OccurrenceRelativeToEnd": false,
+ "OccurrenceUnit": ""
+ },
+ "ScheduledInstanceId": "sci-1234-1234-1234-1234-123456789012",
+ "SlotDurationInHours": 32,
+ "TermEndDate": "2017-01-31T09:00:00Z",
+ "TermStartDate": "2016-01-31T09:00:00Z",
+ "TotalScheduledInstanceHours": 1696
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified Scheduled Instance.",
+ "id": "ec2-describe-scheduled-instances-1",
+ "title": "To describe your Scheduled Instances"
+ }
+ ],
+ "DescribeSnapshotAttribute": [
+ {
+ "input": {
+ "Attribute": "createVolumePermission",
+ "SnapshotId": "snap-066877671789bd71b"
+ },
+ "output": {
+ "CreateVolumePermissions": [
+
+ ],
+ "SnapshotId": "snap-066877671789bd71b"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the ``createVolumePermission`` attribute on a snapshot with the snapshot ID of ``snap-066877671789bd71b``.",
+ "id": "to-describe-snapshot-attributes-1472503199736",
+ "title": "To describe snapshot attributes"
+ }
+ ],
+ "DescribeSnapshots": [
+ {
+ "input": {
+ "SnapshotIds": [
+ "snap-1234567890abcdef0"
+ ]
+ },
+ "output": {
+ "NextToken": "",
+ "Snapshots": [
+ {
+ "Description": "This is my snapshot.",
+ "OwnerId": "012345678910",
+ "Progress": "100%",
+ "SnapshotId": "snap-1234567890abcdef0",
+ "StartTime": "2014-02-28T21:28:32.000Z",
+ "State": "completed",
+ "VolumeId": "vol-049df61146c4d7901",
+ "VolumeSize": 8
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes a snapshot with the snapshot ID of ``snap-1234567890abcdef0``.",
+ "id": "to-describe-a-snapshot-1472503807850",
+ "title": "To describe a snapshot"
+ },
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "status",
+ "Values": [
+ "pending"
+ ]
+ }
+ ],
+ "OwnerIds": [
+ "012345678910"
+ ]
+ },
+ "output": {
+ "NextToken": "",
+ "Snapshots": [
+ {
+ "Description": "This is my copied snapshot.",
+ "OwnerId": "012345678910",
+ "Progress": "87%",
+ "SnapshotId": "snap-066877671789bd71b",
+ "StartTime": "2014-02-28T21:37:27.000Z",
+ "State": "pending",
+ "VolumeId": "vol-1234567890abcdef0",
+ "VolumeSize": 8
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes all snapshots owned by the ID 012345678910 that are in the ``pending`` status.",
+ "id": "to-describe-snapshots-using-filters-1472503929793",
+ "title": "To describe snapshots using filters"
+ }
+ ],
+ "DescribeSpotDatafeedSubscription": [
+ {
+ "output": {
+ "SpotDatafeedSubscription": {
+ "Bucket": "my-s3-bucket",
+ "OwnerId": "123456789012",
+ "Prefix": "spotdata",
+ "State": "Active"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the Spot Instance datafeed subscription for your AWS account.",
+ "id": "ec2-describe-spot-datafeed-subscription-1",
+ "title": "To describe the datafeed for your AWS account"
+ }
+ ],
+ "DescribeSpotFleetInstances": [
+ {
+ "input": {
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ },
+ "output": {
+ "ActiveInstances": [
+ {
+ "InstanceId": "i-1234567890abcdef0",
+ "InstanceType": "m3.medium",
+ "SpotInstanceRequestId": "sir-08b93456"
+ }
+ ],
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists the Spot Instances associated with the specified Spot fleet.",
+ "id": "ec2-describe-spot-fleet-instances-1",
+ "title": "To describe the Spot Instances associated with a Spot fleet"
+ }
+ ],
+ "DescribeSpotFleetRequestHistory": [
+ {
+ "input": {
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE",
+ "StartTime": "2015-05-26T00:00:00Z"
+ },
+ "output": {
+ "HistoryRecords": [
+ {
+ "EventInformation": {
+ "EventSubType": "submitted"
+ },
+ "EventType": "fleetRequestChange",
+ "Timestamp": "2015-05-26T23:17:20.697Z"
+ },
+ {
+ "EventInformation": {
+ "EventSubType": "active"
+ },
+ "EventType": "fleetRequestChange",
+ "Timestamp": "2015-05-26T23:17:20.873Z"
+ },
+ {
+ "EventInformation": {
+ "EventSubType": "launched",
+ "InstanceId": "i-1234567890abcdef0"
+ },
+ "EventType": "instanceChange",
+ "Timestamp": "2015-05-26T23:21:21.712Z"
+ },
+ {
+ "EventInformation": {
+ "EventSubType": "launched",
+ "InstanceId": "i-1234567890abcdef1"
+ },
+ "EventType": "instanceChange",
+ "Timestamp": "2015-05-26T23:21:21.816Z"
+ }
+ ],
+ "NextToken": "CpHNsscimcV5oH7bSbub03CI2Qms5+ypNpNm+53MNlR0YcXAkp0xFlfKf91yVxSExmbtma3awYxMFzNA663ZskT0AHtJ6TCb2Z8bQC2EnZgyELbymtWPfpZ1ZbauVg+P+TfGlWxWWB/Vr5dk5d4LfdgA/DRAHUrYgxzrEXAMPLE=",
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE",
+ "StartTime": "2015-05-26T00:00:00Z"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example returns the history for the specified Spot fleet starting at the specified time.",
+ "id": "ec2-describe-spot-fleet-request-history-1",
+ "title": "To describe Spot fleet history"
+ }
+ ],
+ "DescribeSpotFleetRequests": [
+ {
+ "input": {
+ "SpotFleetRequestIds": [
+ "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ ]
+ },
+ "output": {
+ "SpotFleetRequestConfigs": [
+ {
+ "SpotFleetRequestConfig": {
+ "IamFleetRole": "arn:aws:iam::123456789012:role/my-spot-fleet-role",
+ "LaunchSpecifications": [
+ {
+ "EbsOptimized": false,
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "cc2.8xlarge",
+ "NetworkInterfaces": [
+ {
+ "AssociatePublicIpAddress": true,
+ "DeleteOnTermination": false,
+ "DeviceIndex": 0,
+ "SecondaryPrivateIpAddressCount": 0,
+ "SubnetId": "subnet-a61dafcf"
+ }
+ ]
+ },
+ {
+ "EbsOptimized": false,
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "r3.8xlarge",
+ "NetworkInterfaces": [
+ {
+ "AssociatePublicIpAddress": true,
+ "DeleteOnTermination": false,
+ "DeviceIndex": 0,
+ "SecondaryPrivateIpAddressCount": 0,
+ "SubnetId": "subnet-a61dafcf"
+ }
+ ]
+ }
+ ],
+ "SpotPrice": "0.05",
+ "TargetCapacity": 20
+ },
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE",
+ "SpotFleetRequestState": "active"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified Spot fleet request.",
+ "id": "ec2-describe-spot-fleet-requests-1",
+ "title": "To describe a Spot fleet request"
+ }
+ ],
+ "DescribeSpotInstanceRequests": [
+ {
+ "input": {
+ "SpotInstanceRequestIds": [
+ "sir-08b93456"
+ ]
+ },
+ "output": {
+ "SpotInstanceRequests": [
+ {
+ "CreateTime": "2014-04-30T18:14:55.000Z",
+ "InstanceId": "i-1234567890abcdef0",
+ "LaunchSpecification": {
+ "BlockDeviceMappings": [
+ {
+ "DeviceName": "/dev/sda1",
+ "Ebs": {
+ "DeleteOnTermination": true,
+ "VolumeSize": 8,
+ "VolumeType": "standard"
+ }
+ }
+ ],
+ "EbsOptimized": false,
+ "ImageId": "ami-7aba833f",
+ "InstanceType": "m1.small",
+ "KeyName": "my-key-pair",
+ "SecurityGroups": [
+ {
+ "GroupId": "sg-e38f24a7",
+ "GroupName": "my-security-group"
+ }
+ ]
+ },
+ "LaunchedAvailabilityZone": "us-west-1b",
+ "ProductDescription": "Linux/UNIX",
+ "SpotInstanceRequestId": "sir-08b93456",
+ "SpotPrice": "0.010000",
+ "State": "active",
+ "Status": {
+ "Code": "fulfilled",
+ "Message": "Your Spot request is fulfilled.",
+ "UpdateTime": "2014-04-30T18:16:21.000Z"
+ },
+ "Type": "one-time"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified Spot Instance request.",
+ "id": "ec2-describe-spot-instance-requests-1",
+ "title": "To describe a Spot Instance request"
+ }
+ ],
+ "DescribeSpotPriceHistory": [
+ {
+ "input": {
+ "EndTime": "2014-01-06T08:09:10",
+ "InstanceTypes": [
+ "m1.xlarge"
+ ],
+ "ProductDescriptions": [
+ "Linux/UNIX (Amazon VPC)"
+ ],
+ "StartTime": "2014-01-06T07:08:09"
+ },
+ "output": {
+ "SpotPriceHistory": [
+ {
+ "AvailabilityZone": "us-west-1a",
+ "InstanceType": "m1.xlarge",
+ "ProductDescription": "Linux/UNIX (Amazon VPC)",
+ "SpotPrice": "0.080000",
+ "Timestamp": "2014-01-06T04:32:53.000Z"
+ },
+ {
+ "AvailabilityZone": "us-west-1c",
+ "InstanceType": "m1.xlarge",
+ "ProductDescription": "Linux/UNIX (Amazon VPC)",
+ "SpotPrice": "0.080000",
+ "Timestamp": "2014-01-05T11:28:26.000Z"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example returns the Spot Price history for m1.xlarge, Linux/UNIX (Amazon VPC) instances for a particular day in January.",
+ "id": "ec2-describe-spot-price-history-1",
+ "title": "To describe Spot price history for Linux/UNIX (Amazon VPC)"
+ }
+ ],
+ "DescribeSubnets": [
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "vpc-id",
+ "Values": [
+ "vpc-a01106c2"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "Subnets": [
+ {
+ "AvailabilityZone": "us-east-1c",
+ "AvailableIpAddressCount": 251,
+ "CidrBlock": "10.0.1.0/24",
+ "DefaultForAz": false,
+ "MapPublicIpOnLaunch": false,
+ "State": "available",
+ "SubnetId": "subnet-9d4a7b6c",
+ "VpcId": "vpc-a01106c2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the subnets for the specified VPC.",
+ "id": "ec2-describe-subnets-1",
+ "title": "To describe the subnets for a VPC"
+ }
+ ],
+ "DescribeTags": [
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "resource-id",
+ "Values": [
+ "i-1234567890abcdef8"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "Tags": [
+ {
+ "Key": "Stack",
+ "ResourceId": "i-1234567890abcdef8",
+ "ResourceType": "instance",
+ "Value": "test"
+ },
+ {
+ "Key": "Name",
+ "ResourceId": "i-1234567890abcdef8",
+ "ResourceType": "instance",
+ "Value": "Beta Server"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the tags for the specified instance.",
+ "id": "ec2-describe-tags-1",
+ "title": "To describe the tags for a single resource"
+ }
+ ],
+ "DescribeVolumeAttribute": [
+ {
+ "input": {
+ "Attribute": "autoEnableIO",
+ "VolumeId": "vol-049df61146c4d7901"
+ },
+ "output": {
+ "AutoEnableIO": {
+ "Value": false
+ },
+ "VolumeId": "vol-049df61146c4d7901"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the ``autoEnableIo`` attribute of the volume with the ID ``vol-049df61146c4d7901``.",
+ "id": "to-describe-a-volume-attribute-1472505773492",
+ "title": "To describe a volume attribute"
+ }
+ ],
+ "DescribeVolumeStatus": [
+ {
+ "input": {
+ "VolumeIds": [
+ "vol-1234567890abcdef0"
+ ]
+ },
+ "output": {
+ "VolumeStatuses": [
+ {
+ "Actions": [
+
+ ],
+ "AvailabilityZone": "us-east-1a",
+ "Events": [
+
+ ],
+ "VolumeId": "vol-1234567890abcdef0",
+ "VolumeStatus": {
+ "Details": [
+ {
+ "Name": "io-enabled",
+ "Status": "passed"
+ },
+ {
+ "Name": "io-performance",
+ "Status": "not-applicable"
+ }
+ ],
+ "Status": "ok"
+ }
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the status for the volume ``vol-1234567890abcdef0``.",
+ "id": "to-describe-the-status-of-a-single-volume-1472507016193",
+ "title": "To describe the status of a single volume"
+ },
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "volume-status.status",
+ "Values": [
+ "impaired"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "VolumeStatuses": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the status for all volumes that are impaired. In this example output, there are no impaired volumes.",
+ "id": "to-describe-the-status-of-impaired-volumes-1472507239821",
+ "title": "To describe the status of impaired volumes"
+ }
+ ],
+ "DescribeVolumes": [
+ {
+ "input": {
+ },
+ "output": {
+ "NextToken": "",
+ "Volumes": [
+ {
+ "Attachments": [
+ {
+ "AttachTime": "2013-12-18T22:35:00.000Z",
+ "DeleteOnTermination": true,
+ "Device": "/dev/sda1",
+ "InstanceId": "i-1234567890abcdef0",
+ "State": "attached",
+ "VolumeId": "vol-049df61146c4d7901"
+ }
+ ],
+ "AvailabilityZone": "us-east-1a",
+ "CreateTime": "2013-12-18T22:35:00.084Z",
+ "Size": 8,
+ "SnapshotId": "snap-1234567890abcdef0",
+ "State": "in-use",
+ "VolumeId": "vol-049df61146c4d7901",
+ "VolumeType": "standard"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes all of your volumes in the default region.",
+ "id": "to-describe-all-volumes-1472506358883",
+ "title": "To describe all volumes"
+ },
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "attachment.instance-id",
+ "Values": [
+ "i-1234567890abcdef0"
+ ]
+ },
+ {
+ "Name": "attachment.delete-on-termination",
+ "Values": [
+ "true"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "Volumes": [
+ {
+ "Attachments": [
+ {
+ "AttachTime": "2013-12-18T22:35:00.000Z",
+ "DeleteOnTermination": true,
+ "Device": "/dev/sda1",
+ "InstanceId": "i-1234567890abcdef0",
+ "State": "attached",
+ "VolumeId": "vol-049df61146c4d7901"
+ }
+ ],
+ "AvailabilityZone": "us-east-1a",
+ "CreateTime": "2013-12-18T22:35:00.084Z",
+ "Size": 8,
+ "SnapshotId": "snap-1234567890abcdef0",
+ "State": "in-use",
+ "VolumeId": "vol-049df61146c4d7901",
+ "VolumeType": "standard"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes all volumes that are both attached to the instance with the ID i-1234567890abcdef0 and set to delete when the instance terminates.",
+ "id": "to-describe-volumes-that-are-attached-to-a-specific-instance-1472506613578",
+ "title": "To describe volumes that are attached to a specific instance"
+ }
+ ],
+ "DescribeVpcAttribute": [
+ {
+ "input": {
+ "Attribute": "enableDnsSupport",
+ "VpcId": "vpc-a01106c2"
+ },
+ "output": {
+ "EnableDnsSupport": {
+ "Value": true
+ },
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the enableDnsSupport attribute. This attribute indicates whether DNS resolution is enabled for the VPC. If this attribute is true, the Amazon DNS server resolves DNS hostnames for your instances to their corresponding IP addresses; otherwise, it does not.",
+ "id": "ec2-describe-vpc-attribute-1",
+ "title": "To describe the enableDnsSupport attribute"
+ },
+ {
+ "input": {
+ "Attribute": "enableDnsHostnames",
+ "VpcId": "vpc-a01106c2"
+ },
+ "output": {
+ "EnableDnsHostnames": {
+ "Value": true
+ },
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the enableDnsHostnames attribute. This attribute indicates whether the instances launched in the VPC get DNS hostnames. If this attribute is true, instances in the VPC get DNS hostnames; otherwise, they do not.",
+ "id": "ec2-describe-vpc-attribute-2",
+ "title": "To describe the enableDnsHostnames attribute"
+ }
+ ],
+ "DescribeVpcs": [
+ {
+ "input": {
+ "VpcIds": [
+ "vpc-a01106c2"
+ ]
+ },
+ "output": {
+ "Vpcs": [
+ {
+ "CidrBlock": "10.0.0.0/16",
+ "DhcpOptionsId": "dopt-7a8b9c2d",
+ "InstanceTenancy": "default",
+ "IsDefault": false,
+ "State": "available",
+ "Tags": [
+ {
+ "Key": "Name",
+ "Value": "MyVPC"
+ }
+ ],
+ "VpcId": "vpc-a01106c2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified VPC.",
+ "id": "ec2-describe-vpcs-1",
+ "title": "To describe a VPC"
+ }
+ ],
+ "DetachInternetGateway": [
+ {
+ "input": {
+ "InternetGatewayId": "igw-c0a643a9",
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example detaches the specified Internet gateway from the specified VPC.",
+ "id": "ec2-detach-internet-gateway-1",
+ "title": "To detach an Internet gateway from a VPC"
+ }
+ ],
+ "DetachNetworkInterface": [
+ {
+ "input": {
+ "AttachmentId": "eni-attach-66c4350a"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example detaches the specified network interface from its attached instance.",
+ "id": "ec2-detach-network-interface-1",
+ "title": "To detach a network interface from an instance"
+ }
+ ],
+ "DetachVolume": [
+ {
+ "input": {
+ "VolumeId": "vol-1234567890abcdef0"
+ },
+ "output": {
+ "AttachTime": "2014-02-27T19:23:06.000Z",
+ "Device": "/dev/sdb",
+ "InstanceId": "i-1234567890abcdef0",
+ "State": "detaching",
+ "VolumeId": "vol-049df61146c4d7901"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example detaches the volume (``vol-049df61146c4d7901``) from the instance it is attached to.",
+ "id": "to-detach-a-volume-from-an-instance-1472507977694",
+ "title": "To detach a volume from an instance"
+ }
+ ],
+ "DisableVgwRoutePropagation": [
+ {
+ "input": {
+ "GatewayId": "vgw-9a4cacf3",
+ "RouteTableId": "rtb-22574640"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example disables the specified virtual private gateway from propagating static routes to the specified route table.",
+ "id": "ec2-disable-vgw-route-propagation-1",
+ "title": "To disable route propagation"
+ }
+ ],
+ "DisassociateAddress": [
+ {
+ "input": {
+ "AssociationId": "eipassoc-2bebb745"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example disassociates an Elastic IP address from an instance in a VPC.",
+ "id": "ec2-disassociate-address-1",
+ "title": "To disassociate an Elastic IP address in EC2-VPC"
+ },
+ {
+ "input": {
+ "PublicIp": "198.51.100.0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example disassociates an Elastic IP address from an instance in EC2-Classic.",
+ "id": "ec2-disassociate-address-2",
+ "title": "To disassociate an Elastic IP addresses in EC2-Classic"
+ }
+ ],
+ "DisassociateRouteTable": [
+ {
+ "input": {
+ "AssociationId": "rtbassoc-781d0d1a"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example disassociates the specified route table from its associated subnet.",
+ "id": "ec2-disassociate-route-table-1",
+ "title": "To disassociate a route table"
+ }
+ ],
+ "EnableVgwRoutePropagation": [
+ {
+ "input": {
+ "GatewayId": "vgw-9a4cacf3",
+ "RouteTableId": "rtb-22574640"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example enables the specified virtual private gateway to propagate static routes to the specified route table.",
+ "id": "ec2-enable-vgw-route-propagation-1",
+ "title": "To enable route propagation"
+ }
+ ],
+ "EnableVolumeIO": [
+ {
+ "input": {
+ "VolumeId": "vol-1234567890abcdef0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example enables I/O on volume ``vol-1234567890abcdef0``.",
+ "id": "to-enable-io-for-a-volume-1472508114867",
+ "title": "To enable I/O for a volume"
+ }
+ ],
+ "ModifyNetworkInterfaceAttribute": [
+ {
+ "input": {
+ "Attachment": {
+ "AttachmentId": "eni-attach-43348162",
+ "DeleteOnTermination": false
+ },
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies the attachment attribute of the specified network interface.",
+ "id": "ec2-modify-network-interface-attribute-1",
+ "title": "To modify the attachment attribute of a network interface"
+ },
+ {
+ "input": {
+ "Description": {
+ "Value": "My description"
+ },
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies the description attribute of the specified network interface.",
+ "id": "ec2-modify-network-interface-attribute-2",
+ "title": "To modify the description attribute of a network interface"
+ },
+ {
+ "input": {
+ "Groups": [
+ "sg-903004f8",
+ "sg-1a2b3c4d"
+ ],
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example command modifies the groupSet attribute of the specified network interface.",
+ "id": "ec2-modify-network-interface-attribute-3",
+ "title": "To modify the groupSet attribute of a network interface"
+ },
+ {
+ "input": {
+ "NetworkInterfaceId": "eni-686ea200",
+ "SourceDestCheck": {
+ "Value": false
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example command modifies the sourceDestCheck attribute of the specified network interface.",
+ "id": "ec2-modify-network-interface-attribute-4",
+ "title": "To modify the sourceDestCheck attribute of a network interface"
+ }
+ ],
+ "ModifySnapshotAttribute": [
+ {
+ "input": {
+ "Attribute": "createVolumePermission",
+ "OperationType": "remove",
+ "SnapshotId": "snap-1234567890abcdef0",
+ "UserIds": [
+ "123456789012"
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies snapshot ``snap-1234567890abcdef0`` to remove the create volume permission for a user with the account ID ``123456789012``. If the command succeeds, no output is returned.",
+ "id": "to-modify-a-snapshot-attribute-1472508385907",
+ "title": "To modify a snapshot attribute"
+ },
+ {
+ "input": {
+ "Attribute": "createVolumePermission",
+ "GroupNames": [
+ "all"
+ ],
+ "OperationType": "add",
+ "SnapshotId": "snap-1234567890abcdef0"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example makes the snapshot ``snap-1234567890abcdef0`` public.",
+ "id": "to-make-a-snapshot-public-1472508470529",
+ "title": "To make a snapshot public"
+ }
+ ],
+ "ModifySpotFleetRequest": [
+ {
+ "input": {
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE",
+ "TargetCapacity": 20
+ },
+ "output": {
+ "Return": true
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example increases the target capacity of the specified Spot fleet request.",
+ "id": "ec2-modify-spot-fleet-request-1",
+ "title": "To increase the target capacity of a Spot fleet request"
+ },
+ {
+ "input": {
+ "ExcessCapacityTerminationPolicy": "NoTermination ",
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE",
+ "TargetCapacity": 10
+ },
+ "output": {
+ "Return": true
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example decreases the target capacity of the specified Spot fleet request without terminating any Spot Instances as a result.",
+ "id": "ec2-modify-spot-fleet-request-2",
+ "title": "To decrease the target capacity of a Spot fleet request"
+ }
+ ],
+ "ModifySubnetAttribute": [
+ {
+ "input": {
+ "MapPublicIpOnLaunch": {
+ "Value": true
+ },
+ "SubnetId": "subnet-1a2b3c4d"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies the specified subnet so that all instances launched into this subnet are assigned a public IP address.",
+ "id": "ec2-modify-subnet-attribute-1",
+ "title": "To change a subnet's public IP addressing behavior"
+ }
+ ],
+ "ModifyVolumeAttribute": [
+ {
+ "input": {
+ "AutoEnableIO": {
+ "Value": true
+ },
+ "DryRun": true,
+ "VolumeId": "vol-1234567890abcdef0"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example sets the ``autoEnableIo`` attribute of the volume with the ID ``vol-1234567890abcdef0`` to ``true``. If the command succeeds, no output is returned.",
+ "id": "to-modify-a-volume-attribute-1472508596749",
+ "title": "To modify a volume attribute"
+ }
+ ],
+ "ModifyVpcAttribute": [
+ {
+ "input": {
+ "EnableDnsSupport": {
+ "Value": false
+ },
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies the enableDnsSupport attribute. This attribute indicates whether DNS resolution is enabled for the VPC. If this attribute is true, the Amazon DNS server resolves DNS hostnames for instances in the VPC to their corresponding IP addresses; otherwise, it does not.",
+ "id": "ec2-modify-vpc-attribute-1",
+ "title": "To modify the enableDnsSupport attribute"
+ },
+ {
+ "input": {
+ "EnableDnsHostnames": {
+ "Value": false
+ },
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies the enableDnsHostnames attribute. This attribute indicates whether instances launched in the VPC get DNS hostnames. If this attribute is true, instances in the VPC get DNS hostnames; otherwise, they do not.",
+ "id": "ec2-modify-vpc-attribute-2",
+ "title": "To modify the enableDnsHostnames attribute"
+ }
+ ],
+ "MoveAddressToVpc": [
+ {
+ "input": {
+ "PublicIp": "54.123.4.56"
+ },
+ "output": {
+ "Status": "MoveInProgress"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example moves the specified Elastic IP address to the EC2-VPC platform.",
+ "id": "ec2-move-address-to-vpc-1",
+ "title": "To move an address to EC2-VPC"
+ }
+ ],
+ "PurchaseScheduledInstances": [
+ {
+ "input": {
+ "PurchaseRequests": [
+ {
+ "InstanceCount": 1,
+ "PurchaseToken": "eyJ2IjoiMSIsInMiOjEsImMiOi..."
+ }
+ ]
+ },
+ "output": {
+ "ScheduledInstanceSet": [
+ {
+ "AvailabilityZone": "us-west-2b",
+ "CreateDate": "2016-01-25T21:43:38.612Z",
+ "HourlyPrice": "0.095",
+ "InstanceCount": 1,
+ "InstanceType": "c4.large",
+ "NetworkPlatform": "EC2-VPC",
+ "NextSlotStartTime": "2016-01-31T09:00:00Z",
+ "Platform": "Linux/UNIX",
+ "Recurrence": {
+ "Frequency": "Weekly",
+ "Interval": 1,
+ "OccurrenceDaySet": [
+ 1
+ ],
+ "OccurrenceRelativeToEnd": false,
+ "OccurrenceUnit": ""
+ },
+ "ScheduledInstanceId": "sci-1234-1234-1234-1234-123456789012",
+ "SlotDurationInHours": 32,
+ "TermEndDate": "2017-01-31T09:00:00Z",
+ "TermStartDate": "2016-01-31T09:00:00Z",
+ "TotalScheduledInstanceHours": 1696
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example purchases a Scheduled Instance.",
+ "id": "ec2-purchase-scheduled-instances-1",
+ "title": "To purchase a Scheduled Instance"
+ }
+ ],
+ "ReleaseAddress": [
+ {
+ "input": {
+ "AllocationId": "eipalloc-64d5890a"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example releases an Elastic IP address for use with instances in a VPC.",
+ "id": "ec2-release-address-1",
+ "title": "To release an Elastic IP address for EC2-VPC"
+ },
+ {
+ "input": {
+ "PublicIp": "198.51.100.0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example releases an Elastic IP address for use with instances in EC2-Classic.",
+ "id": "ec2-release-address-2",
+ "title": "To release an Elastic IP addresses for EC2-Classic"
+ }
+ ],
+ "ReplaceNetworkAclAssociation": [
+ {
+ "input": {
+ "AssociationId": "aclassoc-e5b95c8c",
+ "NetworkAclId": "acl-5fb85d36"
+ },
+ "output": {
+ "NewAssociationId": "aclassoc-3999875b"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the specified network ACL with the subnet for the specified network ACL association.",
+ "id": "ec2-replace-network-acl-association-1",
+ "title": "To replace the network ACL associated with a subnet"
+ }
+ ],
+ "ReplaceNetworkAclEntry": [
+ {
+ "input": {
+ "CidrBlock": "203.0.113.12/24",
+ "Egress": false,
+ "NetworkAclId": "acl-5fb85d36",
+ "PortRange": {
+ "From": 53,
+ "To": 53
+ },
+ "Protocol": "udp",
+ "RuleAction": "allow",
+ "RuleNumber": 100
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example replaces an entry for the specified network ACL. The new rule 100 allows ingress traffic from 203.0.113.12/24 on UDP port 53 (DNS) into any associated subnet.",
+ "id": "ec2-replace-network-acl-entry-1",
+ "title": "To replace a network ACL entry"
+ }
+ ],
+ "ReplaceRoute": [
+ {
+ "input": {
+ "DestinationCidrBlock": "10.0.0.0/16",
+ "GatewayId": "vgw-9a4cacf3",
+ "RouteTableId": "rtb-22574640"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example replaces the specified route in the specified table table. The new route matches the specified CIDR and sends the traffic to the specified virtual private gateway.",
+ "id": "ec2-replace-route-1",
+ "title": "To replace a route"
+ }
+ ],
+ "ReplaceRouteTableAssociation": [
+ {
+ "input": {
+ "AssociationId": "rtbassoc-781d0d1a",
+ "RouteTableId": "rtb-22574640"
+ },
+ "output": {
+ "NewAssociationId": "rtbassoc-3a1f0f58"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the specified route table with the subnet for the specified route table association.",
+ "id": "ec2-replace-route-table-association-1",
+ "title": "To replace the route table associated with a subnet"
+ }
+ ],
+ "RequestSpotFleet": [
+ {
+ "input": {
+ "SpotFleetRequestConfig": {
+ "IamFleetRole": "arn:aws:iam::123456789012:role/my-spot-fleet-role",
+ "LaunchSpecifications": [
+ {
+ "IamInstanceProfile": {
+ "Arn": "arn:aws:iam::123456789012:instance-profile/my-iam-role"
+ },
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "m3.medium",
+ "KeyName": "my-key-pair",
+ "SecurityGroups": [
+ {
+ "GroupId": "sg-1a2b3c4d"
+ }
+ ],
+ "SubnetId": "subnet-1a2b3c4d, subnet-3c4d5e6f"
+ }
+ ],
+ "SpotPrice": "0.04",
+ "TargetCapacity": 2
+ }
+ },
+ "output": {
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a Spot fleet request with two launch specifications that differ only by subnet. The Spot fleet launches the instances in the specified subnet with the lowest price. If the instances are launched in a default VPC, they receive a public IP address by default. If the instances are launched in a nondefault VPC, they do not receive a public IP address by default. Note that you can't specify different subnets from the same Availability Zone in a Spot fleet request.",
+ "id": "ec2-request-spot-fleet-1",
+ "title": "To request a Spot fleet in the subnet with the lowest price"
+ },
+ {
+ "input": {
+ "SpotFleetRequestConfig": {
+ "IamFleetRole": "arn:aws:iam::123456789012:role/my-spot-fleet-role",
+ "LaunchSpecifications": [
+ {
+ "IamInstanceProfile": {
+ "Arn": "arn:aws:iam::123456789012:instance-profile/my-iam-role"
+ },
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "m3.medium",
+ "KeyName": "my-key-pair",
+ "Placement": {
+ "AvailabilityZone": "us-west-2a, us-west-2b"
+ },
+ "SecurityGroups": [
+ {
+ "GroupId": "sg-1a2b3c4d"
+ }
+ ]
+ }
+ ],
+ "SpotPrice": "0.04",
+ "TargetCapacity": 2
+ }
+ },
+ "output": {
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a Spot fleet request with two launch specifications that differ only by Availability Zone. The Spot fleet launches the instances in the specified Availability Zone with the lowest price. If your account supports EC2-VPC only, Amazon EC2 launches the Spot instances in the default subnet of the Availability Zone. If your account supports EC2-Classic, Amazon EC2 launches the instances in EC2-Classic in the Availability Zone.",
+ "id": "ec2-request-spot-fleet-2",
+ "title": "To request a Spot fleet in the Availability Zone with the lowest price"
+ },
+ {
+ "input": {
+ "SpotFleetRequestConfig": {
+ "IamFleetRole": "arn:aws:iam::123456789012:role/my-spot-fleet-role",
+ "LaunchSpecifications": [
+ {
+ "IamInstanceProfile": {
+ "Arn": "arn:aws:iam::880185128111:instance-profile/my-iam-role"
+ },
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "m3.medium",
+ "KeyName": "my-key-pair",
+ "NetworkInterfaces": [
+ {
+ "AssociatePublicIpAddress": true,
+ "DeviceIndex": 0,
+ "Groups": [
+ "sg-1a2b3c4d"
+ ],
+ "SubnetId": "subnet-1a2b3c4d"
+ }
+ ]
+ }
+ ],
+ "SpotPrice": "0.04",
+ "TargetCapacity": 2
+ }
+ },
+ "output": {
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example assigns public addresses to instances launched in a nondefault VPC. Note that when you specify a network interface, you must include the subnet ID and security group ID using the network interface.",
+ "id": "ec2-request-spot-fleet-3",
+ "title": "To launch Spot instances in a subnet and assign them public IP addresses"
+ },
+ {
+ "input": {
+ "SpotFleetRequestConfig": {
+ "AllocationStrategy": "diversified",
+ "IamFleetRole": "arn:aws:iam::123456789012:role/my-spot-fleet-role",
+ "LaunchSpecifications": [
+ {
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "c4.2xlarge",
+ "SubnetId": "subnet-1a2b3c4d"
+ },
+ {
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "m3.2xlarge",
+ "SubnetId": "subnet-1a2b3c4d"
+ },
+ {
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "r3.2xlarge",
+ "SubnetId": "subnet-1a2b3c4d"
+ }
+ ],
+ "SpotPrice": "0.70",
+ "TargetCapacity": 30
+ }
+ },
+ "output": {
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a Spot fleet request that launches 30 instances using the diversified allocation strategy. The launch specifications differ by instance type. The Spot fleet distributes the instances across the launch specifications such that there are 10 instances of each type.",
+ "id": "ec2-request-spot-fleet-4",
+ "title": "To request a Spot fleet using the diversified allocation strategy"
+ }
+ ],
+ "RequestSpotInstances": [
+ {
+ "input": {
+ "InstanceCount": 5,
+ "LaunchSpecification": {
+ "IamInstanceProfile": {
+ "Arn": "arn:aws:iam::123456789012:instance-profile/my-iam-role"
+ },
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "m3.medium",
+ "KeyName": "my-key-pair",
+ "Placement": {
+ "AvailabilityZone": "us-west-2a"
+ },
+ "SecurityGroupIds": [
+ "sg-1a2b3c4d"
+ ]
+ },
+ "SpotPrice": "0.03",
+ "Type": "one-time"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a one-time Spot Instance request for five instances in the specified Availability Zone. If your account supports EC2-VPC only, Amazon EC2 launches the instances in the default subnet of the specified Availability Zone. If your account supports EC2-Classic, Amazon EC2 launches the instances in EC2-Classic in the specified Availability Zone.",
+ "id": "ec2-request-spot-instances-1",
+ "title": "To create a one-time Spot Instance request"
+ },
+ {
+ "input": {
+ "InstanceCount": 5,
+ "LaunchSpecification": {
+ "IamInstanceProfile": {
+ "Arn": "arn:aws:iam::123456789012:instance-profile/my-iam-role"
+ },
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "m3.medium",
+ "SecurityGroupIds": [
+ "sg-1a2b3c4d"
+ ],
+ "SubnetId": "subnet-1a2b3c4d"
+ },
+ "SpotPrice": "0.050",
+ "Type": "one-time"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example command creates a one-time Spot Instance request for five instances in the specified subnet. Amazon EC2 launches the instances in the specified subnet. If the VPC is a nondefault VPC, the instances do not receive a public IP address by default.",
+ "id": "ec2-request-spot-instances-2",
+ "title": "To create a one-time Spot Instance request"
+ }
+ ],
+ "ResetSnapshotAttribute": [
+ {
+ "input": {
+ "Attribute": "createVolumePermission",
+ "SnapshotId": "snap-1234567890abcdef0"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example resets the create volume permissions for snapshot ``snap-1234567890abcdef0``. If the command succeeds, no output is returned.",
+ "id": "to-reset-a-snapshot-attribute-1472508825735",
+ "title": "To reset a snapshot attribute"
+ }
+ ],
+ "RestoreAddressToClassic": [
+ {
+ "input": {
+ "PublicIp": "198.51.100.0"
+ },
+ "output": {
+ "PublicIp": "198.51.100.0",
+ "Status": "MoveInProgress"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example restores the specified Elastic IP address to the EC2-Classic platform.",
+ "id": "ec2-restore-address-to-classic-1",
+ "title": "To restore an address to EC2-Classic"
+ }
+ ],
+ "RunScheduledInstances": [
+ {
+ "input": {
+ "InstanceCount": 1,
+ "LaunchSpecification": {
+ "IamInstanceProfile": {
+ "Name": "my-iam-role"
+ },
+ "ImageId": "ami-12345678",
+ "InstanceType": "c4.large",
+ "KeyName": "my-key-pair",
+ "NetworkInterfaces": [
+ {
+ "AssociatePublicIpAddress": true,
+ "DeviceIndex": 0,
+ "Groups": [
+ "sg-12345678"
+ ],
+ "SubnetId": "subnet-12345678"
+ }
+ ]
+ },
+ "ScheduledInstanceId": "sci-1234-1234-1234-1234-123456789012"
+ },
+ "output": {
+ "InstanceIdSet": [
+ "i-1234567890abcdef0"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example launches the specified Scheduled Instance in a VPC.",
+ "id": "ec2-run-scheduled-instances-1",
+ "title": "To launch a Scheduled Instance in a VPC"
+ },
+ {
+ "input": {
+ "InstanceCount": 1,
+ "LaunchSpecification": {
+ "IamInstanceProfile": {
+ "Name": "my-iam-role"
+ },
+ "ImageId": "ami-12345678",
+ "InstanceType": "c4.large",
+ "KeyName": "my-key-pair",
+ "Placement": {
+ "AvailabilityZone": "us-west-2b"
+ },
+ "SecurityGroupIds": [
+ "sg-12345678"
+ ]
+ },
+ "ScheduledInstanceId": "sci-1234-1234-1234-1234-123456789012"
+ },
+ "output": {
+ "InstanceIdSet": [
+ "i-1234567890abcdef0"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example launches the specified Scheduled Instance in EC2-Classic.",
+ "id": "ec2-run-scheduled-instances-2",
+ "title": "To launch a Scheduled Instance in EC2-Classic"
+ }
+ ],
+ "UnassignPrivateIpAddresses": [
+ {
+ "input": {
+ "NetworkInterfaceId": "eni-e5aa89a3",
+ "PrivateIpAddresses": [
+ "10.0.0.82"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example unassigns the specified private IP address from the specified network interface.",
+ "id": "ec2-unassign-private-ip-addresses-1",
+ "title": "To unassign a secondary private IP address from a network interface"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-09-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-09-15/paginators-1.json
new file mode 100644
index 00000000..2bd01ad5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-09-15/paginators-1.json
@@ -0,0 +1,63 @@
+{
+ "pagination": {
+ "DescribeInstanceStatus": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "InstanceStatuses"
+ },
+ "DescribeInstances": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Reservations"
+ },
+ "DescribeReservedInstancesOfferings": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ReservedInstancesOfferings"
+ },
+ "DescribeReservedInstancesModifications": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "ReservedInstancesModifications"
+ },
+ "DescribeSnapshots": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Snapshots"
+ },
+ "DescribeSpotFleetRequests": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SpotFleetRequestConfigs"
+ },
+ "DescribeSpotPriceHistory": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SpotPriceHistory"
+ },
+ "DescribeTags": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Tags"
+ },
+ "DescribeVolumeStatus": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "VolumeStatuses"
+ },
+ "DescribeVolumes": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Volumes"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-09-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-09-15/service-2.json.gz
new file mode 100644
index 00000000..93d492e8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-09-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-09-15/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-09-15/waiters-2.json
new file mode 100644
index 00000000..71051948
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-09-15/waiters-2.json
@@ -0,0 +1,593 @@
+{
+ "version": 2,
+ "waiters": {
+ "InstanceExists": {
+ "delay": 5,
+ "maxAttempts": 40,
+ "operation": "DescribeInstances",
+ "acceptors": [
+ {
+ "matcher": "path",
+ "expected": true,
+ "argument": "length(Reservations[]) > `0`",
+ "state": "success"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidInstanceID.NotFound",
+ "state": "retry"
+ }
+ ]
+ },
+ "BundleTaskComplete": {
+ "delay": 15,
+ "operation": "DescribeBundleTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "complete",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "BundleTasks[].State"
+ },
+ {
+ "expected": "failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "BundleTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskCancelled": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "cancelled",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskCompleted": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ },
+ {
+ "expected": "cancelled",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ConversionTasks[].State"
+ },
+ {
+ "expected": "cancelling",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskDeleted": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "CustomerGatewayAvailable": {
+ "delay": 15,
+ "operation": "DescribeCustomerGateways",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "CustomerGateways[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CustomerGateways[].State"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CustomerGateways[].State"
+ }
+ ]
+ },
+ "ExportTaskCancelled": {
+ "delay": 15,
+ "operation": "DescribeExportTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "cancelled",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ExportTasks[].State"
+ }
+ ]
+ },
+ "ExportTaskCompleted": {
+ "delay": 15,
+ "operation": "DescribeExportTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ExportTasks[].State"
+ }
+ ]
+ },
+ "ImageExists": {
+ "operation": "DescribeImages",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "matcher": "path",
+ "expected": true,
+ "argument": "length(Images[]) > `0`",
+ "state": "success"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidAMIID.NotFound",
+ "state": "retry"
+ }
+ ]
+ },
+ "ImageAvailable": {
+ "operation": "DescribeImages",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "Images[].State",
+ "expected": "available"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "Images[].State",
+ "expected": "failed"
+ }
+ ]
+ },
+ "InstanceRunning": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "running",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "shutting-down",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "terminated",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "stopping",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidInstanceID.NotFound",
+ "state": "retry"
+ }
+ ]
+ },
+ "InstanceStatusOk": {
+ "operation": "DescribeInstanceStatus",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "InstanceStatuses[].InstanceStatus.Status",
+ "expected": "ok"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidInstanceID.NotFound",
+ "state": "retry"
+ }
+ ]
+ },
+ "InstanceStopped": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "stopped",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "terminated",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ }
+ ]
+ },
+ "InstanceTerminated": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "terminated",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "stopping",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ }
+ ]
+ },
+ "KeyPairExists": {
+ "operation": "DescribeKeyPairs",
+ "delay": 5,
+ "maxAttempts": 6,
+ "acceptors": [
+ {
+ "expected": true,
+ "matcher": "path",
+ "state": "success",
+ "argument": "length(KeyPairs[].KeyName) > `0`"
+ },
+ {
+ "expected": "InvalidKeyPair.NotFound",
+ "matcher": "error",
+ "state": "retry"
+ }
+ ]
+ },
+ "NatGatewayAvailable": {
+ "operation": "DescribeNatGateways",
+ "delay": 15,
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "NatGateways[].State",
+ "expected": "available"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "NatGateways[].State",
+ "expected": "failed"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "NatGateways[].State",
+ "expected": "deleting"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "NatGateways[].State",
+ "expected": "deleted"
+ },
+ {
+ "state": "retry",
+ "matcher": "error",
+ "expected": "NatGatewayNotFound"
+ }
+ ]
+ },
+ "NetworkInterfaceAvailable": {
+ "operation": "DescribeNetworkInterfaces",
+ "delay": 20,
+ "maxAttempts": 10,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "NetworkInterfaces[].Status"
+ },
+ {
+ "expected": "InvalidNetworkInterfaceID.NotFound",
+ "matcher": "error",
+ "state": "failure"
+ }
+ ]
+ },
+ "PasswordDataAvailable": {
+ "operation": "GetPasswordData",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "length(PasswordData) > `0`",
+ "expected": true
+ }
+ ]
+ },
+ "SnapshotCompleted": {
+ "delay": 15,
+ "operation": "DescribeSnapshots",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Snapshots[].State"
+ }
+ ]
+ },
+ "SpotInstanceRequestFulfilled": {
+ "operation": "DescribeSpotInstanceRequests",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "fulfilled"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "schedule-expired"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "canceled-before-fulfillment"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "bad-parameters"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "system-error"
+ }
+ ]
+ },
+ "SubnetAvailable": {
+ "delay": 15,
+ "operation": "DescribeSubnets",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Subnets[].State"
+ }
+ ]
+ },
+ "SystemStatusOk": {
+ "operation": "DescribeInstanceStatus",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "InstanceStatuses[].SystemStatus.Status",
+ "expected": "ok"
+ }
+ ]
+ },
+ "VolumeAvailable": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Volumes[].State"
+ }
+ ]
+ },
+ "VolumeDeleted": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidVolume.NotFound",
+ "state": "success"
+ }
+ ]
+ },
+ "VolumeInUse": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "in-use",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Volumes[].State"
+ }
+ ]
+ },
+ "VpcAvailable": {
+ "delay": 15,
+ "operation": "DescribeVpcs",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Vpcs[].State"
+ }
+ ]
+ },
+ "VpcExists": {
+ "operation": "DescribeVpcs",
+ "delay": 1,
+ "maxAttempts": 5,
+ "acceptors": [
+ {
+ "matcher": "status",
+ "expected": 200,
+ "state": "success"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidVpcID.NotFound",
+ "state": "retry"
+ }
+ ]
+ },
+ "VpnConnectionAvailable": {
+ "delay": 15,
+ "operation": "DescribeVpnConnections",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ }
+ ]
+ },
+ "VpnConnectionDeleted": {
+ "delay": 15,
+ "operation": "DescribeVpnConnections",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ }
+ ]
+ },
+ "VpcPeeringConnectionExists": {
+ "delay": 15,
+ "operation": "DescribeVpcPeeringConnections",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "matcher": "status",
+ "expected": 200,
+ "state": "success"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidVpcPeeringConnectionID.NotFound",
+ "state": "retry"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..80f15452
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/examples-1.json
new file mode 100644
index 00000000..93b4bf88
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/examples-1.json
@@ -0,0 +1,5048 @@
+{
+ "version": "1.0",
+ "examples": {
+ "AllocateAddress": [
+ {
+ "input": {
+ "Domain": "vpc"
+ },
+ "output": {
+ "AllocationId": "eipalloc-64d5890a",
+ "Domain": "vpc",
+ "PublicIp": "203.0.113.0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example allocates an Elastic IP address to use with an instance in a VPC.",
+ "id": "ec2-allocate-address-1",
+ "title": "To allocate an Elastic IP address for EC2-VPC"
+ },
+ {
+ "output": {
+ "Domain": "standard",
+ "PublicIp": "198.51.100.0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example allocates an Elastic IP address to use with an instance in EC2-Classic.",
+ "id": "ec2-allocate-address-2",
+ "title": "To allocate an Elastic IP address for EC2-Classic"
+ }
+ ],
+ "AssignPrivateIpAddresses": [
+ {
+ "input": {
+ "NetworkInterfaceId": "eni-e5aa89a3",
+ "PrivateIpAddresses": [
+ "10.0.0.82"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example assigns the specified secondary private IP address to the specified network interface.",
+ "id": "ec2-assign-private-ip-addresses-1",
+ "title": "To assign a specific secondary private IP address to an interface"
+ },
+ {
+ "input": {
+ "NetworkInterfaceId": "eni-e5aa89a3",
+ "SecondaryPrivateIpAddressCount": 2
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example assigns two secondary private IP addresses to the specified network interface. Amazon EC2 automatically assigns these IP addresses from the available IP addresses in the CIDR block range of the subnet the network interface is associated with.",
+ "id": "ec2-assign-private-ip-addresses-2",
+ "title": "To assign secondary private IP addresses that Amazon EC2 selects to an interface"
+ }
+ ],
+ "AssociateAddress": [
+ {
+ "input": {
+ "AllocationId": "eipalloc-64d5890a",
+ "InstanceId": "i-0b263919b6498b123"
+ },
+ "output": {
+ "AssociationId": "eipassoc-2bebb745"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the specified Elastic IP address with the specified instance in a VPC.",
+ "id": "ec2-associate-address-1",
+ "title": "To associate an Elastic IP address in EC2-VPC"
+ },
+ {
+ "input": {
+ "AllocationId": "eipalloc-64d5890a",
+ "NetworkInterfaceId": "eni-1a2b3c4d"
+ },
+ "output": {
+ "AssociationId": "eipassoc-2bebb745"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the specified Elastic IP address with the specified network interface.",
+ "id": "ec2-associate-address-2",
+ "title": "To associate an Elastic IP address with a network interface"
+ },
+ {
+ "input": {
+ "InstanceId": "i-07ffe74c7330ebf53",
+ "PublicIp": "198.51.100.0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates an Elastic IP address with an instance in EC2-Classic.",
+ "id": "ec2-associate-address-3",
+ "title": "To associate an Elastic IP address in EC2-Classic"
+ }
+ ],
+ "AssociateDhcpOptions": [
+ {
+ "input": {
+ "DhcpOptionsId": "dopt-d9070ebb",
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the specified DHCP options set with the specified VPC.",
+ "id": "ec2-associate-dhcp-options-1",
+ "title": "To associate a DHCP options set with a VPC"
+ },
+ {
+ "input": {
+ "DhcpOptionsId": "default",
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the default DHCP options set with the specified VPC.",
+ "id": "ec2-associate-dhcp-options-2",
+ "title": "To associate the default DHCP options set with a VPC"
+ }
+ ],
+ "AssociateIamInstanceProfile": [
+ {
+ "input": {
+ "IamInstanceProfile": {
+ "Name": "admin-role"
+ },
+ "InstanceId": "i-123456789abcde123"
+ },
+ "output": {
+ "IamInstanceProfileAssociation": {
+ "AssociationId": "iip-assoc-0e7736511a163c209",
+ "IamInstanceProfile": {
+ "Arn": "arn:aws:iam::123456789012:instance-profile/admin-role",
+ "Id": "AIPAJBLK7RKJKWDXVHIEC"
+ },
+ "InstanceId": "i-123456789abcde123",
+ "State": "associating"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates an IAM instance profile named admin-role with the specified instance.",
+ "id": "to-associate-an-iam-instance-profile-with-an-instance-1528928429850",
+ "title": "To associate an IAM instance profile with an instance"
+ }
+ ],
+ "AssociateRouteTable": [
+ {
+ "input": {
+ "RouteTableId": "rtb-22574640",
+ "SubnetId": "subnet-9d4a7b6"
+ },
+ "output": {
+ "AssociationId": "rtbassoc-781d0d1a"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the specified route table with the specified subnet.",
+ "id": "ec2-associate-route-table-1",
+ "title": "To associate a route table with a subnet"
+ }
+ ],
+ "AttachInternetGateway": [
+ {
+ "input": {
+ "InternetGatewayId": "igw-c0a643a9",
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example attaches the specified Internet gateway to the specified VPC.",
+ "id": "ec2-attach-internet-gateway-1",
+ "title": "To attach an Internet gateway to a VPC"
+ }
+ ],
+ "AttachNetworkInterface": [
+ {
+ "input": {
+ "DeviceIndex": 1,
+ "InstanceId": "i-1234567890abcdef0",
+ "NetworkInterfaceId": "eni-e5aa89a3"
+ },
+ "output": {
+ "AttachmentId": "eni-attach-66c4350a"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example attaches the specified network interface to the specified instance.",
+ "id": "ec2-attach-network-interface-1",
+ "title": "To attach a network interface to an instance"
+ }
+ ],
+ "AttachVolume": [
+ {
+ "input": {
+ "Device": "/dev/sdf",
+ "InstanceId": "i-01474ef662b89480",
+ "VolumeId": "vol-1234567890abcdef0"
+ },
+ "output": {
+ "AttachTime": "2016-08-29T18:52:32.724Z",
+ "Device": "/dev/sdf",
+ "InstanceId": "i-01474ef662b89480",
+ "State": "attaching",
+ "VolumeId": "vol-1234567890abcdef0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example attaches a volume (``vol-1234567890abcdef0``) to an instance (``i-01474ef662b89480``) as ``/dev/sdf``.",
+ "id": "to-attach-a-volume-to-an-instance-1472499213109",
+ "title": "To attach a volume to an instance"
+ }
+ ],
+ "AuthorizeSecurityGroupEgress": [
+ {
+ "input": {
+ "GroupId": "sg-1a2b3c4d",
+ "IpPermissions": [
+ {
+ "FromPort": 80,
+ "IpProtocol": "tcp",
+ "IpRanges": [
+ {
+ "CidrIp": "10.0.0.0/16"
+ }
+ ],
+ "ToPort": 80
+ }
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example adds a rule that grants access to the specified address ranges on TCP port 80.",
+ "id": "to-add-a-rule-that-allows-outbound-traffic-to-a-specific-address-range-1528929309636",
+ "title": "To add a rule that allows outbound traffic to a specific address range"
+ },
+ {
+ "input": {
+ "GroupId": "sg-1a2b3c4d",
+ "IpPermissions": [
+ {
+ "FromPort": 80,
+ "IpProtocol": "tcp",
+ "ToPort": 80,
+ "UserIdGroupPairs": [
+ {
+ "GroupId": "sg-4b51a32f"
+ }
+ ]
+ }
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example adds a rule that grants access to the specified security group on TCP port 80.",
+ "id": "to-add-a-rule-that-allows-outbound-traffic-to-a-specific-security-group-1528929760260",
+ "title": "To add a rule that allows outbound traffic to a specific security group"
+ }
+ ],
+ "AuthorizeSecurityGroupIngress": [
+ {
+ "input": {
+ "GroupId": "sg-903004f8",
+ "IpPermissions": [
+ {
+ "FromPort": 22,
+ "IpProtocol": "tcp",
+ "IpRanges": [
+ {
+ "CidrIp": "203.0.113.0/24",
+ "Description": "SSH access from the LA office"
+ }
+ ],
+ "ToPort": 22
+ }
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example enables inbound traffic on TCP port 22 (SSH). The rule includes a description to help you identify it later.",
+ "id": "to-add-a-rule-that-allows-inbound-ssh-traffic-1529011610328",
+ "title": "To add a rule that allows inbound SSH traffic from an IPv4 address range"
+ },
+ {
+ "input": {
+ "GroupId": "sg-111aaa22",
+ "IpPermissions": [
+ {
+ "FromPort": 80,
+ "IpProtocol": "tcp",
+ "ToPort": 80,
+ "UserIdGroupPairs": [
+ {
+ "Description": "HTTP access from other instances",
+ "GroupId": "sg-1a2b3c4d"
+ }
+ ]
+ }
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example enables inbound traffic on TCP port 80 from the specified security group. The group must be in the same VPC or a peer VPC. Incoming traffic is allowed based on the private IP addresses of instances that are associated with the specified security group.",
+ "id": "to-add-a-rule-that-allows-inbound-http-traffic-from-another-security-group-1529012163168",
+ "title": "To add a rule that allows inbound HTTP traffic from another security group"
+ },
+ {
+ "input": {
+ "GroupId": "sg-123abc12 ",
+ "IpPermissions": [
+ {
+ "FromPort": 3389,
+ "IpProtocol": "tcp",
+ "Ipv6Ranges": [
+ {
+ "CidrIpv6": "2001:db8:1234:1a00::/64",
+ "Description": "RDP access from the NY office"
+ }
+ ],
+ "ToPort": 3389
+ }
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example adds an inbound rule that allows RDP traffic from the specified IPv6 address range. The rule includes a description to help you identify it later.",
+ "id": "to-add-a-rule-with-a-description-1529012418116",
+ "title": "To add a rule that allows inbound RDP traffic from an IPv6 address range"
+ }
+ ],
+ "CancelSpotFleetRequests": [
+ {
+ "input": {
+ "SpotFleetRequestIds": [
+ "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ ],
+ "TerminateInstances": true
+ },
+ "output": {
+ "SuccessfulFleetRequests": [
+ {
+ "CurrentSpotFleetRequestState": "cancelled_running",
+ "PreviousSpotFleetRequestState": "active",
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example cancels the specified Spot fleet request and terminates its associated Spot Instances.",
+ "id": "ec2-cancel-spot-fleet-requests-1",
+ "title": "To cancel a Spot fleet request"
+ },
+ {
+ "input": {
+ "SpotFleetRequestIds": [
+ "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ ],
+ "TerminateInstances": false
+ },
+ "output": {
+ "SuccessfulFleetRequests": [
+ {
+ "CurrentSpotFleetRequestState": "cancelled_terminating",
+ "PreviousSpotFleetRequestState": "active",
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example cancels the specified Spot fleet request without terminating its associated Spot Instances.",
+ "id": "ec2-cancel-spot-fleet-requests-2",
+ "title": "To cancel a Spot fleet request without terminating its Spot Instances"
+ }
+ ],
+ "CancelSpotInstanceRequests": [
+ {
+ "input": {
+ "SpotInstanceRequestIds": [
+ "sir-08b93456"
+ ]
+ },
+ "output": {
+ "CancelledSpotInstanceRequests": [
+ {
+ "SpotInstanceRequestId": "sir-08b93456",
+ "State": "cancelled"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example cancels a Spot Instance request.",
+ "id": "ec2-cancel-spot-instance-requests-1",
+ "title": "To cancel Spot Instance requests"
+ }
+ ],
+ "ConfirmProductInstance": [
+ {
+ "input": {
+ "InstanceId": "i-1234567890abcdef0",
+ "ProductCode": "774F4FF8"
+ },
+ "output": {
+ "OwnerId": "123456789012"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example determines whether the specified product code is associated with the specified instance.",
+ "id": "to-confirm-the-product-instance-1472712108494",
+ "title": "To confirm the product instance"
+ }
+ ],
+ "CopyImage": [
+ {
+ "input": {
+ "Description": "",
+ "Name": "My server",
+ "SourceImageId": "ami-5731123e",
+ "SourceRegion": "us-east-1"
+ },
+ "output": {
+ "ImageId": "ami-438bea42"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example copies the specified AMI from the us-east-1 region to the current region.",
+ "id": "to-copy-an-ami-to-another-region-1529022820832",
+ "title": "To copy an AMI to another region"
+ }
+ ],
+ "CopySnapshot": [
+ {
+ "input": {
+ "Description": "This is my copied snapshot.",
+ "DestinationRegion": "us-east-1",
+ "SourceRegion": "us-west-2",
+ "SourceSnapshotId": "snap-066877671789bd71b"
+ },
+ "output": {
+ "SnapshotId": "snap-066877671789bd71b"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example copies a snapshot with the snapshot ID of ``snap-066877671789bd71b`` from the ``us-west-2`` region to the ``us-east-1`` region and adds a short description to identify the snapshot.",
+ "id": "to-copy-a-snapshot-1472502259774",
+ "title": "To copy a snapshot"
+ }
+ ],
+ "CreateCustomerGateway": [
+ {
+ "input": {
+ "BgpAsn": 65534,
+ "PublicIp": "12.1.2.3",
+ "Type": "ipsec.1"
+ },
+ "output": {
+ "CustomerGateway": {
+ "BgpAsn": "65534",
+ "CustomerGatewayId": "cgw-0e11f167",
+ "IpAddress": "12.1.2.3",
+ "State": "available",
+ "Type": "ipsec.1"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a customer gateway with the specified IP address for its outside interface.",
+ "id": "ec2-create-customer-gateway-1",
+ "title": "To create a customer gateway"
+ }
+ ],
+ "CreateDhcpOptions": [
+ {
+ "input": {
+ "DhcpConfigurations": [
+ {
+ "Key": "domain-name-servers",
+ "Values": [
+ "10.2.5.1",
+ "10.2.5.2"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "DhcpOptions": {
+ "DhcpConfigurations": [
+ {
+ "Key": "domain-name-servers",
+ "Values": [
+ {
+ "Value": "10.2.5.2"
+ },
+ {
+ "Value": "10.2.5.1"
+ }
+ ]
+ }
+ ],
+ "DhcpOptionsId": "dopt-d9070ebb"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a DHCP options set.",
+ "id": "ec2-create-dhcp-options-1",
+ "title": "To create a DHCP options set"
+ }
+ ],
+ "CreateImage": [
+ {
+ "input": {
+ "BlockDeviceMappings": [
+ {
+ "DeviceName": "/dev/sdh",
+ "Ebs": {
+ "VolumeSize": "100"
+ }
+ },
+ {
+ "DeviceName": "/dev/sdc",
+ "VirtualName": "ephemeral1"
+ }
+ ],
+ "Description": "An AMI for my server",
+ "InstanceId": "i-1234567890abcdef0",
+ "Name": "My server",
+ "NoReboot": true
+ },
+ "output": {
+ "ImageId": "ami-1a2b3c4d"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an AMI from the specified instance and adds an EBS volume with the device name /dev/sdh and an instance store volume with the device name /dev/sdc.",
+ "id": "to-create-an-ami-from-an-amazon-ebs-backed-instance-1529023150636",
+ "title": "To create an AMI from an Amazon EBS-backed instance"
+ }
+ ],
+ "CreateInternetGateway": [
+ {
+ "output": {
+ "InternetGateway": {
+ "Attachments": [
+
+ ],
+ "InternetGatewayId": "igw-c0a643a9",
+ "Tags": [
+
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an Internet gateway.",
+ "id": "ec2-create-internet-gateway-1",
+ "title": "To create an Internet gateway"
+ }
+ ],
+ "CreateKeyPair": [
+ {
+ "input": {
+ "KeyName": "my-key-pair"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a key pair named my-key-pair.",
+ "id": "ec2-create-key-pair-1",
+ "title": "To create a key pair"
+ }
+ ],
+ "CreateLaunchTemplate": [
+ {
+ "input": {
+ "LaunchTemplateData": {
+ "ImageId": "ami-8c1be5f6",
+ "InstanceType": "t2.small",
+ "NetworkInterfaces": [
+ {
+ "AssociatePublicIpAddress": true,
+ "DeviceIndex": 0,
+ "Ipv6AddressCount": 1,
+ "SubnetId": "subnet-7b16de0c"
+ }
+ ],
+ "TagSpecifications": [
+ {
+ "ResourceType": "instance",
+ "Tags": [
+ {
+ "Key": "Name",
+ "Value": "webserver"
+ }
+ ]
+ }
+ ]
+ },
+ "LaunchTemplateName": "my-template",
+ "VersionDescription": "WebVersion1"
+ },
+ "output": {
+ "LaunchTemplate": {
+ "CreateTime": "2017-11-27T09:13:24.000Z",
+ "CreatedBy": "arn:aws:iam::123456789012:root",
+ "DefaultVersionNumber": 1,
+ "LatestVersionNumber": 1,
+ "LaunchTemplateId": "lt-01238c059e3466abc",
+ "LaunchTemplateName": "my-template"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a launch template that specifies the subnet in which to launch the instance, assigns a public IP address and an IPv6 address to the instance, and creates a tag for the instance.",
+ "id": "to-create-a-launch-template-1529023655488",
+ "title": "To create a launch template"
+ }
+ ],
+ "CreateLaunchTemplateVersion": [
+ {
+ "input": {
+ "LaunchTemplateData": {
+ "ImageId": "ami-c998b6b2"
+ },
+ "LaunchTemplateId": "lt-0abcd290751193123",
+ "SourceVersion": "1",
+ "VersionDescription": "WebVersion2"
+ },
+ "output": {
+ "LaunchTemplateVersion": {
+ "CreateTime": "2017-12-01T13:35:46.000Z",
+ "CreatedBy": "arn:aws:iam::123456789012:root",
+ "DefaultVersion": false,
+ "LaunchTemplateData": {
+ "ImageId": "ami-c998b6b2",
+ "InstanceType": "t2.micro",
+ "NetworkInterfaces": [
+ {
+ "AssociatePublicIpAddress": true,
+ "DeviceIndex": 0,
+ "Ipv6Addresses": [
+ {
+ "Ipv6Address": "2001:db8:1234:1a00::123"
+ }
+ ],
+ "SubnetId": "subnet-7b16de0c"
+ }
+ ]
+ },
+ "LaunchTemplateId": "lt-0abcd290751193123",
+ "LaunchTemplateName": "my-template",
+ "VersionDescription": "WebVersion2",
+ "VersionNumber": 2
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a new launch template version based on version 1 of the specified launch template and specifies a different AMI ID.",
+ "id": "to-create-a-launch-template-version-1529024195702",
+ "title": "To create a launch template version"
+ }
+ ],
+ "CreateNatGateway": [
+ {
+ "input": {
+ "AllocationId": "eipalloc-37fc1a52",
+ "SubnetId": "subnet-1a2b3c4d"
+ },
+ "output": {
+ "NatGateway": {
+ "CreateTime": "2015-12-17T12:45:26.732Z",
+ "NatGatewayAddresses": [
+ {
+ "AllocationId": "eipalloc-37fc1a52"
+ }
+ ],
+ "NatGatewayId": "nat-08d48af2a8e83edfd",
+ "State": "pending",
+ "SubnetId": "subnet-1a2b3c4d",
+ "VpcId": "vpc-1122aabb"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a NAT gateway in subnet subnet-1a2b3c4d and associates an Elastic IP address with the allocation ID eipalloc-37fc1a52 with the NAT gateway.",
+ "id": "ec2-create-nat-gateway-1",
+ "title": "To create a NAT gateway"
+ }
+ ],
+ "CreateNetworkAcl": [
+ {
+ "input": {
+ "VpcId": "vpc-a01106c2"
+ },
+ "output": {
+ "NetworkAcl": {
+ "Associations": [
+
+ ],
+ "Entries": [
+ {
+ "CidrBlock": "0.0.0.0/0",
+ "Egress": true,
+ "Protocol": "-1",
+ "RuleAction": "deny",
+ "RuleNumber": 32767
+ },
+ {
+ "CidrBlock": "0.0.0.0/0",
+ "Egress": false,
+ "Protocol": "-1",
+ "RuleAction": "deny",
+ "RuleNumber": 32767
+ }
+ ],
+ "IsDefault": false,
+ "NetworkAclId": "acl-5fb85d36",
+ "Tags": [
+
+ ],
+ "VpcId": "vpc-a01106c2"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a network ACL for the specified VPC.",
+ "id": "ec2-create-network-acl-1",
+ "title": "To create a network ACL"
+ }
+ ],
+ "CreateNetworkAclEntry": [
+ {
+ "input": {
+ "CidrBlock": "0.0.0.0/0",
+ "Egress": false,
+ "NetworkAclId": "acl-5fb85d36",
+ "PortRange": {
+ "From": 53,
+ "To": 53
+ },
+ "Protocol": "17",
+ "RuleAction": "allow",
+ "RuleNumber": 100
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an entry for the specified network ACL. The rule allows ingress traffic from anywhere (0.0.0.0/0) on UDP port 53 (DNS) into any associated subnet.",
+ "id": "ec2-create-network-acl-entry-1",
+ "title": "To create a network ACL entry"
+ }
+ ],
+ "CreateNetworkInterface": [
+ {
+ "input": {
+ "Description": "my network interface",
+ "Groups": [
+ "sg-903004f8"
+ ],
+ "PrivateIpAddress": "10.0.2.17",
+ "SubnetId": "subnet-9d4a7b6c"
+ },
+ "output": {
+ "NetworkInterface": {
+ "AvailabilityZone": "us-east-1d",
+ "Description": "my network interface",
+ "Groups": [
+ {
+ "GroupId": "sg-903004f8",
+ "GroupName": "default"
+ }
+ ],
+ "MacAddress": "02:1a:80:41:52:9c",
+ "NetworkInterfaceId": "eni-e5aa89a3",
+ "OwnerId": "123456789012",
+ "PrivateIpAddress": "10.0.2.17",
+ "PrivateIpAddresses": [
+ {
+ "Primary": true,
+ "PrivateIpAddress": "10.0.2.17"
+ }
+ ],
+ "RequesterManaged": false,
+ "SourceDestCheck": true,
+ "Status": "pending",
+ "SubnetId": "subnet-9d4a7b6c",
+ "TagSet": [
+
+ ],
+ "VpcId": "vpc-a01106c2"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a network interface for the specified subnet.",
+ "id": "ec2-create-network-interface-1",
+ "title": "To create a network interface"
+ }
+ ],
+ "CreatePlacementGroup": [
+ {
+ "input": {
+ "GroupName": "my-cluster",
+ "Strategy": "cluster"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a placement group with the specified name.",
+ "id": "to-create-a-placement-group-1472712245768",
+ "title": "To create a placement group"
+ }
+ ],
+ "CreateRoute": [
+ {
+ "input": {
+ "DestinationCidrBlock": "0.0.0.0/0",
+ "GatewayId": "igw-c0a643a9",
+ "RouteTableId": "rtb-22574640"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a route for the specified route table. The route matches all traffic (0.0.0.0/0) and routes it to the specified Internet gateway.",
+ "id": "ec2-create-route-1",
+ "title": "To create a route"
+ }
+ ],
+ "CreateRouteTable": [
+ {
+ "input": {
+ "VpcId": "vpc-a01106c2"
+ },
+ "output": {
+ "RouteTable": {
+ "Associations": [
+
+ ],
+ "PropagatingVgws": [
+
+ ],
+ "RouteTableId": "rtb-22574640",
+ "Routes": [
+ {
+ "DestinationCidrBlock": "10.0.0.0/16",
+ "GatewayId": "local",
+ "State": "active"
+ }
+ ],
+ "Tags": [
+
+ ],
+ "VpcId": "vpc-a01106c2"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a route table for the specified VPC.",
+ "id": "ec2-create-route-table-1",
+ "title": "To create a route table"
+ }
+ ],
+ "CreateSecurityGroup": [
+ {
+ "input": {
+ "Description": "My security group",
+ "GroupName": "my-security-group",
+ "VpcId": "vpc-1a2b3c4d"
+ },
+ "output": {
+ "GroupId": "sg-903004f8"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a security group for the specified VPC.",
+ "id": "to-create-a-security-group-for-a-vpc-1529024532716",
+ "title": "To create a security group for a VPC"
+ }
+ ],
+ "CreateSnapshot": [
+ {
+ "input": {
+ "Description": "This is my root volume snapshot.",
+ "VolumeId": "vol-1234567890abcdef0"
+ },
+ "output": {
+ "Description": "This is my root volume snapshot.",
+ "OwnerId": "012345678910",
+ "SnapshotId": "snap-066877671789bd71b",
+ "StartTime": "2014-02-28T21:06:01.000Z",
+ "State": "pending",
+ "Tags": [
+
+ ],
+ "VolumeId": "vol-1234567890abcdef0",
+ "VolumeSize": 8
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a snapshot of the volume with a volume ID of ``vol-1234567890abcdef0`` and a short description to identify the snapshot.",
+ "id": "to-create-a-snapshot-1472502529790",
+ "title": "To create a snapshot"
+ }
+ ],
+ "CreateSpotDatafeedSubscription": [
+ {
+ "input": {
+ "Bucket": "my-s3-bucket",
+ "Prefix": "spotdata"
+ },
+ "output": {
+ "SpotDatafeedSubscription": {
+ "Bucket": "my-s3-bucket",
+ "OwnerId": "123456789012",
+ "Prefix": "spotdata",
+ "State": "Active"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a Spot Instance data feed for your AWS account.",
+ "id": "ec2-create-spot-datafeed-subscription-1",
+ "title": "To create a Spot Instance datafeed"
+ }
+ ],
+ "CreateSubnet": [
+ {
+ "input": {
+ "CidrBlock": "10.0.1.0/24",
+ "VpcId": "vpc-a01106c2"
+ },
+ "output": {
+ "Subnet": {
+ "AvailabilityZone": "us-west-2c",
+ "AvailableIpAddressCount": 251,
+ "CidrBlock": "10.0.1.0/24",
+ "State": "pending",
+ "SubnetId": "subnet-9d4a7b6c",
+ "VpcId": "vpc-a01106c2"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a subnet in the specified VPC with the specified CIDR block. We recommend that you let us select an Availability Zone for you.",
+ "id": "ec2-create-subnet-1",
+ "title": "To create a subnet"
+ }
+ ],
+ "CreateTags": [
+ {
+ "input": {
+ "Resources": [
+ "ami-78a54011"
+ ],
+ "Tags": [
+ {
+ "Key": "Stack",
+ "Value": "production"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example adds the tag Stack=production to the specified image, or overwrites an existing tag for the AMI where the tag key is Stack.",
+ "id": "ec2-create-tags-1",
+ "title": "To add a tag to a resource"
+ }
+ ],
+ "CreateVolume": [
+ {
+ "input": {
+ "AvailabilityZone": "us-east-1a",
+ "Size": 80,
+ "VolumeType": "gp2"
+ },
+ "output": {
+ "AvailabilityZone": "us-east-1a",
+ "CreateTime": "2016-08-29T18:52:32.724Z",
+ "Encrypted": false,
+ "Iops": 240,
+ "Size": 80,
+ "SnapshotId": "",
+ "State": "creating",
+ "VolumeId": "vol-6b60b7c7",
+ "VolumeType": "gp2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an 80 GiB General Purpose (SSD) volume in the Availability Zone ``us-east-1a``.",
+ "id": "to-create-a-new-volume-1472496724296",
+ "title": "To create a new volume"
+ },
+ {
+ "input": {
+ "AvailabilityZone": "us-east-1a",
+ "Iops": 1000,
+ "SnapshotId": "snap-066877671789bd71b",
+ "VolumeType": "io1"
+ },
+ "output": {
+ "Attachments": [
+
+ ],
+ "AvailabilityZone": "us-east-1a",
+ "CreateTime": "2016-08-29T18:52:32.724Z",
+ "Iops": 1000,
+ "Size": 500,
+ "SnapshotId": "snap-066877671789bd71b",
+ "State": "creating",
+ "Tags": [
+
+ ],
+ "VolumeId": "vol-1234567890abcdef0",
+ "VolumeType": "io1"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a new Provisioned IOPS (SSD) volume with 1000 provisioned IOPS from a snapshot in the Availability Zone ``us-east-1a``.",
+ "id": "to-create-a-new-provisioned-iops-ssd-volume-from-a-snapshot-1472498975176",
+ "title": "To create a new Provisioned IOPS (SSD) volume from a snapshot"
+ }
+ ],
+ "CreateVpc": [
+ {
+ "input": {
+ "CidrBlock": "10.0.0.0/16"
+ },
+ "output": {
+ "Vpc": {
+ "CidrBlock": "10.0.0.0/16",
+ "DhcpOptionsId": "dopt-7a8b9c2d",
+ "InstanceTenancy": "default",
+ "State": "pending",
+ "VpcId": "vpc-a01106c2"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a VPC with the specified CIDR block.",
+ "id": "ec2-create-vpc-1",
+ "title": "To create a VPC"
+ }
+ ],
+ "DeleteCustomerGateway": [
+ {
+ "input": {
+ "CustomerGatewayId": "cgw-0e11f167"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified customer gateway.",
+ "id": "ec2-delete-customer-gateway-1",
+ "title": "To delete a customer gateway"
+ }
+ ],
+ "DeleteDhcpOptions": [
+ {
+ "input": {
+ "DhcpOptionsId": "dopt-d9070ebb"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified DHCP options set.",
+ "id": "ec2-delete-dhcp-options-1",
+ "title": "To delete a DHCP options set"
+ }
+ ],
+ "DeleteInternetGateway": [
+ {
+ "input": {
+ "InternetGatewayId": "igw-c0a643a9"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified Internet gateway.",
+ "id": "ec2-delete-internet-gateway-1",
+ "title": "To delete an Internet gateway"
+ }
+ ],
+ "DeleteKeyPair": [
+ {
+ "input": {
+ "KeyName": "my-key-pair"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified key pair.",
+ "id": "ec2-delete-key-pair-1",
+ "title": "To delete a key pair"
+ }
+ ],
+ "DeleteLaunchTemplate": [
+ {
+ "input": {
+ "LaunchTemplateId": "lt-0abcd290751193123"
+ },
+ "output": {
+ "LaunchTemplate": {
+ "CreateTime": "2017-11-23T16:46:25.000Z",
+ "CreatedBy": "arn:aws:iam::123456789012:root",
+ "DefaultVersionNumber": 2,
+ "LatestVersionNumber": 2,
+ "LaunchTemplateId": "lt-0abcd290751193123",
+ "LaunchTemplateName": "my-template"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified launch template.",
+ "id": "to-delete-a-launch-template-1529024658216",
+ "title": "To delete a launch template"
+ }
+ ],
+ "DeleteLaunchTemplateVersions": [
+ {
+ "input": {
+ "LaunchTemplateId": "lt-0abcd290751193123",
+ "Versions": [
+ "1"
+ ]
+ },
+ "output": {
+ "SuccessfullyDeletedLaunchTemplateVersions": [
+ {
+ "LaunchTemplateId": "lt-0abcd290751193123",
+ "LaunchTemplateName": "my-template",
+ "VersionNumber": 1
+ }
+ ],
+ "UnsuccessfullyDeletedLaunchTemplateVersions": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified launch template version.",
+ "id": "to-delete-a-launch-template-version-1529024790864",
+ "title": "To delete a launch template version"
+ }
+ ],
+ "DeleteNatGateway": [
+ {
+ "input": {
+ "NatGatewayId": "nat-04ae55e711cec5680"
+ },
+ "output": {
+ "NatGatewayId": "nat-04ae55e711cec5680"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified NAT gateway.",
+ "id": "ec2-delete-nat-gateway-1",
+ "title": "To delete a NAT gateway"
+ }
+ ],
+ "DeleteNetworkAcl": [
+ {
+ "input": {
+ "NetworkAclId": "acl-5fb85d36"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified network ACL.",
+ "id": "ec2-delete-network-acl-1",
+ "title": "To delete a network ACL"
+ }
+ ],
+ "DeleteNetworkAclEntry": [
+ {
+ "input": {
+ "Egress": true,
+ "NetworkAclId": "acl-5fb85d36",
+ "RuleNumber": 100
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes ingress rule number 100 from the specified network ACL.",
+ "id": "ec2-delete-network-acl-entry-1",
+ "title": "To delete a network ACL entry"
+ }
+ ],
+ "DeleteNetworkInterface": [
+ {
+ "input": {
+ "NetworkInterfaceId": "eni-e5aa89a3"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified network interface.",
+ "id": "ec2-delete-network-interface-1",
+ "title": "To delete a network interface"
+ }
+ ],
+ "DeletePlacementGroup": [
+ {
+ "input": {
+ "GroupName": "my-cluster"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified placement group.\n",
+ "id": "to-delete-a-placement-group-1472712349959",
+ "title": "To delete a placement group"
+ }
+ ],
+ "DeleteRoute": [
+ {
+ "input": {
+ "DestinationCidrBlock": "0.0.0.0/0",
+ "RouteTableId": "rtb-22574640"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified route from the specified route table.",
+ "id": "ec2-delete-route-1",
+ "title": "To delete a route"
+ }
+ ],
+ "DeleteRouteTable": [
+ {
+ "input": {
+ "RouteTableId": "rtb-22574640"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified route table.",
+ "id": "ec2-delete-route-table-1",
+ "title": "To delete a route table"
+ }
+ ],
+ "DeleteSecurityGroup": [
+ {
+ "input": {
+ "GroupId": "sg-903004f8"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified security group.",
+ "id": "to-delete-a-security-group-1529024952972",
+ "title": "To delete a security group"
+ }
+ ],
+ "DeleteSnapshot": [
+ {
+ "input": {
+ "SnapshotId": "snap-1234567890abcdef0"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes a snapshot with the snapshot ID of ``snap-1234567890abcdef0``. If the command succeeds, no output is returned.",
+ "id": "to-delete-a-snapshot-1472503042567",
+ "title": "To delete a snapshot"
+ }
+ ],
+ "DeleteSpotDatafeedSubscription": [
+ {
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes a Spot data feed subscription for the account.",
+ "id": "ec2-delete-spot-datafeed-subscription-1",
+ "title": "To cancel a Spot Instance data feed subscription"
+ }
+ ],
+ "DeleteSubnet": [
+ {
+ "input": {
+ "SubnetId": "subnet-9d4a7b6c"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified subnet.",
+ "id": "ec2-delete-subnet-1",
+ "title": "To delete a subnet"
+ }
+ ],
+ "DeleteTags": [
+ {
+ "input": {
+ "Resources": [
+ "ami-78a54011"
+ ],
+ "Tags": [
+ {
+ "Key": "Stack",
+ "Value": "test"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the tag Stack=test from the specified image.",
+ "id": "ec2-delete-tags-1",
+ "title": "To delete a tag from a resource"
+ }
+ ],
+ "DeleteVolume": [
+ {
+ "input": {
+ "VolumeId": "vol-049df61146c4d7901"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes an available volume with the volume ID of ``vol-049df61146c4d7901``. If the command succeeds, no output is returned.",
+ "id": "to-delete-a-volume-1472503111160",
+ "title": "To delete a volume"
+ }
+ ],
+ "DeleteVpc": [
+ {
+ "input": {
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified VPC.",
+ "id": "ec2-delete-vpc-1",
+ "title": "To delete a VPC"
+ }
+ ],
+ "DescribeAccountAttributes": [
+ {
+ "input": {
+ "AttributeNames": [
+ "supported-platforms"
+ ]
+ },
+ "output": {
+ "AccountAttributes": [
+ {
+ "AttributeName": "supported-platforms",
+ "AttributeValues": [
+ {
+ "AttributeValue": "EC2"
+ },
+ {
+ "AttributeValue": "VPC"
+ }
+ ]
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the supported-platforms attribute for your AWS account.",
+ "id": "ec2-describe-account-attributes-1",
+ "title": "To describe a single attribute for your AWS account"
+ },
+ {
+ "output": {
+ "AccountAttributes": [
+ {
+ "AttributeName": "supported-platforms",
+ "AttributeValues": [
+ {
+ "AttributeValue": "EC2"
+ },
+ {
+ "AttributeValue": "VPC"
+ }
+ ]
+ },
+ {
+ "AttributeName": "vpc-max-security-groups-per-interface",
+ "AttributeValues": [
+ {
+ "AttributeValue": "5"
+ }
+ ]
+ },
+ {
+ "AttributeName": "max-elastic-ips",
+ "AttributeValues": [
+ {
+ "AttributeValue": "5"
+ }
+ ]
+ },
+ {
+ "AttributeName": "max-instances",
+ "AttributeValues": [
+ {
+ "AttributeValue": "20"
+ }
+ ]
+ },
+ {
+ "AttributeName": "vpc-max-elastic-ips",
+ "AttributeValues": [
+ {
+ "AttributeValue": "5"
+ }
+ ]
+ },
+ {
+ "AttributeName": "default-vpc",
+ "AttributeValues": [
+ {
+ "AttributeValue": "none"
+ }
+ ]
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the attributes for your AWS account.",
+ "id": "ec2-describe-account-attributes-2",
+ "title": "To describe all attributes for your AWS account"
+ }
+ ],
+ "DescribeAddresses": [
+ {
+ "output": {
+ "Addresses": [
+ {
+ "Domain": "standard",
+ "InstanceId": "i-1234567890abcdef0",
+ "PublicIp": "198.51.100.0"
+ },
+ {
+ "AllocationId": "eipalloc-12345678",
+ "AssociationId": "eipassoc-12345678",
+ "Domain": "vpc",
+ "InstanceId": "i-1234567890abcdef0",
+ "NetworkInterfaceId": "eni-12345678",
+ "NetworkInterfaceOwnerId": "123456789012",
+ "PrivateIpAddress": "10.0.1.241",
+ "PublicIp": "203.0.113.0"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes your Elastic IP addresses.",
+ "id": "ec2-describe-addresses-1",
+ "title": "To describe your Elastic IP addresses"
+ },
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "domain",
+ "Values": [
+ "vpc"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "Addresses": [
+ {
+ "AllocationId": "eipalloc-12345678",
+ "AssociationId": "eipassoc-12345678",
+ "Domain": "vpc",
+ "InstanceId": "i-1234567890abcdef0",
+ "NetworkInterfaceId": "eni-12345678",
+ "NetworkInterfaceOwnerId": "123456789012",
+ "PrivateIpAddress": "10.0.1.241",
+ "PublicIp": "203.0.113.0"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes your Elastic IP addresses for use with instances in a VPC.",
+ "id": "ec2-describe-addresses-2",
+ "title": "To describe your Elastic IP addresses for EC2-VPC"
+ },
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "domain",
+ "Values": [
+ "standard"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "Addresses": [
+ {
+ "Domain": "standard",
+ "InstanceId": "i-1234567890abcdef0",
+ "PublicIp": "198.51.100.0"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes your Elastic IP addresses for use with instances in EC2-Classic.",
+ "id": "ec2-describe-addresses-3",
+ "title": "To describe your Elastic IP addresses for EC2-Classic"
+ }
+ ],
+ "DescribeAvailabilityZones": [
+ {
+ "output": {
+ "AvailabilityZones": [
+ {
+ "Messages": [
+
+ ],
+ "RegionName": "us-east-1",
+ "State": "available",
+ "ZoneName": "us-east-1b"
+ },
+ {
+ "Messages": [
+
+ ],
+ "RegionName": "us-east-1",
+ "State": "available",
+ "ZoneName": "us-east-1c"
+ },
+ {
+ "Messages": [
+
+ ],
+ "RegionName": "us-east-1",
+ "State": "available",
+ "ZoneName": "us-east-1d"
+ },
+ {
+ "Messages": [
+
+ ],
+ "RegionName": "us-east-1",
+ "State": "available",
+ "ZoneName": "us-east-1e"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the Availability Zones that are available to you. The response includes Availability Zones only for the current region.",
+ "id": "ec2-describe-availability-zones-1",
+ "title": "To describe your Availability Zones"
+ }
+ ],
+ "DescribeCustomerGateways": [
+ {
+ "input": {
+ "CustomerGatewayIds": [
+ "cgw-0e11f167"
+ ]
+ },
+ "output": {
+ "CustomerGateways": [
+ {
+ "BgpAsn": "65534",
+ "CustomerGatewayId": "cgw-0e11f167",
+ "IpAddress": "12.1.2.3",
+ "State": "available",
+ "Type": "ipsec.1"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified customer gateway.",
+ "id": "ec2-describe-customer-gateways-1",
+ "title": "To describe a customer gateway"
+ }
+ ],
+ "DescribeDhcpOptions": [
+ {
+ "input": {
+ "DhcpOptionsIds": [
+ "dopt-d9070ebb"
+ ]
+ },
+ "output": {
+ "DhcpOptions": [
+ {
+ "DhcpConfigurations": [
+ {
+ "Key": "domain-name-servers",
+ "Values": [
+ {
+ "Value": "10.2.5.2"
+ },
+ {
+ "Value": "10.2.5.1"
+ }
+ ]
+ }
+ ],
+ "DhcpOptionsId": "dopt-d9070ebb"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified DHCP options set.",
+ "id": "ec2-describe-dhcp-options-1",
+ "title": "To describe a DHCP options set"
+ }
+ ],
+ "DescribeIamInstanceProfileAssociations": [
+ {
+ "input": {
+ "AssociationIds": [
+ "iip-assoc-0db249b1f25fa24b8"
+ ]
+ },
+ "output": {
+ "IamInstanceProfileAssociations": [
+ {
+ "AssociationId": "iip-assoc-0db249b1f25fa24b8",
+ "IamInstanceProfile": {
+ "Arn": "arn:aws:iam::123456789012:instance-profile/admin-role",
+ "Id": "AIPAJVQN4F5WVLGCJDRGM"
+ },
+ "InstanceId": "i-09eb09efa73ec1dee",
+ "State": "associated"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified IAM instance profile association.",
+ "id": "to-describe-an-iam-instance-profile-association-1529025123918",
+ "title": "To describe an IAM instance profile association"
+ }
+ ],
+ "DescribeImageAttribute": [
+ {
+ "input": {
+ "Attribute": "launchPermission",
+ "ImageId": "ami-5731123e"
+ },
+ "output": {
+ "ImageId": "ami-5731123e",
+ "LaunchPermissions": [
+ {
+ "UserId": "123456789012"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the launch permissions for the specified AMI.",
+ "id": "to-describe-the-launch-permissions-for-an-ami-1529025296264",
+ "title": "To describe the launch permissions for an AMI"
+ }
+ ],
+ "DescribeImages": [
+ {
+ "input": {
+ "ImageIds": [
+ "ami-5731123e"
+ ]
+ },
+ "output": {
+ "Images": [
+ {
+ "Architecture": "x86_64",
+ "BlockDeviceMappings": [
+ {
+ "DeviceName": "/dev/sda1",
+ "Ebs": {
+ "DeleteOnTermination": true,
+ "SnapshotId": "snap-1234567890abcdef0",
+ "VolumeSize": 8,
+ "VolumeType": "standard"
+ }
+ }
+ ],
+ "Description": "An AMI for my server",
+ "Hypervisor": "xen",
+ "ImageId": "ami-5731123e",
+ "ImageLocation": "123456789012/My server",
+ "ImageType": "machine",
+ "KernelId": "aki-88aa75e1",
+ "Name": "My server",
+ "OwnerId": "123456789012",
+ "Public": false,
+ "RootDeviceName": "/dev/sda1",
+ "RootDeviceType": "ebs",
+ "State": "available",
+ "VirtualizationType": "paravirtual"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified AMI.",
+ "id": "to-describe-an-ami-1529025482866",
+ "title": "To describe an AMI"
+ }
+ ],
+ "DescribeInstanceAttribute": [
+ {
+ "input": {
+ "Attribute": "instanceType",
+ "InstanceId": "i-1234567890abcdef0"
+ },
+ "output": {
+ "InstanceId": "i-1234567890abcdef0",
+ "InstanceType": {
+ "Value": "t1.micro"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the instance type of the specified instance.\n",
+ "id": "to-describe-the-instance-type-1472712432132",
+ "title": "To describe the instance type"
+ },
+ {
+ "input": {
+ "Attribute": "disableApiTermination",
+ "InstanceId": "i-1234567890abcdef0"
+ },
+ "output": {
+ "DisableApiTermination": {
+ "Value": "false"
+ },
+ "InstanceId": "i-1234567890abcdef0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the ``disableApiTermination`` attribute of the specified instance.\n",
+ "id": "to-describe-the-disableapitermination-attribute-1472712533466",
+ "title": "To describe the disableApiTermination attribute"
+ },
+ {
+ "input": {
+ "Attribute": "blockDeviceMapping",
+ "InstanceId": "i-1234567890abcdef0"
+ },
+ "output": {
+ "BlockDeviceMappings": [
+ {
+ "DeviceName": "/dev/sda1",
+ "Ebs": {
+ "AttachTime": "2013-05-17T22:42:34.000Z",
+ "DeleteOnTermination": true,
+ "Status": "attached",
+ "VolumeId": "vol-049df61146c4d7901"
+ }
+ },
+ {
+ "DeviceName": "/dev/sdf",
+ "Ebs": {
+ "AttachTime": "2013-09-10T23:07:00.000Z",
+ "DeleteOnTermination": false,
+ "Status": "attached",
+ "VolumeId": "vol-049df61146c4d7901"
+ }
+ }
+ ],
+ "InstanceId": "i-1234567890abcdef0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the ``blockDeviceMapping`` attribute of the specified instance.\n",
+ "id": "to-describe-the-block-device-mapping-for-an-instance-1472712645423",
+ "title": "To describe the block device mapping for an instance"
+ }
+ ],
+ "DescribeInstanceStatus": [
+ {
+ "input": {
+ "InstanceIds": [
+ "i-1234567890abcdef0"
+ ]
+ },
+ "output": {
+ "InstanceStatuses": [
+ {
+ "AvailabilityZone": "us-east-1d",
+ "InstanceId": "i-1234567890abcdef0",
+ "InstanceState": {
+ "Code": 16,
+ "Name": "running"
+ },
+ "InstanceStatus": {
+ "Details": [
+ {
+ "Name": "reachability",
+ "Status": "passed"
+ }
+ ],
+ "Status": "ok"
+ },
+ "SystemStatus": {
+ "Details": [
+ {
+ "Name": "reachability",
+ "Status": "passed"
+ }
+ ],
+ "Status": "ok"
+ }
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the current status of the specified instance.",
+ "id": "to-describe-the-status-of-an-instance-1529025696830",
+ "title": "To describe the status of an instance"
+ }
+ ],
+ "DescribeInstances": [
+ {
+ "input": {
+ "InstanceIds": [
+ "i-1234567890abcdef0"
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified instance.",
+ "id": "to-describe-an-amazon-ec2-instance-1529025982172",
+ "title": "To describe an Amazon EC2 instance"
+ },
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "instance-type",
+ "Values": [
+ "t2.micro"
+ ]
+ }
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the instances with the t2.micro instance type.",
+ "id": "to-describe-the-instances-with-the-instance-type-t2micro-1529026147602",
+ "title": "To describe the instances with a specific instance type"
+ },
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "tag:Purpose",
+ "Values": [
+ "test"
+ ]
+ }
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the instances with the Purpose=test tag.",
+ "id": "to-describe-the-instances-with-a-specific-tag-1529026251928",
+ "title": "To describe the instances with a specific tag"
+ }
+ ],
+ "DescribeInternetGateways": [
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "attachment.vpc-id",
+ "Values": [
+ "vpc-a01106c2"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "InternetGateways": [
+ {
+ "Attachments": [
+ {
+ "State": "available",
+ "VpcId": "vpc-a01106c2"
+ }
+ ],
+ "InternetGatewayId": "igw-c0a643a9",
+ "Tags": [
+
+ ]
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the Internet gateway for the specified VPC.",
+ "id": "ec2-describe-internet-gateways-1",
+ "title": "To describe the Internet gateway for a VPC"
+ }
+ ],
+ "DescribeKeyPairs": [
+ {
+ "input": {
+ "KeyNames": [
+ "my-key-pair"
+ ]
+ },
+ "output": {
+ "KeyPairs": [
+ {
+ "KeyFingerprint": "1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f",
+ "KeyName": "my-key-pair"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example displays the fingerprint for the specified key.",
+ "id": "ec2-describe-key-pairs-1",
+ "title": "To display a key pair"
+ }
+ ],
+ "DescribeLaunchTemplateVersions": [
+ {
+ "input": {
+ "LaunchTemplateId": "068f72b72934aff71"
+ },
+ "output": {
+ "LaunchTemplateVersions": [
+ {
+ "CreateTime": "2017-11-20T13:12:32.000Z",
+ "CreatedBy": "arn:aws:iam::123456789102:root",
+ "DefaultVersion": false,
+ "LaunchTemplateData": {
+ "ImageId": "ami-6057e21a",
+ "InstanceType": "t2.medium",
+ "KeyName": "kp-us-east",
+ "NetworkInterfaces": [
+ {
+ "DeviceIndex": 0,
+ "Groups": [
+ "sg-7c227019"
+ ],
+ "SubnetId": "subnet-1a2b3c4d"
+ }
+ ]
+ },
+ "LaunchTemplateId": "lt-068f72b72934aff71",
+ "LaunchTemplateName": "Webservers",
+ "VersionNumber": 2
+ },
+ {
+ "CreateTime": "2017-11-20T12:52:33.000Z",
+ "CreatedBy": "arn:aws:iam::123456789102:root",
+ "DefaultVersion": true,
+ "LaunchTemplateData": {
+ "ImageId": "ami-aabbcc11",
+ "InstanceType": "t2.medium",
+ "KeyName": "kp-us-east",
+ "NetworkInterfaces": [
+ {
+ "AssociatePublicIpAddress": true,
+ "DeleteOnTermination": false,
+ "DeviceIndex": 0,
+ "Groups": [
+ "sg-7c227019"
+ ],
+ "SubnetId": "subnet-7b16de0c"
+ }
+ ],
+ "UserData": ""
+ },
+ "LaunchTemplateId": "lt-068f72b72934aff71",
+ "LaunchTemplateName": "Webservers",
+ "VersionNumber": 1
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the versions for the specified launch template.",
+ "id": "to-describe-the-versions-for-a-launch-template-1529344425048",
+ "title": "To describe the versions for a launch template"
+ }
+ ],
+ "DescribeLaunchTemplates": [
+ {
+ "input": {
+ "LaunchTemplateIds": [
+ "lt-01238c059e3466abc"
+ ]
+ },
+ "output": {
+ "LaunchTemplates": [
+ {
+ "CreateTime": "2018-01-16T04:32:57.000Z",
+ "CreatedBy": "arn:aws:iam::123456789012:root",
+ "DefaultVersionNumber": 1,
+ "LatestVersionNumber": 1,
+ "LaunchTemplateId": "lt-01238c059e3466abc",
+ "LaunchTemplateName": "my-template"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified launch template.",
+ "id": "to-describe-a-launch-template-1529344182862",
+ "title": "To describe a launch template"
+ }
+ ],
+ "DescribeMovingAddresses": [
+ {
+ "output": {
+ "MovingAddressStatuses": [
+ {
+ "MoveStatus": "MovingToVpc",
+ "PublicIp": "198.51.100.0"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes all of your moving Elastic IP addresses.",
+ "id": "ec2-describe-moving-addresses-1",
+ "title": "To describe your moving addresses"
+ }
+ ],
+ "DescribeNatGateways": [
+ {
+ "input": {
+ "Filter": [
+ {
+ "Name": "vpc-id",
+ "Values": [
+ "vpc-1a2b3c4d"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "NatGateways": [
+ {
+ "CreateTime": "2015-12-01T12:26:55.983Z",
+ "NatGatewayAddresses": [
+ {
+ "AllocationId": "eipalloc-89c620ec",
+ "NetworkInterfaceId": "eni-9dec76cd",
+ "PrivateIp": "10.0.0.149",
+ "PublicIp": "198.11.222.333"
+ }
+ ],
+ "NatGatewayId": "nat-05dba92075d71c408",
+ "State": "available",
+ "SubnetId": "subnet-847e4dc2",
+ "VpcId": "vpc-1a2b3c4d"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the NAT gateway for the specified VPC.",
+ "id": "ec2-describe-nat-gateways-1",
+ "title": "To describe a NAT gateway"
+ }
+ ],
+ "DescribeNetworkAcls": [
+ {
+ "input": {
+ "NetworkAclIds": [
+ "acl-5fb85d36"
+ ]
+ },
+ "output": {
+ "NetworkAcls": [
+ {
+ "Associations": [
+ {
+ "NetworkAclAssociationId": "aclassoc-66ea5f0b",
+ "NetworkAclId": "acl-9aeb5ef7",
+ "SubnetId": "subnet-65ea5f08"
+ }
+ ],
+ "Entries": [
+ {
+ "CidrBlock": "0.0.0.0/0",
+ "Egress": true,
+ "Protocol": "-1",
+ "RuleAction": "deny",
+ "RuleNumber": 32767
+ },
+ {
+ "CidrBlock": "0.0.0.0/0",
+ "Egress": false,
+ "Protocol": "-1",
+ "RuleAction": "deny",
+ "RuleNumber": 32767
+ }
+ ],
+ "IsDefault": false,
+ "NetworkAclId": "acl-5fb85d36",
+ "Tags": [
+
+ ],
+ "VpcId": "vpc-a01106c2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified network ACL.",
+ "id": "ec2-",
+ "title": "To describe a network ACL"
+ }
+ ],
+ "DescribeNetworkInterfaceAttribute": [
+ {
+ "input": {
+ "Attribute": "attachment",
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "output": {
+ "Attachment": {
+ "AttachTime": "2015-05-21T20:02:20.000Z",
+ "AttachmentId": "eni-attach-43348162",
+ "DeleteOnTermination": true,
+ "DeviceIndex": 0,
+ "InstanceId": "i-1234567890abcdef0",
+ "InstanceOwnerId": "123456789012",
+ "Status": "attached"
+ },
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the attachment attribute of the specified network interface.",
+ "id": "ec2-describe-network-interface-attribute-1",
+ "title": "To describe the attachment attribute of a network interface"
+ },
+ {
+ "input": {
+ "Attribute": "description",
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "output": {
+ "Description": {
+ "Value": "My description"
+ },
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the description attribute of the specified network interface.",
+ "id": "ec2-describe-network-interface-attribute-2",
+ "title": "To describe the description attribute of a network interface"
+ },
+ {
+ "input": {
+ "Attribute": "groupSet",
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "output": {
+ "Groups": [
+ {
+ "GroupId": "sg-903004f8",
+ "GroupName": "my-security-group"
+ }
+ ],
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the groupSet attribute of the specified network interface.",
+ "id": "ec2-describe-network-interface-attribute-3",
+ "title": "To describe the groupSet attribute of a network interface"
+ },
+ {
+ "input": {
+ "Attribute": "sourceDestCheck",
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "output": {
+ "NetworkInterfaceId": "eni-686ea200",
+ "SourceDestCheck": {
+ "Value": true
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the sourceDestCheck attribute of the specified network interface.",
+ "id": "ec2-describe-network-interface-attribute-4",
+ "title": "To describe the sourceDestCheck attribute of a network interface"
+ }
+ ],
+ "DescribeNetworkInterfaces": [
+ {
+ "input": {
+ "NetworkInterfaceIds": [
+ "eni-e5aa89a3"
+ ]
+ },
+ "output": {
+ "NetworkInterfaces": [
+ {
+ "Association": {
+ "AssociationId": "eipassoc-0fbb766a",
+ "IpOwnerId": "123456789012",
+ "PublicDnsName": "ec2-203-0-113-12.compute-1.amazonaws.com",
+ "PublicIp": "203.0.113.12"
+ },
+ "Attachment": {
+ "AttachTime": "2013-11-30T23:36:42.000Z",
+ "AttachmentId": "eni-attach-66c4350a",
+ "DeleteOnTermination": false,
+ "DeviceIndex": 1,
+ "InstanceId": "i-1234567890abcdef0",
+ "InstanceOwnerId": "123456789012",
+ "Status": "attached"
+ },
+ "AvailabilityZone": "us-east-1d",
+ "Description": "my network interface",
+ "Groups": [
+ {
+ "GroupId": "sg-8637d3e3",
+ "GroupName": "default"
+ }
+ ],
+ "MacAddress": "02:2f:8f:b0:cf:75",
+ "NetworkInterfaceId": "eni-e5aa89a3",
+ "OwnerId": "123456789012",
+ "PrivateDnsName": "ip-10-0-1-17.ec2.internal",
+ "PrivateIpAddress": "10.0.1.17",
+ "PrivateIpAddresses": [
+ {
+ "Association": {
+ "AssociationId": "eipassoc-0fbb766a",
+ "IpOwnerId": "123456789012",
+ "PublicDnsName": "ec2-203-0-113-12.compute-1.amazonaws.com",
+ "PublicIp": "203.0.113.12"
+ },
+ "Primary": true,
+ "PrivateDnsName": "ip-10-0-1-17.ec2.internal",
+ "PrivateIpAddress": "10.0.1.17"
+ }
+ ],
+ "RequesterManaged": false,
+ "SourceDestCheck": true,
+ "Status": "in-use",
+ "SubnetId": "subnet-b61f49f0",
+ "TagSet": [
+
+ ],
+ "VpcId": "vpc-a01106c2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "",
+ "id": "ec2-describe-network-interfaces-1",
+ "title": "To describe a network interface"
+ }
+ ],
+ "DescribeRegions": [
+ {
+ "output": {
+ "Regions": [
+ {
+ "Endpoint": "ec2.ap-south-1.amazonaws.com",
+ "RegionName": "ap-south-1"
+ },
+ {
+ "Endpoint": "ec2.eu-west-1.amazonaws.com",
+ "RegionName": "eu-west-1"
+ },
+ {
+ "Endpoint": "ec2.ap-southeast-1.amazonaws.com",
+ "RegionName": "ap-southeast-1"
+ },
+ {
+ "Endpoint": "ec2.ap-southeast-2.amazonaws.com",
+ "RegionName": "ap-southeast-2"
+ },
+ {
+ "Endpoint": "ec2.eu-central-1.amazonaws.com",
+ "RegionName": "eu-central-1"
+ },
+ {
+ "Endpoint": "ec2.ap-northeast-2.amazonaws.com",
+ "RegionName": "ap-northeast-2"
+ },
+ {
+ "Endpoint": "ec2.ap-northeast-1.amazonaws.com",
+ "RegionName": "ap-northeast-1"
+ },
+ {
+ "Endpoint": "ec2.us-east-1.amazonaws.com",
+ "RegionName": "us-east-1"
+ },
+ {
+ "Endpoint": "ec2.sa-east-1.amazonaws.com",
+ "RegionName": "sa-east-1"
+ },
+ {
+ "Endpoint": "ec2.us-west-1.amazonaws.com",
+ "RegionName": "us-west-1"
+ },
+ {
+ "Endpoint": "ec2.us-west-2.amazonaws.com",
+ "RegionName": "us-west-2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes all the regions that are available to you.",
+ "id": "ec2-describe-regions-1",
+ "title": "To describe your regions"
+ }
+ ],
+ "DescribeRouteTables": [
+ {
+ "input": {
+ "RouteTableIds": [
+ "rtb-1f382e7d"
+ ]
+ },
+ "output": {
+ "RouteTables": [
+ {
+ "Associations": [
+ {
+ "Main": true,
+ "RouteTableAssociationId": "rtbassoc-d8ccddba",
+ "RouteTableId": "rtb-1f382e7d"
+ }
+ ],
+ "PropagatingVgws": [
+
+ ],
+ "RouteTableId": "rtb-1f382e7d",
+ "Routes": [
+ {
+ "DestinationCidrBlock": "10.0.0.0/16",
+ "GatewayId": "local",
+ "State": "active"
+ }
+ ],
+ "Tags": [
+
+ ],
+ "VpcId": "vpc-a01106c2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified route table.",
+ "id": "ec2-describe-route-tables-1",
+ "title": "To describe a route table"
+ }
+ ],
+ "DescribeScheduledInstanceAvailability": [
+ {
+ "input": {
+ "FirstSlotStartTimeRange": {
+ "EarliestTime": "2016-01-31T00:00:00Z",
+ "LatestTime": "2016-01-31T04:00:00Z"
+ },
+ "Recurrence": {
+ "Frequency": "Weekly",
+ "Interval": 1,
+ "OccurrenceDays": [
+ 1
+ ]
+ }
+ },
+ "output": {
+ "ScheduledInstanceAvailabilitySet": [
+ {
+ "AvailabilityZone": "us-west-2b",
+ "AvailableInstanceCount": 20,
+ "FirstSlotStartTime": "2016-01-31T00:00:00Z",
+ "HourlyPrice": "0.095",
+ "InstanceType": "c4.large",
+ "MaxTermDurationInDays": 366,
+ "MinTermDurationInDays": 366,
+ "NetworkPlatform": "EC2-VPC",
+ "Platform": "Linux/UNIX",
+ "PurchaseToken": "eyJ2IjoiMSIsInMiOjEsImMiOi...",
+ "Recurrence": {
+ "Frequency": "Weekly",
+ "Interval": 1,
+ "OccurrenceDaySet": [
+ 1
+ ],
+ "OccurrenceRelativeToEnd": false
+ },
+ "SlotDurationInHours": 23,
+ "TotalScheduledInstanceHours": 1219
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes a schedule that occurs every week on Sunday, starting on the specified date. Note that the output contains a single schedule as an example.",
+ "id": "ec2-describe-scheduled-instance-availability-1",
+ "title": "To describe an available schedule"
+ }
+ ],
+ "DescribeScheduledInstances": [
+ {
+ "input": {
+ "ScheduledInstanceIds": [
+ "sci-1234-1234-1234-1234-123456789012"
+ ]
+ },
+ "output": {
+ "ScheduledInstanceSet": [
+ {
+ "AvailabilityZone": "us-west-2b",
+ "CreateDate": "2016-01-25T21:43:38.612Z",
+ "HourlyPrice": "0.095",
+ "InstanceCount": 1,
+ "InstanceType": "c4.large",
+ "NetworkPlatform": "EC2-VPC",
+ "NextSlotStartTime": "2016-01-31T09:00:00Z",
+ "Platform": "Linux/UNIX",
+ "Recurrence": {
+ "Frequency": "Weekly",
+ "Interval": 1,
+ "OccurrenceDaySet": [
+ 1
+ ],
+ "OccurrenceRelativeToEnd": false,
+ "OccurrenceUnit": ""
+ },
+ "ScheduledInstanceId": "sci-1234-1234-1234-1234-123456789012",
+ "SlotDurationInHours": 32,
+ "TermEndDate": "2017-01-31T09:00:00Z",
+ "TermStartDate": "2016-01-31T09:00:00Z",
+ "TotalScheduledInstanceHours": 1696
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified Scheduled Instance.",
+ "id": "ec2-describe-scheduled-instances-1",
+ "title": "To describe your Scheduled Instances"
+ }
+ ],
+ "DescribeSecurityGroupReferences": [
+ {
+ "input": {
+ "GroupId": [
+ "sg-903004f8"
+ ]
+ },
+ "output": {
+ "SecurityGroupReferenceSet": [
+ {
+ "GroupId": "sg-903004f8",
+ "ReferencingVpcId": "vpc-1a2b3c4d",
+ "VpcPeeringConnectionId": "pcx-b04deed9"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the security group references for the specified security group.",
+ "id": "to-describe-security-group-references-1529354312088",
+ "title": "To describe security group references"
+ }
+ ],
+ "DescribeSecurityGroups": [
+ {
+ "input": {
+ "GroupIds": [
+ "sg-903004f8"
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified security group.",
+ "id": "to-describe-a-security-group-1529354426314",
+ "title": "To describe a security group"
+ },
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "tag:Purpose",
+ "Values": [
+ "test"
+ ]
+ }
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the security groups that include the specified tag (Purpose=test).",
+ "id": "to-describe-a-tagged-security-group-1529354553880",
+ "title": "To describe a tagged security group"
+ }
+ ],
+ "DescribeSnapshotAttribute": [
+ {
+ "input": {
+ "Attribute": "createVolumePermission",
+ "SnapshotId": "snap-066877671789bd71b"
+ },
+ "output": {
+ "CreateVolumePermissions": [
+
+ ],
+ "SnapshotId": "snap-066877671789bd71b"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the ``createVolumePermission`` attribute on a snapshot with the snapshot ID of ``snap-066877671789bd71b``.",
+ "id": "to-describe-snapshot-attributes-1472503199736",
+ "title": "To describe snapshot attributes"
+ }
+ ],
+ "DescribeSnapshots": [
+ {
+ "input": {
+ "SnapshotIds": [
+ "snap-1234567890abcdef0"
+ ]
+ },
+ "output": {
+ "NextToken": "",
+ "Snapshots": [
+ {
+ "Description": "This is my snapshot.",
+ "OwnerId": "012345678910",
+ "Progress": "100%",
+ "SnapshotId": "snap-1234567890abcdef0",
+ "StartTime": "2014-02-28T21:28:32.000Z",
+ "State": "completed",
+ "VolumeId": "vol-049df61146c4d7901",
+ "VolumeSize": 8
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes a snapshot with the snapshot ID of ``snap-1234567890abcdef0``.",
+ "id": "to-describe-a-snapshot-1472503807850",
+ "title": "To describe a snapshot"
+ },
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "status",
+ "Values": [
+ "pending"
+ ]
+ }
+ ],
+ "OwnerIds": [
+ "012345678910"
+ ]
+ },
+ "output": {
+ "NextToken": "",
+ "Snapshots": [
+ {
+ "Description": "This is my copied snapshot.",
+ "OwnerId": "012345678910",
+ "Progress": "87%",
+ "SnapshotId": "snap-066877671789bd71b",
+ "StartTime": "2014-02-28T21:37:27.000Z",
+ "State": "pending",
+ "VolumeId": "vol-1234567890abcdef0",
+ "VolumeSize": 8
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes all snapshots owned by the ID 012345678910 that are in the ``pending`` status.",
+ "id": "to-describe-snapshots-using-filters-1472503929793",
+ "title": "To describe snapshots using filters"
+ }
+ ],
+ "DescribeSpotDatafeedSubscription": [
+ {
+ "output": {
+ "SpotDatafeedSubscription": {
+ "Bucket": "my-s3-bucket",
+ "OwnerId": "123456789012",
+ "Prefix": "spotdata",
+ "State": "Active"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the Spot Instance datafeed subscription for your AWS account.",
+ "id": "ec2-describe-spot-datafeed-subscription-1",
+ "title": "To describe the datafeed for your AWS account"
+ }
+ ],
+ "DescribeSpotFleetInstances": [
+ {
+ "input": {
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ },
+ "output": {
+ "ActiveInstances": [
+ {
+ "InstanceId": "i-1234567890abcdef0",
+ "InstanceType": "m3.medium",
+ "SpotInstanceRequestId": "sir-08b93456"
+ }
+ ],
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists the Spot Instances associated with the specified Spot fleet.",
+ "id": "ec2-describe-spot-fleet-instances-1",
+ "title": "To describe the Spot Instances associated with a Spot fleet"
+ }
+ ],
+ "DescribeSpotFleetRequestHistory": [
+ {
+ "input": {
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE",
+ "StartTime": "2015-05-26T00:00:00Z"
+ },
+ "output": {
+ "HistoryRecords": [
+ {
+ "EventInformation": {
+ "EventSubType": "submitted"
+ },
+ "EventType": "fleetRequestChange",
+ "Timestamp": "2015-05-26T23:17:20.697Z"
+ },
+ {
+ "EventInformation": {
+ "EventSubType": "active"
+ },
+ "EventType": "fleetRequestChange",
+ "Timestamp": "2015-05-26T23:17:20.873Z"
+ },
+ {
+ "EventInformation": {
+ "EventSubType": "launched",
+ "InstanceId": "i-1234567890abcdef0"
+ },
+ "EventType": "instanceChange",
+ "Timestamp": "2015-05-26T23:21:21.712Z"
+ },
+ {
+ "EventInformation": {
+ "EventSubType": "launched",
+ "InstanceId": "i-1234567890abcdef1"
+ },
+ "EventType": "instanceChange",
+ "Timestamp": "2015-05-26T23:21:21.816Z"
+ }
+ ],
+ "NextToken": "CpHNsscimcV5oH7bSbub03CI2Qms5+ypNpNm+53MNlR0YcXAkp0xFlfKf91yVxSExmbtma3awYxMFzNA663ZskT0AHtJ6TCb2Z8bQC2EnZgyELbymtWPfpZ1ZbauVg+P+TfGlWxWWB/Vr5dk5d4LfdgA/DRAHUrYgxzrEXAMPLE=",
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE",
+ "StartTime": "2015-05-26T00:00:00Z"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example returns the history for the specified Spot fleet starting at the specified time.",
+ "id": "ec2-describe-spot-fleet-request-history-1",
+ "title": "To describe Spot fleet history"
+ }
+ ],
+ "DescribeSpotFleetRequests": [
+ {
+ "input": {
+ "SpotFleetRequestIds": [
+ "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ ]
+ },
+ "output": {
+ "SpotFleetRequestConfigs": [
+ {
+ "SpotFleetRequestConfig": {
+ "IamFleetRole": "arn:aws:iam::123456789012:role/my-spot-fleet-role",
+ "LaunchSpecifications": [
+ {
+ "EbsOptimized": false,
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "cc2.8xlarge",
+ "NetworkInterfaces": [
+ {
+ "AssociatePublicIpAddress": true,
+ "DeleteOnTermination": false,
+ "DeviceIndex": 0,
+ "SecondaryPrivateIpAddressCount": 0,
+ "SubnetId": "subnet-a61dafcf"
+ }
+ ]
+ },
+ {
+ "EbsOptimized": false,
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "r3.8xlarge",
+ "NetworkInterfaces": [
+ {
+ "AssociatePublicIpAddress": true,
+ "DeleteOnTermination": false,
+ "DeviceIndex": 0,
+ "SecondaryPrivateIpAddressCount": 0,
+ "SubnetId": "subnet-a61dafcf"
+ }
+ ]
+ }
+ ],
+ "SpotPrice": "0.05",
+ "TargetCapacity": 20
+ },
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE",
+ "SpotFleetRequestState": "active"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified Spot fleet request.",
+ "id": "ec2-describe-spot-fleet-requests-1",
+ "title": "To describe a Spot fleet request"
+ }
+ ],
+ "DescribeSpotInstanceRequests": [
+ {
+ "input": {
+ "SpotInstanceRequestIds": [
+ "sir-08b93456"
+ ]
+ },
+ "output": {
+ "SpotInstanceRequests": [
+ {
+ "CreateTime": "2014-04-30T18:14:55.000Z",
+ "InstanceId": "i-1234567890abcdef0",
+ "LaunchSpecification": {
+ "BlockDeviceMappings": [
+ {
+ "DeviceName": "/dev/sda1",
+ "Ebs": {
+ "DeleteOnTermination": true,
+ "VolumeSize": 8,
+ "VolumeType": "standard"
+ }
+ }
+ ],
+ "EbsOptimized": false,
+ "ImageId": "ami-7aba833f",
+ "InstanceType": "m1.small",
+ "KeyName": "my-key-pair",
+ "SecurityGroups": [
+ {
+ "GroupId": "sg-e38f24a7",
+ "GroupName": "my-security-group"
+ }
+ ]
+ },
+ "LaunchedAvailabilityZone": "us-west-1b",
+ "ProductDescription": "Linux/UNIX",
+ "SpotInstanceRequestId": "sir-08b93456",
+ "SpotPrice": "0.010000",
+ "State": "active",
+ "Status": {
+ "Code": "fulfilled",
+ "Message": "Your Spot request is fulfilled.",
+ "UpdateTime": "2014-04-30T18:16:21.000Z"
+ },
+ "Type": "one-time"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified Spot Instance request.",
+ "id": "ec2-describe-spot-instance-requests-1",
+ "title": "To describe a Spot Instance request"
+ }
+ ],
+ "DescribeSpotPriceHistory": [
+ {
+ "input": {
+ "EndTime": "2014-01-06T08:09:10",
+ "InstanceTypes": [
+ "m1.xlarge"
+ ],
+ "ProductDescriptions": [
+ "Linux/UNIX (Amazon VPC)"
+ ],
+ "StartTime": "2014-01-06T07:08:09"
+ },
+ "output": {
+ "SpotPriceHistory": [
+ {
+ "AvailabilityZone": "us-west-1a",
+ "InstanceType": "m1.xlarge",
+ "ProductDescription": "Linux/UNIX (Amazon VPC)",
+ "SpotPrice": "0.080000",
+ "Timestamp": "2014-01-06T04:32:53.000Z"
+ },
+ {
+ "AvailabilityZone": "us-west-1c",
+ "InstanceType": "m1.xlarge",
+ "ProductDescription": "Linux/UNIX (Amazon VPC)",
+ "SpotPrice": "0.080000",
+ "Timestamp": "2014-01-05T11:28:26.000Z"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example returns the Spot Price history for m1.xlarge, Linux/UNIX (Amazon VPC) instances for a particular day in January.",
+ "id": "ec2-describe-spot-price-history-1",
+ "title": "To describe Spot price history for Linux/UNIX (Amazon VPC)"
+ }
+ ],
+ "DescribeSubnets": [
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "vpc-id",
+ "Values": [
+ "vpc-a01106c2"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "Subnets": [
+ {
+ "AvailabilityZone": "us-east-1c",
+ "AvailableIpAddressCount": 251,
+ "CidrBlock": "10.0.1.0/24",
+ "DefaultForAz": false,
+ "MapPublicIpOnLaunch": false,
+ "State": "available",
+ "SubnetId": "subnet-9d4a7b6c",
+ "VpcId": "vpc-a01106c2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the subnets for the specified VPC.",
+ "id": "ec2-describe-subnets-1",
+ "title": "To describe the subnets for a VPC"
+ }
+ ],
+ "DescribeTags": [
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "resource-id",
+ "Values": [
+ "i-1234567890abcdef8"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "Tags": [
+ {
+ "Key": "Stack",
+ "ResourceId": "i-1234567890abcdef8",
+ "ResourceType": "instance",
+ "Value": "test"
+ },
+ {
+ "Key": "Name",
+ "ResourceId": "i-1234567890abcdef8",
+ "ResourceType": "instance",
+ "Value": "Beta Server"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the tags for the specified instance.",
+ "id": "ec2-describe-tags-1",
+ "title": "To describe the tags for a single resource"
+ }
+ ],
+ "DescribeVolumeAttribute": [
+ {
+ "input": {
+ "Attribute": "autoEnableIO",
+ "VolumeId": "vol-049df61146c4d7901"
+ },
+ "output": {
+ "AutoEnableIO": {
+ "Value": false
+ },
+ "VolumeId": "vol-049df61146c4d7901"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the ``autoEnableIo`` attribute of the volume with the ID ``vol-049df61146c4d7901``.",
+ "id": "to-describe-a-volume-attribute-1472505773492",
+ "title": "To describe a volume attribute"
+ }
+ ],
+ "DescribeVolumeStatus": [
+ {
+ "input": {
+ "VolumeIds": [
+ "vol-1234567890abcdef0"
+ ]
+ },
+ "output": {
+ "VolumeStatuses": [
+ {
+ "Actions": [
+
+ ],
+ "AvailabilityZone": "us-east-1a",
+ "Events": [
+
+ ],
+ "VolumeId": "vol-1234567890abcdef0",
+ "VolumeStatus": {
+ "Details": [
+ {
+ "Name": "io-enabled",
+ "Status": "passed"
+ },
+ {
+ "Name": "io-performance",
+ "Status": "not-applicable"
+ }
+ ],
+ "Status": "ok"
+ }
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the status for the volume ``vol-1234567890abcdef0``.",
+ "id": "to-describe-the-status-of-a-single-volume-1472507016193",
+ "title": "To describe the status of a single volume"
+ },
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "volume-status.status",
+ "Values": [
+ "impaired"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "VolumeStatuses": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the status for all volumes that are impaired. In this example output, there are no impaired volumes.",
+ "id": "to-describe-the-status-of-impaired-volumes-1472507239821",
+ "title": "To describe the status of impaired volumes"
+ }
+ ],
+ "DescribeVolumes": [
+ {
+ "input": {
+ },
+ "output": {
+ "NextToken": "",
+ "Volumes": [
+ {
+ "Attachments": [
+ {
+ "AttachTime": "2013-12-18T22:35:00.000Z",
+ "DeleteOnTermination": true,
+ "Device": "/dev/sda1",
+ "InstanceId": "i-1234567890abcdef0",
+ "State": "attached",
+ "VolumeId": "vol-049df61146c4d7901"
+ }
+ ],
+ "AvailabilityZone": "us-east-1a",
+ "CreateTime": "2013-12-18T22:35:00.084Z",
+ "Size": 8,
+ "SnapshotId": "snap-1234567890abcdef0",
+ "State": "in-use",
+ "VolumeId": "vol-049df61146c4d7901",
+ "VolumeType": "standard"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes all of your volumes in the default region.",
+ "id": "to-describe-all-volumes-1472506358883",
+ "title": "To describe all volumes"
+ },
+ {
+ "input": {
+ "Filters": [
+ {
+ "Name": "attachment.instance-id",
+ "Values": [
+ "i-1234567890abcdef0"
+ ]
+ },
+ {
+ "Name": "attachment.delete-on-termination",
+ "Values": [
+ "true"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "Volumes": [
+ {
+ "Attachments": [
+ {
+ "AttachTime": "2013-12-18T22:35:00.000Z",
+ "DeleteOnTermination": true,
+ "Device": "/dev/sda1",
+ "InstanceId": "i-1234567890abcdef0",
+ "State": "attached",
+ "VolumeId": "vol-049df61146c4d7901"
+ }
+ ],
+ "AvailabilityZone": "us-east-1a",
+ "CreateTime": "2013-12-18T22:35:00.084Z",
+ "Size": 8,
+ "SnapshotId": "snap-1234567890abcdef0",
+ "State": "in-use",
+ "VolumeId": "vol-049df61146c4d7901",
+ "VolumeType": "standard"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes all volumes that are both attached to the instance with the ID i-1234567890abcdef0 and set to delete when the instance terminates.",
+ "id": "to-describe-volumes-that-are-attached-to-a-specific-instance-1472506613578",
+ "title": "To describe volumes that are attached to a specific instance"
+ }
+ ],
+ "DescribeVpcAttribute": [
+ {
+ "input": {
+ "Attribute": "enableDnsSupport",
+ "VpcId": "vpc-a01106c2"
+ },
+ "output": {
+ "EnableDnsSupport": {
+ "Value": true
+ },
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the enableDnsSupport attribute. This attribute indicates whether DNS resolution is enabled for the VPC. If this attribute is true, the Amazon DNS server resolves DNS hostnames for your instances to their corresponding IP addresses; otherwise, it does not.",
+ "id": "ec2-describe-vpc-attribute-1",
+ "title": "To describe the enableDnsSupport attribute"
+ },
+ {
+ "input": {
+ "Attribute": "enableDnsHostnames",
+ "VpcId": "vpc-a01106c2"
+ },
+ "output": {
+ "EnableDnsHostnames": {
+ "Value": true
+ },
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the enableDnsHostnames attribute. This attribute indicates whether the instances launched in the VPC get DNS hostnames. If this attribute is true, instances in the VPC get DNS hostnames; otherwise, they do not.",
+ "id": "ec2-describe-vpc-attribute-2",
+ "title": "To describe the enableDnsHostnames attribute"
+ }
+ ],
+ "DescribeVpcs": [
+ {
+ "input": {
+ "VpcIds": [
+ "vpc-a01106c2"
+ ]
+ },
+ "output": {
+ "Vpcs": [
+ {
+ "CidrBlock": "10.0.0.0/16",
+ "DhcpOptionsId": "dopt-7a8b9c2d",
+ "InstanceTenancy": "default",
+ "IsDefault": false,
+ "State": "available",
+ "Tags": [
+ {
+ "Key": "Name",
+ "Value": "MyVPC"
+ }
+ ],
+ "VpcId": "vpc-a01106c2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified VPC.",
+ "id": "ec2-describe-vpcs-1",
+ "title": "To describe a VPC"
+ }
+ ],
+ "DetachInternetGateway": [
+ {
+ "input": {
+ "InternetGatewayId": "igw-c0a643a9",
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example detaches the specified Internet gateway from the specified VPC.",
+ "id": "ec2-detach-internet-gateway-1",
+ "title": "To detach an Internet gateway from a VPC"
+ }
+ ],
+ "DetachNetworkInterface": [
+ {
+ "input": {
+ "AttachmentId": "eni-attach-66c4350a"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example detaches the specified network interface from its attached instance.",
+ "id": "ec2-detach-network-interface-1",
+ "title": "To detach a network interface from an instance"
+ }
+ ],
+ "DetachVolume": [
+ {
+ "input": {
+ "VolumeId": "vol-1234567890abcdef0"
+ },
+ "output": {
+ "AttachTime": "2014-02-27T19:23:06.000Z",
+ "Device": "/dev/sdb",
+ "InstanceId": "i-1234567890abcdef0",
+ "State": "detaching",
+ "VolumeId": "vol-049df61146c4d7901"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example detaches the volume (``vol-049df61146c4d7901``) from the instance it is attached to.",
+ "id": "to-detach-a-volume-from-an-instance-1472507977694",
+ "title": "To detach a volume from an instance"
+ }
+ ],
+ "DisableVgwRoutePropagation": [
+ {
+ "input": {
+ "GatewayId": "vgw-9a4cacf3",
+ "RouteTableId": "rtb-22574640"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example disables the specified virtual private gateway from propagating static routes to the specified route table.",
+ "id": "ec2-disable-vgw-route-propagation-1",
+ "title": "To disable route propagation"
+ }
+ ],
+ "DisassociateAddress": [
+ {
+ "input": {
+ "AssociationId": "eipassoc-2bebb745"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example disassociates an Elastic IP address from an instance in a VPC.",
+ "id": "ec2-disassociate-address-1",
+ "title": "To disassociate an Elastic IP address in EC2-VPC"
+ },
+ {
+ "input": {
+ "PublicIp": "198.51.100.0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example disassociates an Elastic IP address from an instance in EC2-Classic.",
+ "id": "ec2-disassociate-address-2",
+ "title": "To disassociate an Elastic IP addresses in EC2-Classic"
+ }
+ ],
+ "DisassociateIamInstanceProfile": [
+ {
+ "input": {
+ "AssociationId": "iip-assoc-05020b59952902f5f"
+ },
+ "output": {
+ "IamInstanceProfileAssociation": {
+ "AssociationId": "iip-assoc-05020b59952902f5f",
+ "IamInstanceProfile": {
+ "Arn": "arn:aws:iam::123456789012:instance-profile/admin-role",
+ "Id": "AIPAI5IVIHMFFYY2DKV5Y"
+ },
+ "InstanceId": "i-123456789abcde123",
+ "State": "disassociating"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example disassociates the specified IAM instance profile from an instance.",
+ "id": "to-disassociate-an-iam-instance-profile-1529355364478",
+ "title": "To disassociate an IAM instance profile"
+ }
+ ],
+ "DisassociateRouteTable": [
+ {
+ "input": {
+ "AssociationId": "rtbassoc-781d0d1a"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example disassociates the specified route table from its associated subnet.",
+ "id": "ec2-disassociate-route-table-1",
+ "title": "To disassociate a route table"
+ }
+ ],
+ "EnableVgwRoutePropagation": [
+ {
+ "input": {
+ "GatewayId": "vgw-9a4cacf3",
+ "RouteTableId": "rtb-22574640"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example enables the specified virtual private gateway to propagate static routes to the specified route table.",
+ "id": "ec2-enable-vgw-route-propagation-1",
+ "title": "To enable route propagation"
+ }
+ ],
+ "EnableVolumeIO": [
+ {
+ "input": {
+ "VolumeId": "vol-1234567890abcdef0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example enables I/O on volume ``vol-1234567890abcdef0``.",
+ "id": "to-enable-io-for-a-volume-1472508114867",
+ "title": "To enable I/O for a volume"
+ }
+ ],
+ "GetConsoleOutput": [
+ {
+ "input": {
+ "InstanceId": "i-1234567890abcdef0"
+ },
+ "output": {
+ "InstanceId": "i-1234567890abcdef0",
+ "Output": "...",
+ "Timestamp": "2018-05-25T21:23:53.000Z"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example gets the console output for the specified instance.",
+ "id": "to-get-the-console-output-1529355683194",
+ "title": "To get the console output"
+ }
+ ],
+ "GetLaunchTemplateData": [
+ {
+ "input": {
+ "InstanceId": "0123d646e8048babc"
+ },
+ "output": {
+ "LaunchTemplateData": {
+ "BlockDeviceMappings": [
+ {
+ "DeviceName": "/dev/xvda",
+ "Ebs": {
+ "DeleteOnTermination": true,
+ "Encrypted": false,
+ "Iops": 100,
+ "SnapshotId": "snap-02594938353ef77d3",
+ "VolumeSize": 8,
+ "VolumeType": "gp2"
+ }
+ }
+ ],
+ "EbsOptimized": false,
+ "ImageId": "ami-32cf7b4a",
+ "InstanceType": "t2.medium",
+ "KeyName": "my-key-pair",
+ "Monitoring": {
+ "Enabled": false
+ },
+ "NetworkInterfaces": [
+ {
+ "AssociatePublicIpAddress": false,
+ "DeleteOnTermination": true,
+ "Description": "",
+ "DeviceIndex": 0,
+ "Groups": [
+ "sg-d14e1bb4"
+ ],
+ "Ipv6Addresses": [
+
+ ],
+ "NetworkInterfaceId": "eni-4338b5a9",
+ "PrivateIpAddress": "10.0.3.233",
+ "PrivateIpAddresses": [
+ {
+ "Primary": true,
+ "PrivateIpAddress": "10.0.3.233"
+ }
+ ],
+ "SubnetId": "subnet-5264e837"
+ }
+ ],
+ "Placement": {
+ "AvailabilityZone": "us-east-2b",
+ "GroupName": "",
+ "Tenancy": "default"
+ }
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example gets the launch template data for the specified instance.",
+ "id": "to-get-the-launch-template-data-for-an-instance--1529356515702",
+ "title": "To get the launch template data for an instance "
+ }
+ ],
+ "ModifyImageAttribute": [
+ {
+ "input": {
+ "ImageId": "ami-5731123e",
+ "LaunchPermission": {
+ "Add": [
+ {
+ "Group": "all"
+ }
+ ]
+ }
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example makes the specified AMI public.",
+ "id": "to-make-an-ami-public-1529357395278",
+ "title": "To make an AMI public"
+ },
+ {
+ "input": {
+ "ImageId": "ami-5731123e",
+ "LaunchPermission": {
+ "Add": [
+ {
+ "UserId": "123456789012"
+ }
+ ]
+ }
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example grants launch permissions for the specified AMI to the specified AWS account.",
+ "id": "to-grant-launch-permissions-1529357727906",
+ "title": "To grant launch permissions"
+ }
+ ],
+ "ModifyInstanceAttribute": [
+ {
+ "input": {
+ "InstanceId": "i-1234567890abcdef0",
+ "InstanceType": {
+ "Value": "m5.large"
+ }
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies the instance type of the specified stopped instance.",
+ "id": "to-modify-the-instance-type-1529357844378",
+ "title": "To modify the instance type"
+ },
+ {
+ "input": {
+ "EnaSupport": {
+ "Value": true
+ },
+ "InstanceId": "i-1234567890abcdef0"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example enables enhanced networking for the specified stopped instance.",
+ "id": "to-enable-enhanced-networking-1529358279870",
+ "title": "To enable enhanced networking"
+ }
+ ],
+ "ModifyLaunchTemplate": [
+ {
+ "input": {
+ "DefaultVersion": "2",
+ "LaunchTemplateId": "lt-0abcd290751193123"
+ },
+ "output": {
+ "LaunchTemplate": {
+ "CreateTime": "2017-12-01T13:35:46.000Z",
+ "CreatedBy": "arn:aws:iam::123456789012:root",
+ "DefaultVersionNumber": 2,
+ "LatestVersionNumber": 2,
+ "LaunchTemplateId": "lt-0abcd290751193123",
+ "LaunchTemplateName": "WebServers"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example specifies version 2 as the default version of the specified launch template.",
+ "id": "to-change-the-default-version-of-a-launch-template-1529358440364",
+ "title": "To change the default version of a launch template"
+ }
+ ],
+ "ModifyNetworkInterfaceAttribute": [
+ {
+ "input": {
+ "Attachment": {
+ "AttachmentId": "eni-attach-43348162",
+ "DeleteOnTermination": false
+ },
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies the attachment attribute of the specified network interface.",
+ "id": "ec2-modify-network-interface-attribute-1",
+ "title": "To modify the attachment attribute of a network interface"
+ },
+ {
+ "input": {
+ "Description": {
+ "Value": "My description"
+ },
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies the description attribute of the specified network interface.",
+ "id": "ec2-modify-network-interface-attribute-2",
+ "title": "To modify the description attribute of a network interface"
+ },
+ {
+ "input": {
+ "Groups": [
+ "sg-903004f8",
+ "sg-1a2b3c4d"
+ ],
+ "NetworkInterfaceId": "eni-686ea200"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example command modifies the groupSet attribute of the specified network interface.",
+ "id": "ec2-modify-network-interface-attribute-3",
+ "title": "To modify the groupSet attribute of a network interface"
+ },
+ {
+ "input": {
+ "NetworkInterfaceId": "eni-686ea200",
+ "SourceDestCheck": {
+ "Value": false
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example command modifies the sourceDestCheck attribute of the specified network interface.",
+ "id": "ec2-modify-network-interface-attribute-4",
+ "title": "To modify the sourceDestCheck attribute of a network interface"
+ }
+ ],
+ "ModifySnapshotAttribute": [
+ {
+ "input": {
+ "Attribute": "createVolumePermission",
+ "OperationType": "remove",
+ "SnapshotId": "snap-1234567890abcdef0",
+ "UserIds": [
+ "123456789012"
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies snapshot ``snap-1234567890abcdef0`` to remove the create volume permission for a user with the account ID ``123456789012``. If the command succeeds, no output is returned.",
+ "id": "to-modify-a-snapshot-attribute-1472508385907",
+ "title": "To modify a snapshot attribute"
+ },
+ {
+ "input": {
+ "Attribute": "createVolumePermission",
+ "GroupNames": [
+ "all"
+ ],
+ "OperationType": "add",
+ "SnapshotId": "snap-1234567890abcdef0"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example makes the snapshot ``snap-1234567890abcdef0`` public.",
+ "id": "to-make-a-snapshot-public-1472508470529",
+ "title": "To make a snapshot public"
+ }
+ ],
+ "ModifySpotFleetRequest": [
+ {
+ "input": {
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE",
+ "TargetCapacity": 20
+ },
+ "output": {
+ "Return": true
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example increases the target capacity of the specified Spot fleet request.",
+ "id": "ec2-modify-spot-fleet-request-1",
+ "title": "To increase the target capacity of a Spot fleet request"
+ },
+ {
+ "input": {
+ "ExcessCapacityTerminationPolicy": "NoTermination ",
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE",
+ "TargetCapacity": 10
+ },
+ "output": {
+ "Return": true
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example decreases the target capacity of the specified Spot fleet request without terminating any Spot Instances as a result.",
+ "id": "ec2-modify-spot-fleet-request-2",
+ "title": "To decrease the target capacity of a Spot fleet request"
+ }
+ ],
+ "ModifySubnetAttribute": [
+ {
+ "input": {
+ "MapPublicIpOnLaunch": {
+ "Value": true
+ },
+ "SubnetId": "subnet-1a2b3c4d"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies the specified subnet so that all instances launched into this subnet are assigned a public IP address.",
+ "id": "ec2-modify-subnet-attribute-1",
+ "title": "To change a subnet's public IP addressing behavior"
+ }
+ ],
+ "ModifyVolumeAttribute": [
+ {
+ "input": {
+ "AutoEnableIO": {
+ "Value": true
+ },
+ "DryRun": true,
+ "VolumeId": "vol-1234567890abcdef0"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example sets the ``autoEnableIo`` attribute of the volume with the ID ``vol-1234567890abcdef0`` to ``true``. If the command succeeds, no output is returned.",
+ "id": "to-modify-a-volume-attribute-1472508596749",
+ "title": "To modify a volume attribute"
+ }
+ ],
+ "ModifyVpcAttribute": [
+ {
+ "input": {
+ "EnableDnsSupport": {
+ "Value": false
+ },
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies the enableDnsSupport attribute. This attribute indicates whether DNS resolution is enabled for the VPC. If this attribute is true, the Amazon DNS server resolves DNS hostnames for instances in the VPC to their corresponding IP addresses; otherwise, it does not.",
+ "id": "ec2-modify-vpc-attribute-1",
+ "title": "To modify the enableDnsSupport attribute"
+ },
+ {
+ "input": {
+ "EnableDnsHostnames": {
+ "Value": false
+ },
+ "VpcId": "vpc-a01106c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies the enableDnsHostnames attribute. This attribute indicates whether instances launched in the VPC get DNS hostnames. If this attribute is true, instances in the VPC get DNS hostnames; otherwise, they do not.",
+ "id": "ec2-modify-vpc-attribute-2",
+ "title": "To modify the enableDnsHostnames attribute"
+ }
+ ],
+ "MoveAddressToVpc": [
+ {
+ "input": {
+ "PublicIp": "54.123.4.56"
+ },
+ "output": {
+ "Status": "MoveInProgress"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example moves the specified Elastic IP address to the EC2-VPC platform.",
+ "id": "ec2-move-address-to-vpc-1",
+ "title": "To move an address to EC2-VPC"
+ }
+ ],
+ "PurchaseScheduledInstances": [
+ {
+ "input": {
+ "PurchaseRequests": [
+ {
+ "InstanceCount": 1,
+ "PurchaseToken": "eyJ2IjoiMSIsInMiOjEsImMiOi..."
+ }
+ ]
+ },
+ "output": {
+ "ScheduledInstanceSet": [
+ {
+ "AvailabilityZone": "us-west-2b",
+ "CreateDate": "2016-01-25T21:43:38.612Z",
+ "HourlyPrice": "0.095",
+ "InstanceCount": 1,
+ "InstanceType": "c4.large",
+ "NetworkPlatform": "EC2-VPC",
+ "NextSlotStartTime": "2016-01-31T09:00:00Z",
+ "Platform": "Linux/UNIX",
+ "Recurrence": {
+ "Frequency": "Weekly",
+ "Interval": 1,
+ "OccurrenceDaySet": [
+ 1
+ ],
+ "OccurrenceRelativeToEnd": false,
+ "OccurrenceUnit": ""
+ },
+ "ScheduledInstanceId": "sci-1234-1234-1234-1234-123456789012",
+ "SlotDurationInHours": 32,
+ "TermEndDate": "2017-01-31T09:00:00Z",
+ "TermStartDate": "2016-01-31T09:00:00Z",
+ "TotalScheduledInstanceHours": 1696
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example purchases a Scheduled Instance.",
+ "id": "ec2-purchase-scheduled-instances-1",
+ "title": "To purchase a Scheduled Instance"
+ }
+ ],
+ "RebootInstances": [
+ {
+ "input": {
+ "InstanceIds": [
+ "i-1234567890abcdef5"
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example reboots the specified EC2 instance.",
+ "id": "to-reboot-an-ec2-instance-1529358566382",
+ "title": "To reboot an EC2 instance"
+ }
+ ],
+ "ReleaseAddress": [
+ {
+ "input": {
+ "AllocationId": "eipalloc-64d5890a"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example releases an Elastic IP address for use with instances in a VPC.",
+ "id": "ec2-release-address-1",
+ "title": "To release an Elastic IP address for EC2-VPC"
+ },
+ {
+ "input": {
+ "PublicIp": "198.51.100.0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example releases an Elastic IP address for use with instances in EC2-Classic.",
+ "id": "ec2-release-address-2",
+ "title": "To release an Elastic IP addresses for EC2-Classic"
+ }
+ ],
+ "ReplaceNetworkAclAssociation": [
+ {
+ "input": {
+ "AssociationId": "aclassoc-e5b95c8c",
+ "NetworkAclId": "acl-5fb85d36"
+ },
+ "output": {
+ "NewAssociationId": "aclassoc-3999875b"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the specified network ACL with the subnet for the specified network ACL association.",
+ "id": "ec2-replace-network-acl-association-1",
+ "title": "To replace the network ACL associated with a subnet"
+ }
+ ],
+ "ReplaceNetworkAclEntry": [
+ {
+ "input": {
+ "CidrBlock": "203.0.113.12/24",
+ "Egress": false,
+ "NetworkAclId": "acl-5fb85d36",
+ "PortRange": {
+ "From": 53,
+ "To": 53
+ },
+ "Protocol": "17",
+ "RuleAction": "allow",
+ "RuleNumber": 100
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example replaces an entry for the specified network ACL. The new rule 100 allows ingress traffic from 203.0.113.12/24 on UDP port 53 (DNS) into any associated subnet.",
+ "id": "ec2-replace-network-acl-entry-1",
+ "title": "To replace a network ACL entry"
+ }
+ ],
+ "ReplaceRoute": [
+ {
+ "input": {
+ "DestinationCidrBlock": "10.0.0.0/16",
+ "GatewayId": "vgw-9a4cacf3",
+ "RouteTableId": "rtb-22574640"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example replaces the specified route in the specified table table. The new route matches the specified CIDR and sends the traffic to the specified virtual private gateway.",
+ "id": "ec2-replace-route-1",
+ "title": "To replace a route"
+ }
+ ],
+ "ReplaceRouteTableAssociation": [
+ {
+ "input": {
+ "AssociationId": "rtbassoc-781d0d1a",
+ "RouteTableId": "rtb-22574640"
+ },
+ "output": {
+ "NewAssociationId": "rtbassoc-3a1f0f58"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the specified route table with the subnet for the specified route table association.",
+ "id": "ec2-replace-route-table-association-1",
+ "title": "To replace the route table associated with a subnet"
+ }
+ ],
+ "RequestSpotFleet": [
+ {
+ "input": {
+ "SpotFleetRequestConfig": {
+ "IamFleetRole": "arn:aws:iam::123456789012:role/my-spot-fleet-role",
+ "LaunchSpecifications": [
+ {
+ "IamInstanceProfile": {
+ "Arn": "arn:aws:iam::123456789012:instance-profile/my-iam-role"
+ },
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "m3.medium",
+ "KeyName": "my-key-pair",
+ "SecurityGroups": [
+ {
+ "GroupId": "sg-1a2b3c4d"
+ }
+ ],
+ "SubnetId": "subnet-1a2b3c4d, subnet-3c4d5e6f"
+ }
+ ],
+ "SpotPrice": "0.04",
+ "TargetCapacity": 2
+ }
+ },
+ "output": {
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a Spot fleet request with two launch specifications that differ only by subnet. The Spot fleet launches the instances in the specified subnet with the lowest price. If the instances are launched in a default VPC, they receive a public IP address by default. If the instances are launched in a nondefault VPC, they do not receive a public IP address by default. Note that you can't specify different subnets from the same Availability Zone in a Spot fleet request.",
+ "id": "ec2-request-spot-fleet-1",
+ "title": "To request a Spot fleet in the subnet with the lowest price"
+ },
+ {
+ "input": {
+ "SpotFleetRequestConfig": {
+ "IamFleetRole": "arn:aws:iam::123456789012:role/my-spot-fleet-role",
+ "LaunchSpecifications": [
+ {
+ "IamInstanceProfile": {
+ "Arn": "arn:aws:iam::123456789012:instance-profile/my-iam-role"
+ },
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "m3.medium",
+ "KeyName": "my-key-pair",
+ "Placement": {
+ "AvailabilityZone": "us-west-2a, us-west-2b"
+ },
+ "SecurityGroups": [
+ {
+ "GroupId": "sg-1a2b3c4d"
+ }
+ ]
+ }
+ ],
+ "SpotPrice": "0.04",
+ "TargetCapacity": 2
+ }
+ },
+ "output": {
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a Spot fleet request with two launch specifications that differ only by Availability Zone. The Spot fleet launches the instances in the specified Availability Zone with the lowest price. If your account supports EC2-VPC only, Amazon EC2 launches the Spot instances in the default subnet of the Availability Zone. If your account supports EC2-Classic, Amazon EC2 launches the instances in EC2-Classic in the Availability Zone.",
+ "id": "ec2-request-spot-fleet-2",
+ "title": "To request a Spot fleet in the Availability Zone with the lowest price"
+ },
+ {
+ "input": {
+ "SpotFleetRequestConfig": {
+ "IamFleetRole": "arn:aws:iam::123456789012:role/my-spot-fleet-role",
+ "LaunchSpecifications": [
+ {
+ "IamInstanceProfile": {
+ "Arn": "arn:aws:iam::880185128111:instance-profile/my-iam-role"
+ },
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "m3.medium",
+ "KeyName": "my-key-pair",
+ "NetworkInterfaces": [
+ {
+ "AssociatePublicIpAddress": true,
+ "DeviceIndex": 0,
+ "Groups": [
+ "sg-1a2b3c4d"
+ ],
+ "SubnetId": "subnet-1a2b3c4d"
+ }
+ ]
+ }
+ ],
+ "SpotPrice": "0.04",
+ "TargetCapacity": 2
+ }
+ },
+ "output": {
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example assigns public addresses to instances launched in a nondefault VPC. Note that when you specify a network interface, you must include the subnet ID and security group ID using the network interface.",
+ "id": "ec2-request-spot-fleet-3",
+ "title": "To launch Spot instances in a subnet and assign them public IP addresses"
+ },
+ {
+ "input": {
+ "SpotFleetRequestConfig": {
+ "AllocationStrategy": "diversified",
+ "IamFleetRole": "arn:aws:iam::123456789012:role/my-spot-fleet-role",
+ "LaunchSpecifications": [
+ {
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "c4.2xlarge",
+ "SubnetId": "subnet-1a2b3c4d"
+ },
+ {
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "m3.2xlarge",
+ "SubnetId": "subnet-1a2b3c4d"
+ },
+ {
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "r3.2xlarge",
+ "SubnetId": "subnet-1a2b3c4d"
+ }
+ ],
+ "SpotPrice": "0.70",
+ "TargetCapacity": 30
+ }
+ },
+ "output": {
+ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a Spot fleet request that launches 30 instances using the diversified allocation strategy. The launch specifications differ by instance type. The Spot fleet distributes the instances across the launch specifications such that there are 10 instances of each type.",
+ "id": "ec2-request-spot-fleet-4",
+ "title": "To request a Spot fleet using the diversified allocation strategy"
+ }
+ ],
+ "RequestSpotInstances": [
+ {
+ "input": {
+ "InstanceCount": 5,
+ "LaunchSpecification": {
+ "IamInstanceProfile": {
+ "Arn": "arn:aws:iam::123456789012:instance-profile/my-iam-role"
+ },
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "m3.medium",
+ "KeyName": "my-key-pair",
+ "Placement": {
+ "AvailabilityZone": "us-west-2a"
+ },
+ "SecurityGroupIds": [
+ "sg-1a2b3c4d"
+ ]
+ },
+ "SpotPrice": "0.03",
+ "Type": "one-time"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a one-time Spot Instance request for five instances in the specified Availability Zone. If your account supports EC2-VPC only, Amazon EC2 launches the instances in the default subnet of the specified Availability Zone. If your account supports EC2-Classic, Amazon EC2 launches the instances in EC2-Classic in the specified Availability Zone.",
+ "id": "ec2-request-spot-instances-1",
+ "title": "To create a one-time Spot Instance request"
+ },
+ {
+ "input": {
+ "InstanceCount": 5,
+ "LaunchSpecification": {
+ "IamInstanceProfile": {
+ "Arn": "arn:aws:iam::123456789012:instance-profile/my-iam-role"
+ },
+ "ImageId": "ami-1a2b3c4d",
+ "InstanceType": "m3.medium",
+ "SecurityGroupIds": [
+ "sg-1a2b3c4d"
+ ],
+ "SubnetId": "subnet-1a2b3c4d"
+ },
+ "SpotPrice": "0.050",
+ "Type": "one-time"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example command creates a one-time Spot Instance request for five instances in the specified subnet. Amazon EC2 launches the instances in the specified subnet. If the VPC is a nondefault VPC, the instances do not receive a public IP address by default.",
+ "id": "ec2-request-spot-instances-2",
+ "title": "To create a one-time Spot Instance request"
+ }
+ ],
+ "ResetImageAttribute": [
+ {
+ "input": {
+ "Attribute": "launchPermission",
+ "ImageId": "ami-5731123e"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example resets the launchPermission attribute for the specified AMI. By default, AMIs are private.",
+ "id": "to-reset-the-launchpermission-attribute-1529359519534",
+ "title": "To reset the launchPermission attribute"
+ }
+ ],
+ "ResetInstanceAttribute": [
+ {
+ "input": {
+ "Attribute": "sourceDestCheck",
+ "InstanceId": "i-1234567890abcdef0"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example resets the sourceDestCheck attribute for the specified instance.",
+ "id": "to-reset-the-sourcedestcheck-attribute-1529359630708",
+ "title": "To reset the sourceDestCheck attribute"
+ }
+ ],
+ "ResetSnapshotAttribute": [
+ {
+ "input": {
+ "Attribute": "createVolumePermission",
+ "SnapshotId": "snap-1234567890abcdef0"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example resets the create volume permissions for snapshot ``snap-1234567890abcdef0``. If the command succeeds, no output is returned.",
+ "id": "to-reset-a-snapshot-attribute-1472508825735",
+ "title": "To reset a snapshot attribute"
+ }
+ ],
+ "RestoreAddressToClassic": [
+ {
+ "input": {
+ "PublicIp": "198.51.100.0"
+ },
+ "output": {
+ "PublicIp": "198.51.100.0",
+ "Status": "MoveInProgress"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example restores the specified Elastic IP address to the EC2-Classic platform.",
+ "id": "ec2-restore-address-to-classic-1",
+ "title": "To restore an address to EC2-Classic"
+ }
+ ],
+ "RunInstances": [
+ {
+ "input": {
+ "BlockDeviceMappings": [
+ {
+ "DeviceName": "/dev/sdh",
+ "Ebs": {
+ "VolumeSize": 100
+ }
+ }
+ ],
+ "ImageId": "ami-abc12345",
+ "InstanceType": "t2.micro",
+ "KeyName": "my-key-pair",
+ "MaxCount": 1,
+ "MinCount": 1,
+ "SecurityGroupIds": [
+ "sg-1a2b3c4d"
+ ],
+ "SubnetId": "subnet-6e7f829e",
+ "TagSpecifications": [
+ {
+ "ResourceType": "instance",
+ "Tags": [
+ {
+ "Key": "Purpose",
+ "Value": "test"
+ }
+ ]
+ }
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example launches an instance using the specified AMI, instance type, security group, subnet, block device mapping, and tags.",
+ "id": "to-launch-an-instance-1529360150806",
+ "title": "To launch an instance"
+ }
+ ],
+ "RunScheduledInstances": [
+ {
+ "input": {
+ "InstanceCount": 1,
+ "LaunchSpecification": {
+ "IamInstanceProfile": {
+ "Name": "my-iam-role"
+ },
+ "ImageId": "ami-12345678",
+ "InstanceType": "c4.large",
+ "KeyName": "my-key-pair",
+ "NetworkInterfaces": [
+ {
+ "AssociatePublicIpAddress": true,
+ "DeviceIndex": 0,
+ "Groups": [
+ "sg-12345678"
+ ],
+ "SubnetId": "subnet-12345678"
+ }
+ ]
+ },
+ "ScheduledInstanceId": "sci-1234-1234-1234-1234-123456789012"
+ },
+ "output": {
+ "InstanceIdSet": [
+ "i-1234567890abcdef0"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example launches the specified Scheduled Instance in a VPC.",
+ "id": "ec2-run-scheduled-instances-1",
+ "title": "To launch a Scheduled Instance in a VPC"
+ },
+ {
+ "input": {
+ "InstanceCount": 1,
+ "LaunchSpecification": {
+ "IamInstanceProfile": {
+ "Name": "my-iam-role"
+ },
+ "ImageId": "ami-12345678",
+ "InstanceType": "c4.large",
+ "KeyName": "my-key-pair",
+ "Placement": {
+ "AvailabilityZone": "us-west-2b"
+ },
+ "SecurityGroupIds": [
+ "sg-12345678"
+ ]
+ },
+ "ScheduledInstanceId": "sci-1234-1234-1234-1234-123456789012"
+ },
+ "output": {
+ "InstanceIdSet": [
+ "i-1234567890abcdef0"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example launches the specified Scheduled Instance in EC2-Classic.",
+ "id": "ec2-run-scheduled-instances-2",
+ "title": "To launch a Scheduled Instance in EC2-Classic"
+ }
+ ],
+ "StartInstances": [
+ {
+ "input": {
+ "InstanceIds": [
+ "i-1234567890abcdef0"
+ ]
+ },
+ "output": {
+ "StartingInstances": [
+ {
+ "CurrentState": {
+ "Code": 0,
+ "Name": "pending"
+ },
+ "InstanceId": "i-1234567890abcdef0",
+ "PreviousState": {
+ "Code": 80,
+ "Name": "stopped"
+ }
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example starts the specified EC2 instance.",
+ "id": "to-start-a-stopped-ec2-instance-1529358792730",
+ "title": "To start a stopped EC2 instance"
+ }
+ ],
+ "StopInstances": [
+ {
+ "input": {
+ "InstanceIds": [
+ "i-1234567890abcdef0"
+ ]
+ },
+ "output": {
+ "StoppingInstances": [
+ {
+ "CurrentState": {
+ "Code": 64,
+ "Name": "stopping"
+ },
+ "InstanceId": "i-1234567890abcdef0",
+ "PreviousState": {
+ "Code": 16,
+ "Name": "running"
+ }
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example stops the specified EC2 instance.",
+ "id": "to-stop-a-running-ec2-instance-1529358905540",
+ "title": "To stop a running EC2 instance"
+ }
+ ],
+ "TerminateInstances": [
+ {
+ "input": {
+ "InstanceIds": [
+ "i-1234567890abcdef0"
+ ]
+ },
+ "output": {
+ "TerminatingInstances": [
+ {
+ "CurrentState": {
+ "Code": 32,
+ "Name": "shutting-down"
+ },
+ "InstanceId": "i-1234567890abcdef0",
+ "PreviousState": {
+ "Code": 16,
+ "Name": "running"
+ }
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example terminates the specified EC2 instance.",
+ "id": "to-terminate-an-ec2-instance-1529359350660",
+ "title": "To terminate an EC2 instance"
+ }
+ ],
+ "UnassignPrivateIpAddresses": [
+ {
+ "input": {
+ "NetworkInterfaceId": "eni-e5aa89a3",
+ "PrivateIpAddresses": [
+ "10.0.0.82"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example unassigns the specified private IP address from the specified network interface.",
+ "id": "ec2-unassign-private-ip-addresses-1",
+ "title": "To unassign a secondary private IP address from a network interface"
+ }
+ ],
+ "UpdateSecurityGroupRuleDescriptionsEgress": [
+ {
+ "input": {
+ "GroupId": "sg-123abc12",
+ "IpPermissions": [
+ {
+ "FromPort": 80,
+ "IpProtocol": "tcp",
+ "IpRanges": [
+ {
+ "CidrIp": "203.0.113.0/24",
+ "Description": "Outbound HTTP access to server 2"
+ }
+ ],
+ "ToPort": 80
+ }
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example updates the description for the specified security group rule.",
+ "id": "to-update-an-outbound-security-group-rule-description-1529360481544",
+ "title": "To update an outbound security group rule description"
+ }
+ ],
+ "UpdateSecurityGroupRuleDescriptionsIngress": [
+ {
+ "input": {
+ "GroupId": "sg-123abc12",
+ "IpPermissions": [
+ {
+ "FromPort": 22,
+ "IpProtocol": "tcp",
+ "IpRanges": [
+ {
+ "CidrIp": "203.0.113.0/16",
+ "Description": "SSH access from the LA office"
+ }
+ ],
+ "ToPort": 22
+ }
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example updates the description for the specified security group rule.",
+ "id": "to-update-an-inbound-security-group-rule-description-1529360820372",
+ "title": "To update an inbound security group rule description"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/paginators-1.json
new file mode 100644
index 00000000..db522f58
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/paginators-1.json
@@ -0,0 +1,888 @@
+{
+ "pagination": {
+ "DescribeRouteTables": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RouteTables"
+ },
+ "DescribeIamInstanceProfileAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "IamInstanceProfileAssociations"
+ },
+ "DescribeInstanceStatus": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "InstanceStatuses"
+ },
+ "DescribeInstances": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Reservations"
+ },
+ "DescribeReservedInstancesOfferings": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ReservedInstancesOfferings"
+ },
+ "DescribeReservedInstancesModifications": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "ReservedInstancesModifications"
+ },
+ "DescribeSecurityGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SecurityGroups"
+ },
+ "DescribeSnapshots": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Snapshots"
+ },
+ "DescribeSpotFleetInstances": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ActiveInstances"
+ },
+ "DescribeSpotFleetRequests": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SpotFleetRequestConfigs"
+ },
+ "DescribeSpotPriceHistory": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SpotPriceHistory"
+ },
+ "DescribeTags": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Tags"
+ },
+ "DescribeVolumeStatus": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "VolumeStatuses"
+ },
+ "DescribeVolumes": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Volumes"
+ },
+ "DescribeNatGateways": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "NatGateways"
+ },
+ "DescribeNetworkInterfaces": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "NetworkInterfaces"
+ },
+ "DescribeVpcEndpoints": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "VpcEndpoints"
+ },
+ "DescribeVpcEndpointServices": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": [
+ "ServiceDetails",
+ "ServiceNames"
+ ]
+ },
+ "DescribeVpcEndpointConnections": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "VpcEndpointConnections"
+ },
+ "DescribeByoipCidrs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ByoipCidrs"
+ },
+ "DescribeCapacityReservations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "CapacityReservations"
+ },
+ "DescribeClassicLinkInstances": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Instances"
+ },
+ "DescribeClientVpnAuthorizationRules": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AuthorizationRules"
+ },
+ "DescribeClientVpnConnections": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Connections"
+ },
+ "DescribeClientVpnEndpoints": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ClientVpnEndpoints"
+ },
+ "DescribeClientVpnRoutes": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Routes"
+ },
+ "DescribeClientVpnTargetNetworks": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ClientVpnTargetNetworks"
+ },
+ "DescribeEgressOnlyInternetGateways": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "EgressOnlyInternetGateways"
+ },
+ "DescribeFleets": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Fleets"
+ },
+ "DescribeFlowLogs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "FlowLogs"
+ },
+ "DescribeFpgaImages": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "FpgaImages"
+ },
+ "DescribeHostReservationOfferings": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "OfferingSet"
+ },
+ "DescribeHostReservations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "HostReservationSet"
+ },
+ "DescribeHosts": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Hosts"
+ },
+ "DescribeImportImageTasks": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ImportImageTasks"
+ },
+ "DescribeImportSnapshotTasks": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ImportSnapshotTasks"
+ },
+ "DescribeInstanceCreditSpecifications": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "InstanceCreditSpecifications"
+ },
+ "DescribeLaunchTemplateVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LaunchTemplateVersions"
+ },
+ "DescribeLaunchTemplates": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LaunchTemplates"
+ },
+ "DescribeMovingAddresses": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "MovingAddressStatuses"
+ },
+ "DescribeNetworkInterfacePermissions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "NetworkInterfacePermissions"
+ },
+ "DescribePrefixLists": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "PrefixLists"
+ },
+ "DescribePrincipalIdFormat": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Principals"
+ },
+ "DescribePublicIpv4Pools": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "PublicIpv4Pools"
+ },
+ "DescribeScheduledInstanceAvailability": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ScheduledInstanceAvailabilitySet"
+ },
+ "DescribeScheduledInstances": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ScheduledInstanceSet"
+ },
+ "DescribeStaleSecurityGroups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "StaleSecurityGroupSet"
+ },
+ "DescribeTransitGatewayAttachments": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TransitGatewayAttachments"
+ },
+ "DescribeTransitGatewayRouteTables": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TransitGatewayRouteTables"
+ },
+ "DescribeTransitGatewayVpcAttachments": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TransitGatewayVpcAttachments"
+ },
+ "DescribeTransitGateways": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TransitGateways"
+ },
+ "DescribeVolumesModifications": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "VolumesModifications"
+ },
+ "DescribeVpcClassicLinkDnsSupport": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Vpcs"
+ },
+ "DescribeVpcEndpointConnectionNotifications": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ConnectionNotificationSet"
+ },
+ "DescribeVpcEndpointServiceConfigurations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ServiceConfigurations"
+ },
+ "DescribeVpcEndpointServicePermissions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AllowedPrincipals"
+ },
+ "DescribeVpcPeeringConnections": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "VpcPeeringConnections"
+ },
+ "GetTransitGatewayAttachmentPropagations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TransitGatewayAttachmentPropagations"
+ },
+ "GetTransitGatewayRouteTableAssociations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Associations"
+ },
+ "GetTransitGatewayRouteTablePropagations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TransitGatewayRouteTablePropagations"
+ },
+ "DescribeInternetGateways": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "InternetGateways"
+ },
+ "DescribeNetworkAcls": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "NetworkAcls"
+ },
+ "DescribeVpcs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Vpcs"
+ },
+ "DescribeSpotInstanceRequests": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "SpotInstanceRequests"
+ },
+ "DescribeDhcpOptions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "DhcpOptions"
+ },
+ "DescribeSubnets": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Subnets"
+ },
+ "DescribeTrafficMirrorFilters": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TrafficMirrorFilters"
+ },
+ "DescribeTrafficMirrorSessions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TrafficMirrorSessions"
+ },
+ "DescribeTrafficMirrorTargets": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TrafficMirrorTargets"
+ },
+ "DescribeExportImageTasks": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ExportImageTasks"
+ },
+ "DescribeFastSnapshotRestores": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "FastSnapshotRestores"
+ },
+ "DescribeIpv6Pools": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Ipv6Pools"
+ },
+ "GetAssociatedIpv6PoolCidrs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Ipv6CidrAssociations"
+ },
+ "DescribeCoipPools": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "CoipPools"
+ },
+ "DescribeInstanceTypeOfferings": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "InstanceTypeOfferings"
+ },
+ "DescribeInstanceTypes": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "InstanceTypes"
+ },
+ "DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LocalGatewayRouteTableVirtualInterfaceGroupAssociations"
+ },
+ "DescribeLocalGatewayRouteTableVpcAssociations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LocalGatewayRouteTableVpcAssociations"
+ },
+ "DescribeLocalGatewayRouteTables": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LocalGatewayRouteTables"
+ },
+ "DescribeLocalGatewayVirtualInterfaceGroups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LocalGatewayVirtualInterfaceGroups"
+ },
+ "DescribeLocalGatewayVirtualInterfaces": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LocalGatewayVirtualInterfaces"
+ },
+ "DescribeLocalGateways": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LocalGateways"
+ },
+ "DescribeTransitGatewayMulticastDomains": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TransitGatewayMulticastDomains"
+ },
+ "DescribeTransitGatewayPeeringAttachments": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TransitGatewayPeeringAttachments"
+ },
+ "GetTransitGatewayMulticastDomainAssociations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "MulticastDomainAssociations"
+ },
+ "SearchLocalGatewayRoutes": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Routes"
+ },
+ "SearchTransitGatewayMulticastGroups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "MulticastGroups"
+ },
+ "DescribeManagedPrefixLists": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "PrefixLists"
+ },
+ "GetManagedPrefixListAssociations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "PrefixListAssociations"
+ },
+ "GetManagedPrefixListEntries": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Entries"
+ },
+ "GetGroupsForCapacityReservation": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "CapacityReservationGroups"
+ },
+ "DescribeCarrierGateways": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "CarrierGateways"
+ },
+ "GetTransitGatewayPrefixListReferences": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TransitGatewayPrefixListReferences"
+ },
+ "DescribeNetworkInsightsAnalyses": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "NetworkInsightsAnalyses"
+ },
+ "DescribeNetworkInsightsPaths": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "NetworkInsightsPaths"
+ },
+ "DescribeTransitGatewayConnectPeers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TransitGatewayConnectPeers"
+ },
+ "DescribeTransitGatewayConnects": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TransitGatewayConnects"
+ },
+ "DescribeAddressesAttribute": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Addresses"
+ },
+ "DescribeReplaceRootVolumeTasks": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ReplaceRootVolumeTasks"
+ },
+ "DescribeStoreImageTasks": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "StoreImageTaskResults"
+ },
+ "DescribeSecurityGroupRules": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "SecurityGroupRules"
+ },
+ "DescribeInstanceEventWindows": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "InstanceEventWindows"
+ },
+ "DescribeTrunkInterfaceAssociations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "InterfaceAssociations"
+ },
+ "GetVpnConnectionDeviceTypes": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "VpnConnectionDeviceTypes"
+ },
+ "DescribeCapacityReservationFleets": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "CapacityReservationFleets"
+ },
+ "GetInstanceTypesFromInstanceRequirements": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "InstanceTypes"
+ },
+ "GetSpotPlacementScores": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "SpotPlacementScores"
+ },
+ "DescribeSnapshotTierStatus": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "SnapshotTierStatuses"
+ },
+ "ListSnapshotsInRecycleBin": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Snapshots"
+ },
+ "DescribeIpamPools": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "IpamPools"
+ },
+ "DescribeIpamScopes": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "IpamScopes"
+ },
+ "DescribeIpams": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Ipams"
+ },
+ "DescribeNetworkInsightsAccessScopeAnalyses": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "NetworkInsightsAccessScopeAnalyses"
+ },
+ "DescribeNetworkInsightsAccessScopes": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "NetworkInsightsAccessScopes"
+ },
+ "GetIpamAddressHistory": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "HistoryRecords"
+ },
+ "GetIpamPoolAllocations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "IpamPoolAllocations"
+ },
+ "GetIpamPoolCidrs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "IpamPoolCidrs"
+ },
+ "GetIpamResourceCidrs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "IpamResourceCidrs"
+ },
+ "DescribeFastLaunchImages": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "FastLaunchImages"
+ },
+ "ListImagesInRecycleBin": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Images"
+ },
+ "DescribeTransitGatewayPolicyTables": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TransitGatewayPolicyTables"
+ },
+ "DescribeTransitGatewayRouteTableAnnouncements": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TransitGatewayRouteTableAnnouncements"
+ },
+ "GetTransitGatewayPolicyTableAssociations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Associations"
+ },
+ "DescribeAddressTransfers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AddressTransfers"
+ },
+ "DescribeAwsNetworkPerformanceMetricSubscriptions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Subscriptions"
+ },
+ "GetAwsNetworkPerformanceData": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "DataResponses"
+ },
+ "DescribeVerifiedAccessEndpoints": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "VerifiedAccessEndpoints"
+ },
+ "DescribeVerifiedAccessGroups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "VerifiedAccessGroups"
+ },
+ "DescribeVerifiedAccessInstanceLoggingConfigurations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LoggingConfigurations"
+ },
+ "DescribeVerifiedAccessInstances": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "VerifiedAccessInstances"
+ },
+ "DescribeVerifiedAccessTrustProviders": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "VerifiedAccessTrustProviders"
+ },
+ "DescribeImages": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Images"
+ },
+ "DescribeIpamResourceDiscoveries": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "IpamResourceDiscoveries"
+ },
+ "DescribeIpamResourceDiscoveryAssociations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "IpamResourceDiscoveryAssociations"
+ },
+ "GetIpamDiscoveredAccounts": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "IpamDiscoveredAccounts"
+ },
+ "GetIpamDiscoveredResourceCidrs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "IpamDiscoveredResourceCidrs"
+ },
+ "GetNetworkInsightsAccessScopeAnalysisFindings": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AnalysisFindings"
+ },
+ "DescribeInstanceConnectEndpoints": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "InstanceConnectEndpoints"
+ },
+ "GetSecurityGroupsForVpc": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "SecurityGroupForVpcs"
+ },
+ "DescribeCapacityBlockOfferings": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "CapacityBlockOfferings"
+ },
+ "DescribeInstanceTopology": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Instances"
+ },
+ "DescribeMacHosts": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "MacHosts"
+ },
+ "DescribeCapacityReservationBillingRequests": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "CapacityReservationBillingRequests"
+ },
+ "DescribeInstanceImageMetadata": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "InstanceImageMetadata"
+ },
+ "DescribeSecurityGroupVpcAssociations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "SecurityGroupVpcAssociations"
+ },
+ "DescribeCapacityBlockExtensionHistory": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "CapacityBlockExtensions"
+ },
+ "DescribeCapacityBlockExtensionOfferings": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "CapacityBlockExtensionOfferings"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..823bbb5d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/paginators-1.sdk-extras.json
@@ -0,0 +1,13 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "GetNetworkInsightsAccessScopeAnalysisFindings": {
+ "non_aggregate_keys": [
+ "AnalysisStatus",
+ "NetworkInsightsAccessScopeAnalysisId"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/service-2.json.gz
new file mode 100644
index 00000000..948a53eb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/waiters-2.json
new file mode 100644
index 00000000..e890388e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ec2/2016-11-15/waiters-2.json
@@ -0,0 +1,726 @@
+{
+ "version": 2,
+ "waiters": {
+ "InstanceExists": {
+ "delay": 5,
+ "maxAttempts": 40,
+ "operation": "DescribeInstances",
+ "acceptors": [
+ {
+ "matcher": "path",
+ "expected": true,
+ "argument": "length(Reservations[]) > `0`",
+ "state": "success"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidInstanceID.NotFound",
+ "state": "retry"
+ }
+ ]
+ },
+ "BundleTaskComplete": {
+ "delay": 15,
+ "operation": "DescribeBundleTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "complete",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "BundleTasks[].State"
+ },
+ {
+ "expected": "failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "BundleTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskCancelled": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "cancelled",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskCompleted": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ },
+ {
+ "expected": "cancelled",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ConversionTasks[].State"
+ },
+ {
+ "expected": "cancelling",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "ConversionTaskDeleted": {
+ "delay": 15,
+ "operation": "DescribeConversionTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ConversionTasks[].State"
+ }
+ ]
+ },
+ "CustomerGatewayAvailable": {
+ "delay": 15,
+ "operation": "DescribeCustomerGateways",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "CustomerGateways[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CustomerGateways[].State"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CustomerGateways[].State"
+ }
+ ]
+ },
+ "ExportTaskCancelled": {
+ "delay": 15,
+ "operation": "DescribeExportTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "cancelled",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ExportTasks[].State"
+ }
+ ]
+ },
+ "ExportTaskCompleted": {
+ "delay": 15,
+ "operation": "DescribeExportTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ExportTasks[].State"
+ }
+ ]
+ },
+ "ImageExists": {
+ "operation": "DescribeImages",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "matcher": "path",
+ "expected": true,
+ "argument": "length(Images[]) > `0`",
+ "state": "success"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidAMIID.NotFound",
+ "state": "retry"
+ }
+ ]
+ },
+ "ImageAvailable": {
+ "operation": "DescribeImages",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "Images[].State",
+ "expected": "available"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "Images[].State",
+ "expected": "failed"
+ }
+ ]
+ },
+ "InstanceRunning": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "running",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "shutting-down",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "terminated",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "stopping",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidInstanceID.NotFound",
+ "state": "retry"
+ }
+ ]
+ },
+ "InstanceStatusOk": {
+ "operation": "DescribeInstanceStatus",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "InstanceStatuses[].InstanceStatus.Status",
+ "expected": "ok"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidInstanceID.NotFound",
+ "state": "retry"
+ }
+ ]
+ },
+ "InstanceStopped": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "stopped",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "terminated",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ }
+ ]
+ },
+ "InstanceTerminated": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "terminated",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ },
+ {
+ "expected": "stopping",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Reservations[].Instances[].State.Name"
+ }
+ ]
+ },
+ "InternetGatewayExists": {
+ "operation": "DescribeInternetGateways",
+ "delay": 5,
+ "maxAttempts": 6,
+ "acceptors": [
+ {
+ "expected": true,
+ "matcher": "path",
+ "state": "success",
+ "argument": "length(InternetGateways[].InternetGatewayId) > `0`"
+ },
+ {
+ "expected": "InvalidInternetGateway.NotFound",
+ "matcher": "error",
+ "state": "retry"
+ }
+ ]
+ },
+ "KeyPairExists": {
+ "operation": "DescribeKeyPairs",
+ "delay": 5,
+ "maxAttempts": 6,
+ "acceptors": [
+ {
+ "expected": true,
+ "matcher": "path",
+ "state": "success",
+ "argument": "length(KeyPairs[].KeyName) > `0`"
+ },
+ {
+ "expected": "InvalidKeyPair.NotFound",
+ "matcher": "error",
+ "state": "retry"
+ }
+ ]
+ },
+ "NatGatewayAvailable": {
+ "operation": "DescribeNatGateways",
+ "delay": 15,
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "NatGateways[].State",
+ "expected": "available"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "NatGateways[].State",
+ "expected": "failed"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "NatGateways[].State",
+ "expected": "deleting"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "NatGateways[].State",
+ "expected": "deleted"
+ },
+ {
+ "state": "retry",
+ "matcher": "error",
+ "expected": "NatGatewayNotFound"
+ }
+ ]
+ },
+ "NatGatewayDeleted": {
+ "operation": "DescribeNatGateways",
+ "delay": 15,
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "NatGateways[].State",
+ "expected": "deleted"
+ },
+ {
+ "state": "success",
+ "matcher": "error",
+ "expected": "NatGatewayNotFound"
+ }
+ ]
+ },
+ "NetworkInterfaceAvailable": {
+ "operation": "DescribeNetworkInterfaces",
+ "delay": 20,
+ "maxAttempts": 10,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "NetworkInterfaces[].Status"
+ },
+ {
+ "expected": "InvalidNetworkInterfaceID.NotFound",
+ "matcher": "error",
+ "state": "failure"
+ }
+ ]
+ },
+ "PasswordDataAvailable": {
+ "operation": "GetPasswordData",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "length(PasswordData) > `0`",
+ "expected": true
+ }
+ ]
+ },
+ "SnapshotCompleted": {
+ "delay": 15,
+ "operation": "DescribeSnapshots",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Snapshots[].State"
+ },
+ {
+ "expected": "error",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Snapshots[].State"
+ }
+ ]
+ },
+ "SnapshotImported": {
+ "delay": 15,
+ "operation": "DescribeImportSnapshotTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ImportSnapshotTasks[].SnapshotTaskDetail.Status"
+ },
+ {
+ "expected": "error",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ImportSnapshotTasks[].SnapshotTaskDetail.Status"
+ }
+ ]
+ },
+ "SecurityGroupExists": {
+ "operation": "DescribeSecurityGroups",
+ "delay": 5,
+ "maxAttempts": 6,
+ "acceptors": [
+ {
+ "expected": true,
+ "matcher": "path",
+ "state": "success",
+ "argument": "length(SecurityGroups[].GroupId) > `0`"
+ },
+ {
+ "expected": "InvalidGroup.NotFound",
+ "matcher": "error",
+ "state": "retry"
+ }
+ ]
+ },
+ "SpotInstanceRequestFulfilled": {
+ "operation": "DescribeSpotInstanceRequests",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "fulfilled"
+ },
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "request-canceled-and-instance-running"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "schedule-expired"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "canceled-before-fulfillment"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "bad-parameters"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "SpotInstanceRequests[].Status.Code",
+ "expected": "system-error"
+ },
+ {
+ "state": "retry",
+ "matcher": "error",
+ "expected": "InvalidSpotInstanceRequestID.NotFound"
+ }
+ ]
+ },
+ "StoreImageTaskComplete": {
+ "delay": 5,
+ "operation": "DescribeStoreImageTasks",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "StoreImageTaskResults[].StoreTaskState"
+ },
+ {
+ "expected": "Failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "StoreImageTaskResults[].StoreTaskState"
+ },
+ {
+ "expected": "InProgress",
+ "matcher": "pathAny",
+ "state": "retry",
+ "argument": "StoreImageTaskResults[].StoreTaskState"
+ }
+ ]
+ },
+ "SubnetAvailable": {
+ "delay": 15,
+ "operation": "DescribeSubnets",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Subnets[].State"
+ }
+ ]
+ },
+ "SystemStatusOk": {
+ "operation": "DescribeInstanceStatus",
+ "maxAttempts": 40,
+ "delay": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "InstanceStatuses[].SystemStatus.Status",
+ "expected": "ok"
+ }
+ ]
+ },
+ "VolumeAvailable": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Volumes[].State"
+ }
+ ]
+ },
+ "VolumeDeleted": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidVolume.NotFound",
+ "state": "success"
+ }
+ ]
+ },
+ "VolumeInUse": {
+ "delay": 15,
+ "operation": "DescribeVolumes",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "in-use",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Volumes[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Volumes[].State"
+ }
+ ]
+ },
+ "VpcAvailable": {
+ "delay": 15,
+ "operation": "DescribeVpcs",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Vpcs[].State"
+ }
+ ]
+ },
+ "VpcExists": {
+ "operation": "DescribeVpcs",
+ "delay": 1,
+ "maxAttempts": 5,
+ "acceptors": [
+ {
+ "matcher": "status",
+ "expected": 200,
+ "state": "success"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidVpcID.NotFound",
+ "state": "retry"
+ }
+ ]
+ },
+ "VpnConnectionAvailable": {
+ "delay": 15,
+ "operation": "DescribeVpnConnections",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ }
+ ]
+ },
+ "VpnConnectionDeleted": {
+ "delay": 15,
+ "operation": "DescribeVpnConnections",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "VpnConnections[].State"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "VpnConnections[].State"
+ }
+ ]
+ },
+ "VpcPeeringConnectionExists": {
+ "delay": 15,
+ "operation": "DescribeVpcPeeringConnections",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "matcher": "status",
+ "expected": 200,
+ "state": "success"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidVpcPeeringConnectionID.NotFound",
+ "state": "retry"
+ }
+ ]
+ },
+ "VpcPeeringConnectionDeleted": {
+ "delay": 15,
+ "operation": "DescribeVpcPeeringConnections",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "VpcPeeringConnections[].Status.Code"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidVpcPeeringConnectionID.NotFound",
+ "state": "success"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ecr-public/2020-10-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ecr-public/2020-10-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..4f1a4546
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ecr-public/2020-10-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ecr-public/2020-10-30/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ecr-public/2020-10-30/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ecr-public/2020-10-30/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ecr-public/2020-10-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ecr-public/2020-10-30/paginators-1.json
new file mode 100644
index 00000000..b9dbda45
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ecr-public/2020-10-30/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "DescribeImageTags": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "imageTagDetails"
+ },
+ "DescribeImages": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "imageDetails"
+ },
+ "DescribeRegistries": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "registries"
+ },
+ "DescribeRepositories": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "repositories"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ecr-public/2020-10-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ecr-public/2020-10-30/service-2.json.gz
new file mode 100644
index 00000000..aa58fb34
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ecr-public/2020-10-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ecr/2015-09-21/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ecr/2015-09-21/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..25fc8ce8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ecr/2015-09-21/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ecr/2015-09-21/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ecr/2015-09-21/examples-1.json
new file mode 100644
index 00000000..7daf57f3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ecr/2015-09-21/examples-1.json
@@ -0,0 +1,195 @@
+{
+ "version": "1.0",
+ "examples": {
+ "BatchDeleteImage": [
+ {
+ "input": {
+ "imageIds": [
+ {
+ "imageTag": "precise"
+ }
+ ],
+ "repositoryName": "ubuntu"
+ },
+ "output": {
+ "failures": [
+
+ ],
+ "imageIds": [
+ {
+ "imageDigest": "sha256:examplee6d1e504117a17000003d3753086354a38375961f2e665416ef4b1b2f",
+ "imageTag": "precise"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "This example deletes images with the tags precise and trusty in a repository called ubuntu in the default registry for an account.",
+ "id": "batchdeleteimages-example-1470860541707",
+ "title": "To delete multiple images"
+ }
+ ],
+ "BatchGetImage": [
+ {
+ "input": {
+ "imageIds": [
+ {
+ "imageTag": "precise"
+ }
+ ],
+ "repositoryName": "ubuntu"
+ },
+ "output": {
+ "failures": [
+
+ ],
+ "images": [
+ {
+ "imageId": {
+ "imageDigest": "sha256:example76bdff6d83a09ba2a818f0d00000063724a9ac3ba5019c56f74ebf42a",
+ "imageTag": "precise"
+ },
+ "imageManifest": "{\n \"schemaVersion\": 1,\n \"name\": \"ubuntu\",\n \"tag\": \"precise\",\n...",
+ "registryId": "244698725403",
+ "repositoryName": "ubuntu"
+ }
+ ]
+ },
+ "comments": {
+ "output": {
+ "imageManifest": "In this example, the imageManifest in the output JSON has been truncated."
+ }
+ },
+ "description": "This example obtains information for an image with a specified image digest ID from the repository named ubuntu in the current account.",
+ "id": "batchgetimage-example-1470862771437",
+ "title": "To obtain multiple images in a single request"
+ }
+ ],
+ "CreateRepository": [
+ {
+ "input": {
+ "repositoryName": "project-a/nginx-web-app"
+ },
+ "output": {
+ "repository": {
+ "registryId": "012345678901",
+ "repositoryArn": "arn:aws:ecr:us-west-2:012345678901:repository/project-a/nginx-web-app",
+ "repositoryName": "project-a/nginx-web-app"
+ }
+ },
+ "comments": {
+ "output": {
+ "imageManifest": "In this example, the imageManifest in the output JSON has been truncated."
+ }
+ },
+ "description": "This example creates a repository called nginx-web-app inside the project-a namespace in the default registry for an account.",
+ "id": "createrepository-example-1470863688724",
+ "title": "To create a new repository"
+ }
+ ],
+ "DeleteRepository": [
+ {
+ "input": {
+ "force": true,
+ "repositoryName": "ubuntu"
+ },
+ "output": {
+ "repository": {
+ "registryId": "012345678901",
+ "repositoryArn": "arn:aws:ecr:us-west-2:012345678901:repository/ubuntu",
+ "repositoryName": "ubuntu"
+ }
+ },
+ "comments": {
+ "output": {
+ "imageManifest": "In this example, the imageManifest in the output JSON has been truncated."
+ }
+ },
+ "description": "This example force deletes a repository named ubuntu in the default registry for an account. The force parameter is required if the repository contains images.",
+ "id": "deleterepository-example-1470863805703",
+ "title": "To force delete a repository"
+ }
+ ],
+ "DeleteRepositoryPolicy": [
+ {
+ "input": {
+ "repositoryName": "ubuntu"
+ },
+ "output": {
+ "policyText": "{ ... }",
+ "registryId": "012345678901",
+ "repositoryName": "ubuntu"
+ },
+ "comments": {
+ },
+ "description": "This example deletes the policy associated with the repository named ubuntu in the current account.",
+ "id": "deleterepositorypolicy-example-1470866943748",
+ "title": "To delete the policy associated with a repository"
+ }
+ ],
+ "DescribeRepositories": [
+ {
+ "input": {
+ },
+ "output": {
+ "repositories": [
+ {
+ "registryId": "012345678910",
+ "repositoryArn": "arn:aws:ecr:us-west-2:012345678910:repository/ubuntu",
+ "repositoryName": "ubuntu"
+ },
+ {
+ "registryId": "012345678910",
+ "repositoryArn": "arn:aws:ecr:us-west-2:012345678910:repository/test",
+ "repositoryName": "test"
+ }
+ ]
+ },
+ "comments": {
+ "output": {
+ }
+ },
+ "description": "The following example obtains a list and description of all repositories in the default registry to which the current user has access.",
+ "id": "describe-repositories-1470856017467",
+ "title": "To describe all repositories in the current account"
+ }
+ ],
+ "GetRepositoryPolicy": [
+ {
+ "input": {
+ "repositoryName": "ubuntu"
+ },
+ "output": {
+ "policyText": "{\n \"Version\" : \"2008-10-17\",\n \"Statement\" : [ {\n \"Sid\" : \"new statement\",\n \"Effect\" : \"Allow\",\n \"Principal\" : {\n \"AWS\" : \"arn:aws:iam::012345678901:role/CodeDeployDemo\"\n },\n\"Action\" : [ \"ecr:GetDownloadUrlForLayer\", \"ecr:BatchGetImage\", \"ecr:BatchCheckLayerAvailability\" ]\n } ]\n}",
+ "registryId": "012345678901",
+ "repositoryName": "ubuntu"
+ },
+ "comments": {
+ },
+ "description": "This example obtains the repository policy for the repository named ubuntu.",
+ "id": "getrepositorypolicy-example-1470867669211",
+ "title": "To get the current policy for a repository"
+ }
+ ],
+ "ListImages": [
+ {
+ "input": {
+ "repositoryName": "ubuntu"
+ },
+ "output": {
+ "imageIds": [
+ {
+ "imageDigest": "sha256:764f63476bdff6d83a09ba2a818f0d35757063724a9ac3ba5019c56f74ebf42a",
+ "imageTag": "precise"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "This example lists all of the images in the repository named ubuntu in the default registry in the current account. ",
+ "id": "listimages-example-1470868161594",
+ "title": "To list all images in a repository"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ecr/2015-09-21/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ecr/2015-09-21/paginators-1.json
new file mode 100644
index 00000000..a2161d3c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ecr/2015-09-21/paginators-1.json
@@ -0,0 +1,66 @@
+{
+ "pagination": {
+ "ListImages": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "imageIds"
+ },
+ "DescribeImages": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "imageDetails"
+ },
+ "DescribeRepositories": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "repositories"
+ },
+ "DescribeImageScanFindings": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "non_aggregate_keys": [
+ "registryId",
+ "repositoryName",
+ "imageId",
+ "imageScanStatus",
+ "imageScanFindings"
+ ],
+ "output_token": "nextToken",
+ "result_key": [
+ "imageScanFindings.findings",
+ "imageScanFindings.enhancedFindings"
+ ]
+ },
+ "GetLifecyclePolicyPreview": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "non_aggregate_keys": [
+ "registryId",
+ "repositoryName",
+ "lifecyclePolicyText",
+ "status",
+ "summary"
+ ],
+ "output_token": "nextToken",
+ "result_key": "previewResults"
+ },
+ "DescribePullThroughCacheRules": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "pullThroughCacheRules"
+ },
+ "DescribeRepositoryCreationTemplates": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "non_aggregate_keys": [
+ "registryId"
+ ],
+ "output_token": "nextToken",
+ "result_key": "repositoryCreationTemplates"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ecr/2015-09-21/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ecr/2015-09-21/service-2.json.gz
new file mode 100644
index 00000000..11382c0a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ecr/2015-09-21/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ecr/2015-09-21/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/ecr/2015-09-21/waiters-2.json
new file mode 100644
index 00000000..9ef9608f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ecr/2015-09-21/waiters-2.json
@@ -0,0 +1,45 @@
+{
+ "version": 2,
+ "waiters": {
+ "ImageScanComplete": {
+ "description": "Wait until an image scan is complete and findings can be accessed",
+ "operation": "DescribeImageScanFindings",
+ "delay": 5,
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "imageScanStatus.status",
+ "expected": "COMPLETE"
+ },
+ {
+ "state": "failure",
+ "matcher": "path",
+ "argument": "imageScanStatus.status",
+ "expected": "FAILED"
+ }
+ ]
+ },
+ "LifecyclePolicyPreviewComplete": {
+ "description": "Wait until a lifecycle policy preview request is complete and results can be accessed",
+ "operation": "GetLifecyclePolicyPreview",
+ "delay": 5,
+ "maxAttempts": 20,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "status",
+ "expected": "COMPLETE"
+ },
+ {
+ "state": "failure",
+ "matcher": "path",
+ "argument": "status",
+ "expected": "FAILED"
+ }
+ ]
+ }
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ecs/2014-11-13/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ecs/2014-11-13/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..1a61841b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ecs/2014-11-13/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ecs/2014-11-13/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ecs/2014-11-13/examples-1.json
new file mode 100644
index 00000000..0fbf7b36
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ecs/2014-11-13/examples-1.json
@@ -0,0 +1,1137 @@
+{
+ "version": "1.0",
+ "examples": {
+ "CreateCluster": [
+ {
+ "input": {
+ "clusterName": "my_cluster"
+ },
+ "output": {
+ "cluster": {
+ "activeServicesCount": 0,
+ "clusterArn": "arn:aws:ecs:us-east-1:012345678910:cluster/my_cluster",
+ "clusterName": "my_cluster",
+ "pendingTasksCount": 0,
+ "registeredContainerInstancesCount": 0,
+ "runningTasksCount": 0,
+ "status": "ACTIVE"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a cluster in your default region.",
+ "id": "to-create-a-new-cluster-1472514079365",
+ "title": "To create a new cluster"
+ }
+ ],
+ "CreateService": [
+ {
+ "input": {
+ "desiredCount": 10,
+ "serviceName": "ecs-simple-service",
+ "taskDefinition": "hello_world"
+ },
+ "output": {
+ "service": {
+ "clusterArn": "arn:aws:ecs:us-east-1:012345678910:cluster/default",
+ "createdAt": "2016-08-29T16:13:47.298Z",
+ "deploymentConfiguration": {
+ "maximumPercent": 200,
+ "minimumHealthyPercent": 100
+ },
+ "deployments": [
+ {
+ "createdAt": "2016-08-29T16:13:47.298Z",
+ "desiredCount": 10,
+ "id": "ecs-svc/9223370564342348388",
+ "pendingCount": 0,
+ "runningCount": 0,
+ "status": "PRIMARY",
+ "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6",
+ "updatedAt": "2016-08-29T16:13:47.298Z"
+ },
+ {
+ "createdAt": "2016-08-29T15:52:44.481Z",
+ "desiredCount": 0,
+ "id": "ecs-svc/9223370564343611322",
+ "pendingCount": 0,
+ "runningCount": 0,
+ "status": "ACTIVE",
+ "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6",
+ "updatedAt": "2016-08-29T16:11:38.941Z"
+ }
+ ],
+ "desiredCount": 10,
+ "events": [
+
+ ],
+ "loadBalancers": [
+
+ ],
+ "pendingCount": 0,
+ "runningCount": 0,
+ "serviceArn": "arn:aws:ecs:us-east-1:012345678910:service/ecs-simple-service",
+ "serviceName": "ecs-simple-service",
+ "status": "ACTIVE",
+ "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a service in your default region called ``ecs-simple-service``. The service uses the ``hello_world`` task definition and it maintains 10 copies of that task.",
+ "id": "to-create-a-new-service-1472512584282",
+ "title": "To create a new service"
+ },
+ {
+ "input": {
+ "desiredCount": 10,
+ "loadBalancers": [
+ {
+ "containerName": "simple-app",
+ "containerPort": 80,
+ "loadBalancerName": "EC2Contai-EcsElast-15DCDAURT3ZO2"
+ }
+ ],
+ "role": "ecsServiceRole",
+ "serviceName": "ecs-simple-service-elb",
+ "taskDefinition": "console-sample-app-static"
+ },
+ "output": {
+ "service": {
+ "clusterArn": "arn:aws:ecs:us-east-1:012345678910:cluster/default",
+ "createdAt": "2016-08-29T16:02:54.884Z",
+ "deploymentConfiguration": {
+ "maximumPercent": 200,
+ "minimumHealthyPercent": 100
+ },
+ "deployments": [
+ {
+ "createdAt": "2016-08-29T16:02:54.884Z",
+ "desiredCount": 10,
+ "id": "ecs-svc/9223370564343000923",
+ "pendingCount": 0,
+ "runningCount": 0,
+ "status": "PRIMARY",
+ "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/console-sample-app-static:6",
+ "updatedAt": "2016-08-29T16:02:54.884Z"
+ }
+ ],
+ "desiredCount": 10,
+ "events": [
+
+ ],
+ "loadBalancers": [
+ {
+ "containerName": "simple-app",
+ "containerPort": 80,
+ "loadBalancerName": "EC2Contai-EcsElast-15DCDAURT3ZO2"
+ }
+ ],
+ "pendingCount": 0,
+ "roleArn": "arn:aws:iam::012345678910:role/ecsServiceRole",
+ "runningCount": 0,
+ "serviceArn": "arn:aws:ecs:us-east-1:012345678910:service/ecs-simple-service-elb",
+ "serviceName": "ecs-simple-service-elb",
+ "status": "ACTIVE",
+ "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/console-sample-app-static:6"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a service in your default region called ``ecs-simple-service-elb``. The service uses the ``ecs-demo`` task definition and it maintains 10 copies of that task. You must reference an existing load balancer in the same region by its name.",
+ "id": "to-create-a-new-service-behind-a-load-balancer-1472512484823",
+ "title": "To create a new service behind a load balancer"
+ }
+ ],
+ "DeleteAccountSetting": [
+ {
+ "input": {
+ "name": "serviceLongArnFormat"
+ },
+ "output": {
+ "setting": {
+ "name": "serviceLongArnFormat",
+ "value": "enabled",
+ "principalArn": "arn:aws:iam::<aws_account_id>:user/principalName"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the account setting for your user for the specified resource type.",
+ "id": "to-delete-the-account-setting-for-your-user-account-1549524548115",
+ "title": "To delete your account setting"
+ },
+ {
+ "input": {
+ "name": "containerInstanceLongArnFormat",
+ "principalArn": "arn:aws:iam::<aws_account_id>:user/principalName"
+ },
+ "output": {
+ "setting": {
+ "name": "containerInstanceLongArnFormat",
+ "value": "enabled",
+ "principalArn": "arn:aws:iam::<aws_account_id>:user/principalName"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the account setting for a specific IAM user or IAM role for the specified resource type. Only the root user can view or modify the account settings for another user.",
+ "id": "to-delete-the-account-setting-for-a-specific-iam-user-or-iam-role-1549524612917",
+ "title": "To delete the account settings for a specific IAM user or IAM role"
+ }
+ ],
+ "DeleteCluster": [
+ {
+ "input": {
+ "cluster": "my_cluster"
+ },
+ "output": {
+ "cluster": {
+ "activeServicesCount": 0,
+ "clusterArn": "arn:aws:ecs:us-east-1:012345678910:cluster/my_cluster",
+ "clusterName": "my_cluster",
+ "pendingTasksCount": 0,
+ "registeredContainerInstancesCount": 0,
+ "runningTasksCount": 0,
+ "status": "INACTIVE"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes an empty cluster in your default region.",
+ "id": "to-delete-an-empty-cluster-1472512705352",
+ "title": "To delete an empty cluster"
+ }
+ ],
+ "DeleteService": [
+ {
+ "input": {
+ "service": "my-http-service"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the my-http-service service. The service must have a desired count and running count of 0 before you can delete it.",
+ "id": "e8183e38-f86e-4390-b811-f74f30a6007d",
+ "title": "To delete a service"
+ }
+ ],
+ "DeregisterContainerInstance": [
+ {
+ "input": {
+ "cluster": "default",
+ "containerInstance": "container_instance_UUID",
+ "force": true
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deregisters a container instance from the specified cluster in your default region. If there are still tasks running on the container instance, you must either stop those tasks before deregistering, or use the force option.",
+ "id": "bf624927-cf64-4f4b-8b7e-c024a4e682f6",
+ "title": "To deregister a container instance from a cluster"
+ }
+ ],
+ "DescribeClusters": [
+ {
+ "input": {
+ "clusters": [
+ "default"
+ ]
+ },
+ "output": {
+ "clusters": [
+ {
+ "clusterArn": "arn:aws:ecs:us-east-1:aws_account_id:cluster/default",
+ "clusterName": "default",
+ "status": "ACTIVE"
+ }
+ ],
+ "failures": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example provides a description of the specified cluster in your default region.",
+ "id": "ba88d100-9672-4231-80da-a4bd210bf728",
+ "title": "To describe a cluster"
+ }
+ ],
+ "DescribeContainerInstances": [
+ {
+ "input": {
+ "cluster": "default",
+ "containerInstances": [
+ "f2756532-8f13-4d53-87c9-aed50dc94cd7"
+ ]
+ },
+ "output": {
+ "containerInstances": [
+ {
+ "agentConnected": true,
+ "containerInstanceArn": "arn:aws:ecs:us-east-1:012345678910:container-instance/f2756532-8f13-4d53-87c9-aed50dc94cd7",
+ "ec2InstanceId": "i-807f3249",
+ "pendingTasksCount": 0,
+ "registeredResources": [
+ {
+ "name": "CPU",
+ "type": "INTEGER",
+ "doubleValue": 0.0,
+ "integerValue": 2048,
+ "longValue": 0
+ },
+ {
+ "name": "MEMORY",
+ "type": "INTEGER",
+ "doubleValue": 0.0,
+ "integerValue": 3768,
+ "longValue": 0
+ },
+ {
+ "name": "PORTS",
+ "type": "STRINGSET",
+ "doubleValue": 0.0,
+ "integerValue": 0,
+ "longValue": 0,
+ "stringSetValue": [
+ "2376",
+ "22",
+ "51678",
+ "2375"
+ ]
+ }
+ ],
+ "remainingResources": [
+ {
+ "name": "CPU",
+ "type": "INTEGER",
+ "doubleValue": 0.0,
+ "integerValue": 1948,
+ "longValue": 0
+ },
+ {
+ "name": "MEMORY",
+ "type": "INTEGER",
+ "doubleValue": 0.0,
+ "integerValue": 3668,
+ "longValue": 0
+ },
+ {
+ "name": "PORTS",
+ "type": "STRINGSET",
+ "doubleValue": 0.0,
+ "integerValue": 0,
+ "longValue": 0,
+ "stringSetValue": [
+ "2376",
+ "22",
+ "80",
+ "51678",
+ "2375"
+ ]
+ }
+ ],
+ "runningTasksCount": 1,
+ "status": "ACTIVE"
+ }
+ ],
+ "failures": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example provides a description of the specified container instance in your default region, using the container instance UUID as an identifier.",
+ "id": "c8f439de-eb27-4269-8ca7-2c0a7ba75ab0",
+ "title": "To describe container instance"
+ }
+ ],
+ "DescribeServices": [
+ {
+ "input": {
+ "services": [
+ "ecs-simple-service"
+ ]
+ },
+ "output": {
+ "failures": [
+
+ ],
+ "services": [
+ {
+ "clusterArn": "arn:aws:ecs:us-east-1:012345678910:cluster/default",
+ "createdAt": "2016-08-29T16:25:52.130Z",
+ "deploymentConfiguration": {
+ "maximumPercent": 200,
+ "minimumHealthyPercent": 100
+ },
+ "deployments": [
+ {
+ "createdAt": "2016-08-29T16:25:52.130Z",
+ "desiredCount": 1,
+ "id": "ecs-svc/9223370564341623665",
+ "pendingCount": 0,
+ "runningCount": 0,
+ "status": "PRIMARY",
+ "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6",
+ "updatedAt": "2016-08-29T16:25:52.130Z"
+ }
+ ],
+ "desiredCount": 1,
+ "events": [
+ {
+ "createdAt": "2016-08-29T16:25:58.520Z",
+ "id": "38c285e5-d335-4b68-8b15-e46dedc8e88d",
+ "message": "(service ecs-simple-service) was unable to place a task because no container instance met all of its requirements. The closest matching (container-instance 3f4de1c5-ffdd-4954-af7e-75b4be0c8841) is already using a port required by your task. For more information, see the Troubleshooting section of the Amazon ECS Developer Guide."
+ }
+ ],
+ "loadBalancers": [
+
+ ],
+ "pendingCount": 0,
+ "runningCount": 0,
+ "serviceArn": "arn:aws:ecs:us-east-1:012345678910:service/ecs-simple-service",
+ "serviceName": "ecs-simple-service",
+ "status": "ACTIVE",
+ "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ "services[0].events[0].message": "In this example, there is a service event that shows unavailable cluster resources."
+ }
+ },
+ "description": "This example provides descriptive information about the service named ``ecs-simple-service``.",
+ "id": "to-describe-a-service-1472513256350",
+ "title": "To describe a service"
+ }
+ ],
+ "DescribeTaskDefinition": [
+ {
+ "input": {
+ "taskDefinition": "hello_world:8"
+ },
+ "output": {
+ "taskDefinition": {
+ "containerDefinitions": [
+ {
+ "name": "wordpress",
+ "cpu": 10,
+ "environment": [
+
+ ],
+ "essential": true,
+ "image": "wordpress",
+ "links": [
+ "mysql"
+ ],
+ "memory": 500,
+ "mountPoints": [
+
+ ],
+ "portMappings": [
+ {
+ "containerPort": 80,
+ "hostPort": 80
+ }
+ ],
+ "volumesFrom": [
+
+ ]
+ },
+ {
+ "name": "mysql",
+ "cpu": 10,
+ "environment": [
+ {
+ "name": "MYSQL_ROOT_PASSWORD",
+ "value": "password"
+ }
+ ],
+ "essential": true,
+ "image": "mysql",
+ "memory": 500,
+ "mountPoints": [
+
+ ],
+ "portMappings": [
+
+ ],
+ "volumesFrom": [
+
+ ]
+ }
+ ],
+ "family": "hello_world",
+ "revision": 8,
+ "taskDefinitionArn": "arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/hello_world:8",
+ "volumes": [
+
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example provides a description of the specified task definition.",
+ "id": "4c21eeb1-f1da-4a08-8c44-297fc8d0ea88",
+ "title": "To describe a task definition"
+ }
+ ],
+ "DescribeTasks": [
+ {
+ "input": {
+ "tasks": [
+ "c5cba4eb-5dad-405e-96db-71ef8eefe6a8"
+ ]
+ },
+ "output": {
+ "failures": [
+
+ ],
+ "tasks": [
+ {
+ "clusterArn": "arn:aws:ecs:<region>:<aws_account_id>:cluster/default",
+ "containerInstanceArn": "arn:aws:ecs:<region>:<aws_account_id>:container-instance/18f9eda5-27d7-4c19-b133-45adc516e8fb",
+ "containers": [
+ {
+ "name": "ecs-demo",
+ "containerArn": "arn:aws:ecs:<region>:<aws_account_id>:container/7c01765b-c588-45b3-8290-4ba38bd6c5a6",
+ "lastStatus": "RUNNING",
+ "networkBindings": [
+ {
+ "bindIP": "0.0.0.0",
+ "containerPort": 80,
+ "hostPort": 80
+ }
+ ],
+ "taskArn": "arn:aws:ecs:<region>:<aws_account_id>:task/c5cba4eb-5dad-405e-96db-71ef8eefe6a8"
+ }
+ ],
+ "desiredStatus": "RUNNING",
+ "lastStatus": "RUNNING",
+ "overrides": {
+ "containerOverrides": [
+ {
+ "name": "ecs-demo"
+ }
+ ]
+ },
+ "startedBy": "ecs-svc/9223370608528463088",
+ "taskArn": "arn:aws:ecs:<region>:<aws_account_id>:task/c5cba4eb-5dad-405e-96db-71ef8eefe6a8",
+ "taskDefinitionArn": "arn:aws:ecs:<region>:<aws_account_id>:task-definition/amazon-ecs-sample:1"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example provides a description of the specified task, using the task UUID as an identifier.",
+ "id": "a90b0cde-f965-4946-b55e-cfd8cc54e827",
+ "title": "To describe a task"
+ }
+ ],
+ "ListAccountSettings": [
+ {
+ "input": {
+ "effectiveSettings": true
+ },
+ "output": {
+ "settings": [
+ {
+ "name": "containerInstanceLongArnFormat",
+ "value": "disabled",
+ "principalArn": "arn:aws:iam::<aws_account_id>:user/principalName"
+ },
+ {
+ "name": "serviceLongArnFormat",
+ "value": "enabled",
+ "principalArn": "arn:aws:iam::<aws_account_id>:user/principalName"
+ },
+ {
+ "name": "taskLongArnFormat",
+ "value": "disabled",
+ "principalArn": "arn:aws:iam::<aws_account_id>:user/principalName"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example displays the effective account settings for your account.",
+ "id": "to-view-your-account-settings-1549524118170",
+ "title": "To view your effective account settings"
+ },
+ {
+ "input": {
+ "effectiveSettings": true,
+ "principalArn": "arn:aws:iam::<aws_account_id>:user/principalName"
+ },
+ "output": {
+ "settings": [
+ {
+ "name": "containerInstanceLongArnFormat",
+ "value": "disabled",
+ "principalArn": "arn:aws:iam::<aws_account_id>:user/principalName"
+ },
+ {
+ "name": "serviceLongArnFormat",
+ "value": "enabled",
+ "principalArn": "arn:aws:iam::<aws_account_id>:user/principalName"
+ },
+ {
+ "name": "taskLongArnFormat",
+ "value": "disabled",
+ "principalArn": "arn:aws:iam::<aws_account_id>:user/principalName"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example displays the effective account settings for the specified user or role.",
+ "id": "to-view-the-account-settings-for-a-specific-iam-user-or-iam-role-1549524237932",
+ "title": "To view the effective account settings for a specific IAM user or IAM role"
+ }
+ ],
+ "ListClusters": [
+ {
+ "input": {
+ },
+ "output": {
+ "clusterArns": [
+ "arn:aws:ecs:us-east-1:<aws_account_id>:cluster/test",
+ "arn:aws:ecs:us-east-1:<aws_account_id>:cluster/default"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists all of your available clusters in your default region.",
+ "id": "e337d059-134f-4125-ba8e-4f499139facf",
+ "title": "To list your available clusters"
+ }
+ ],
+ "ListContainerInstances": [
+ {
+ "input": {
+ "cluster": "default"
+ },
+ "output": {
+ "containerInstanceArns": [
+ "arn:aws:ecs:us-east-1:<aws_account_id>:container-instance/f6bbb147-5370-4ace-8c73-c7181ded911f",
+ "arn:aws:ecs:us-east-1:<aws_account_id>:container-instance/ffe3d344-77e2-476c-a4d0-bf560ad50acb"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists all of your available container instances in the specified cluster in your default region.",
+ "id": "62a82a94-713c-4e18-8420-1d2b2ba9d484",
+ "title": "To list your available container instances in a cluster"
+ }
+ ],
+ "ListServices": [
+ {
+ "input": {
+ },
+ "output": {
+ "serviceArns": [
+ "arn:aws:ecs:us-east-1:012345678910:service/my-http-service"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists the services running in the default cluster for an account.",
+ "id": "1d9a8037-4e0e-4234-a528-609656809a3a",
+ "title": "To list the services in a cluster"
+ }
+ ],
+ "ListTagsForResource": [
+ {
+ "input": {
+ "resourceArn": "arn:aws:ecs:region:aws_account_id:cluster/dev"
+ },
+ "output": {
+ "tags": [
+ {
+ "key": "team",
+ "value": "dev"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists the tags for the 'dev' cluster.",
+ "id": "to-list-the-tags-for-a-cluster-1540582700259",
+ "title": "To list the tags for a cluster."
+ }
+ ],
+ "ListTaskDefinitionFamilies": [
+ {
+ "input": {
+ },
+ "output": {
+ "families": [
+ "node-js-app",
+ "web-timer",
+ "hpcc",
+ "hpcc-c4-8xlarge"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists all of your registered task definition families.",
+ "id": "b5c89769-1d94-4ca2-a79e-8069103c7f75",
+ "title": "To list your registered task definition families"
+ },
+ {
+ "input": {
+ "familyPrefix": "hpcc"
+ },
+ "output": {
+ "families": [
+ "hpcc",
+ "hpcc-c4-8xlarge"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists the task definition revisions that start with \"hpcc\".",
+ "id": "8a4cf9a6-42c1-4fe3-852d-99ac8968e11b",
+ "title": "To filter your registered task definition families"
+ }
+ ],
+ "ListTaskDefinitions": [
+ {
+ "input": {
+ },
+ "output": {
+ "taskDefinitionArns": [
+ "arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/sleep300:2",
+ "arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/sleep360:1",
+ "arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/wordpress:3",
+ "arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/wordpress:4",
+ "arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/wordpress:5",
+ "arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/wordpress:6"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists all of your registered task definitions.",
+ "id": "b381ebaf-7eba-4d60-b99b-7f6ae49d3d60",
+ "title": "To list your registered task definitions"
+ },
+ {
+ "input": {
+ "familyPrefix": "wordpress"
+ },
+ "output": {
+ "taskDefinitionArns": [
+ "arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/wordpress:3",
+ "arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/wordpress:4",
+ "arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/wordpress:5",
+ "arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/wordpress:6"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists the task definition revisions of a specified family.",
+ "id": "734e7afd-753a-4bc2-85d0-badddce10910",
+ "title": "To list the registered task definitions in a family"
+ }
+ ],
+ "ListTasks": [
+ {
+ "input": {
+ "cluster": "default"
+ },
+ "output": {
+ "taskArns": [
+ "arn:aws:ecs:us-east-1:012345678910:task/0cc43cdb-3bee-4407-9c26-c0e6ea5bee84",
+ "arn:aws:ecs:us-east-1:012345678910:task/6b809ef6-c67e-4467-921f-ee261c15a0a1"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists all of the tasks in a cluster.",
+ "id": "9a6ec707-1a77-45d0-b2eb-516b5dd9e924",
+ "title": "To list the tasks in a cluster"
+ },
+ {
+ "input": {
+ "cluster": "default",
+ "containerInstance": "f6bbb147-5370-4ace-8c73-c7181ded911f"
+ },
+ "output": {
+ "taskArns": [
+ "arn:aws:ecs:us-east-1:012345678910:task/0cc43cdb-3bee-4407-9c26-c0e6ea5bee84"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists the tasks of a specified container instance. Specifying a ``containerInstance`` value limits the results to tasks that belong to that container instance.",
+ "id": "024bf3b7-9cbb-44e3-848f-9d074e1fecce",
+ "title": "To list the tasks on a particular container instance"
+ }
+ ],
+ "PutAccountSetting": [
+ {
+ "input": {
+ "name": "serviceLongArnFormat",
+ "value": "enabled"
+ },
+ "output": {
+ "setting": {
+ "name": "serviceLongArnFormat",
+ "value": "enabled",
+ "principalArn": "arn:aws:iam::<aws_account_id>:user/principalName"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies your account settings to opt in to the new ARN and resource ID format for Amazon ECS services. If you’re using this command as the root user, then changes apply to the entire AWS account, unless an IAM user or role explicitly overrides these settings for themselves.",
+ "id": "to-modify-the-account-settings-for-your-iam-user-account-1549523130939",
+ "title": "To modify your account settings"
+ },
+ {
+ "input": {
+ "name": "containerInstanceLongArnFormat",
+ "value": "enabled",
+ "principalArn": "arn:aws:iam::<aws_account_id>:user/principalName"
+ },
+ "output": {
+ "setting": {
+ "name": "containerInstanceLongArnFormat",
+ "value": "enabled",
+ "principalArn": "arn:aws:iam::<aws_account_id>:user/principalName"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies the account setting for a specific IAM user or IAM role to opt in to the new ARN and resource ID format for Amazon ECS container instances. If you’re using this command as the root user, then changes apply to the entire AWS account, unless an IAM user or role explicitly overrides these settings for themselves.",
+ "id": "to-modify-the-account-settings-for-a-specific-iam-user-or-iam-role-1549523518390",
+ "title": "To modify the account settings for a specific IAM user or IAM role"
+ }
+ ],
+ "PutAccountSettingDefault": [
+ {
+ "input": {
+ "name": "serviceLongArnFormat",
+ "value": "enabled"
+ },
+ "output": {
+ "setting": {
+ "name": "serviceLongArnFormat",
+ "value": "enabled",
+ "principalArn": "arn:aws:iam::<aws_account_id>:root"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies the default account setting for the specified resource for all IAM users or roles on an account. These changes apply to the entire AWS account, unless an IAM user or role explicitly overrides these settings for themselves.",
+ "id": "to-modify-the-default-account-settings-for-all-iam-users-or-roles-on-your-account-1549523794603",
+ "title": "To modify the default account settings for all IAM users or roles on an account"
+ }
+ ],
+ "RegisterTaskDefinition": [
+ {
+ "input": {
+ "containerDefinitions": [
+ {
+ "name": "sleep",
+ "command": [
+ "sleep",
+ "360"
+ ],
+ "cpu": 10,
+ "essential": true,
+ "image": "busybox",
+ "memory": 10
+ }
+ ],
+ "family": "sleep360",
+ "taskRoleArn": "",
+ "volumes": [
+
+ ]
+ },
+ "output": {
+ "taskDefinition": {
+ "containerDefinitions": [
+ {
+ "name": "sleep",
+ "command": [
+ "sleep",
+ "360"
+ ],
+ "cpu": 10,
+ "environment": [
+
+ ],
+ "essential": true,
+ "image": "busybox",
+ "memory": 10,
+ "mountPoints": [
+
+ ],
+ "portMappings": [
+
+ ],
+ "volumesFrom": [
+
+ ]
+ }
+ ],
+ "family": "sleep360",
+ "revision": 1,
+ "taskDefinitionArn": "arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/sleep360:19",
+ "volumes": [
+
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example registers a task definition to the specified family.",
+ "id": "to-register-a-task-definition-1470764550877",
+ "title": "To register a task definition"
+ }
+ ],
+ "RunTask": [
+ {
+ "input": {
+ "cluster": "default",
+ "taskDefinition": "sleep360:1"
+ },
+ "output": {
+ "tasks": [
+ {
+ "containerInstanceArn": "arn:aws:ecs:us-east-1:<aws_account_id>:container-instance/ffe3d344-77e2-476c-a4d0-bf560ad50acb",
+ "containers": [
+ {
+ "name": "sleep",
+ "containerArn": "arn:aws:ecs:us-east-1:<aws_account_id>:container/58591c8e-be29-4ddf-95aa-ee459d4c59fd",
+ "lastStatus": "PENDING",
+ "taskArn": "arn:aws:ecs:us-east-1:<aws_account_id>:task/a9f21ea7-c9f5-44b1-b8e6-b31f50ed33c0"
+ }
+ ],
+ "desiredStatus": "RUNNING",
+ "lastStatus": "PENDING",
+ "overrides": {
+ "containerOverrides": [
+ {
+ "name": "sleep"
+ }
+ ]
+ },
+ "taskArn": "arn:aws:ecs:us-east-1:<aws_account_id>:task/a9f21ea7-c9f5-44b1-b8e6-b31f50ed33c0",
+ "taskDefinitionArn": "arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/sleep360:1"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example runs the specified task definition on your default cluster.",
+ "id": "6f238c83-a133-42cd-ab3d-abeca0560445",
+ "title": "To run a task on your default cluster"
+ }
+ ],
+ "TagResource": [
+ {
+ "input": {
+ "resourceArn": "arn:aws:ecs:region:aws_account_id:cluster/dev",
+ "tags": [
+ {
+ "key": "team",
+ "value": "dev"
+ }
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example tags the 'dev' cluster with key 'team' and value 'dev'.",
+ "id": "to-tag-a-cluster-1540581863751",
+ "title": "To tag a cluster."
+ }
+ ],
+ "UntagResource": [
+ {
+ "input": {
+ "resourceArn": "arn:aws:ecs:region:aws_account_id:cluster/dev",
+ "tagKeys": [
+ "team"
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the 'team' tag from the 'dev' cluster.",
+ "id": "to-untag-a-cluster-1540582546056",
+ "title": "To untag a cluster."
+ }
+ ],
+ "UpdateService": [
+ {
+ "input": {
+ "service": "my-http-service",
+ "taskDefinition": "amazon-ecs-sample"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example updates the my-http-service service to use the amazon-ecs-sample task definition.",
+ "id": "cc9e8900-0cc2-44d2-8491-64d1d3d37887",
+ "title": "To change the task definition used in a service"
+ },
+ {
+ "input": {
+ "desiredCount": 10,
+ "service": "my-http-service"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example updates the desired count of the my-http-service service to 10.",
+ "id": "9581d6c5-02e3-4140-8cc1-5a4301586633",
+ "title": "To change the number of tasks in a service"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ecs/2014-11-13/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ecs/2014-11-13/paginators-1.json
new file mode 100644
index 00000000..cd66d4ab
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ecs/2014-11-13/paginators-1.json
@@ -0,0 +1,58 @@
+{
+ "pagination": {
+ "ListClusters": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "clusterArns"
+ },
+ "ListContainerInstances": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "containerInstanceArns"
+ },
+ "ListTaskDefinitions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "taskDefinitionArns"
+ },
+ "ListTaskDefinitionFamilies": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "families"
+ },
+ "ListTasks": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "taskArns"
+ },
+ "ListServices": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "serviceArns"
+ },
+ "ListAccountSettings": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "settings"
+ },
+ "ListAttributes": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "attributes"
+ },
+ "ListServicesByNamespace": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "serviceArns"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ecs/2014-11-13/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ecs/2014-11-13/service-2.json.gz
new file mode 100644
index 00000000..8ad8bb8a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ecs/2014-11-13/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ecs/2014-11-13/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/ecs/2014-11-13/waiters-2.json
new file mode 100644
index 00000000..8a0b19d8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ecs/2014-11-13/waiters-2.json
@@ -0,0 +1,93 @@
+{
+ "version": 2,
+ "waiters": {
+ "TasksRunning": {
+ "delay": 6,
+ "operation": "DescribeTasks",
+ "maxAttempts": 100,
+ "acceptors": [
+ {
+ "expected": "STOPPED",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "tasks[].lastStatus"
+ },
+ {
+ "expected": "MISSING",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "failures[].reason"
+ },
+ {
+ "expected": "RUNNING",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "tasks[].lastStatus"
+ }
+ ]
+ },
+ "TasksStopped": {
+ "delay": 6,
+ "operation": "DescribeTasks",
+ "maxAttempts": 100,
+ "acceptors": [
+ {
+ "expected": "STOPPED",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "tasks[].lastStatus"
+ }
+ ]
+ },
+ "ServicesStable": {
+ "delay": 15,
+ "operation": "DescribeServices",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "MISSING",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "failures[].reason"
+ },
+ {
+ "expected": "DRAINING",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "services[].status"
+ },
+ {
+ "expected": "INACTIVE",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "services[].status"
+ },
+ {
+ "expected": true,
+ "matcher": "path",
+ "state": "success",
+ "argument": "length(services[?!(length(deployments) == `1` && runningCount == desiredCount)]) == `0`"
+ }
+ ]
+ },
+ "ServicesInactive": {
+ "delay": 15,
+ "operation": "DescribeServices",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "MISSING",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "failures[].reason"
+ },
+ {
+ "expected": "INACTIVE",
+ "matcher": "pathAny",
+ "state": "success",
+ "argument": "services[].status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/efs/2015-02-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/efs/2015-02-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..0eba8fe3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/efs/2015-02-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/efs/2015-02-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/efs/2015-02-01/examples-1.json
new file mode 100644
index 00000000..f3c75b34
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/efs/2015-02-01/examples-1.json
@@ -0,0 +1,294 @@
+{
+ "version": "1.0",
+ "examples": {
+ "CreateFileSystem": [
+ {
+ "input": {
+ "Backup": true,
+ "CreationToken": "tokenstring",
+ "Encrypted": true,
+ "PerformanceMode": "generalPurpose",
+ "Tags": [
+ {
+ "Key": "Name",
+ "Value": "MyFileSystem"
+ }
+ ]
+ },
+ "output": {
+ "CreationTime": "1481841524.0",
+ "CreationToken": "tokenstring",
+ "Encrypted": true,
+ "FileSystemId": "fs-01234567",
+ "LifeCycleState": "creating",
+ "NumberOfMountTargets": 0,
+ "OwnerId": "012345678912",
+ "PerformanceMode": "generalPurpose",
+ "SizeInBytes": {
+ "Value": 0
+ },
+ "Tags": [
+ {
+ "Key": "Name",
+ "Value": "MyFileSystem"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation creates a new, encrypted file system with automatic backups enabled, and the default generalpurpose performance mode.",
+ "id": "to-create-a-new-file-system-1481840798547",
+ "title": "To create a new file system"
+ }
+ ],
+ "CreateMountTarget": [
+ {
+ "input": {
+ "FileSystemId": "fs-01234567",
+ "SubnetId": "subnet-1234abcd"
+ },
+ "output": {
+ "FileSystemId": "fs-01234567",
+ "IpAddress": "192.0.0.2",
+ "LifeCycleState": "creating",
+ "MountTargetId": "fsmt-12340abc",
+ "NetworkInterfaceId": "eni-cedf6789",
+ "OwnerId": "012345678912",
+ "SubnetId": "subnet-1234abcd"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation creates a new mount target for an EFS file system.",
+ "id": "to-create-a-new-mount-target-1481842289329",
+ "title": "To create a new mount target"
+ }
+ ],
+ "CreateTags": [
+ {
+ "input": {
+ "FileSystemId": "fs-01234567",
+ "Tags": [
+ {
+ "Key": "Name",
+ "Value": "MyFileSystem"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "This operation creates a new tag for an EFS file system.",
+ "id": "to-create-a-new-tag-1481843409357",
+ "title": "To create a new tag"
+ }
+ ],
+ "DeleteFileSystem": [
+ {
+ "input": {
+ "FileSystemId": "fs-01234567"
+ },
+ "comments": {
+ },
+ "description": "This operation deletes an EFS file system.",
+ "id": "to-delete-a-file-system-1481847318348",
+ "title": "To delete a file system"
+ }
+ ],
+ "DeleteMountTarget": [
+ {
+ "input": {
+ "MountTargetId": "fsmt-12340abc"
+ },
+ "comments": {
+ },
+ "description": "This operation deletes a mount target.",
+ "id": "to-delete-a-mount-target-1481847635607",
+ "title": "To delete a mount target"
+ }
+ ],
+ "DeleteTags": [
+ {
+ "input": {
+ "FileSystemId": "fs-01234567",
+ "TagKeys": [
+ "Name"
+ ]
+ },
+ "comments": {
+ },
+ "description": "This operation deletes tags for an EFS file system.",
+ "id": "to-delete-tags-for-an-efs-file-system-1481848189061",
+ "title": "To delete tags for an EFS file system"
+ }
+ ],
+ "DescribeFileSystems": [
+ {
+ "input": {
+ },
+ "output": {
+ "FileSystems": [
+ {
+ "CreationTime": "1481841524.0",
+ "CreationToken": "tokenstring",
+ "FileSystemId": "fs-01234567",
+ "LifeCycleState": "available",
+ "Name": "MyFileSystem",
+ "NumberOfMountTargets": 1,
+ "OwnerId": "012345678912",
+ "PerformanceMode": "generalPurpose",
+ "SizeInBytes": {
+ "Value": 6144
+ },
+ "Tags": [
+ {
+ "Key": "Name",
+ "Value": "MyFileSystem"
+ }
+ ]
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "This operation describes all of the EFS file systems in an account.",
+ "id": "to-describe-an-efs-file-system-1481848448460",
+ "title": "To describe an EFS file system"
+ }
+ ],
+ "DescribeLifecycleConfiguration": [
+ {
+ "input": {
+ "FileSystemId": "fs-01234567"
+ },
+ "output": {
+ "LifecyclePolicies": [
+ {
+ "TransitionToIA": "AFTER_30_DAYS"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation describes a file system's LifecycleConfiguration. EFS lifecycle management uses the LifecycleConfiguration object to identify which files to move to the EFS Infrequent Access (IA) storage class. ",
+ "id": "to-describe-the-lifecycle-configuration-for-a-file-system-1551200664502",
+ "title": "To describe the lifecycle configuration for a file system"
+ }
+ ],
+ "DescribeMountTargetSecurityGroups": [
+ {
+ "input": {
+ "MountTargetId": "fsmt-12340abc"
+ },
+ "output": {
+ "SecurityGroups": [
+ "sg-4567abcd"
+ ]
+ },
+ "comments": {
+ },
+ "description": "This operation describes all of the security groups for a file system's mount target.",
+ "id": "to-describe-the-security-groups-for-a-mount-target-1481849317823",
+ "title": "To describe the security groups for a mount target"
+ }
+ ],
+ "DescribeMountTargets": [
+ {
+ "input": {
+ "FileSystemId": "fs-01234567"
+ },
+ "output": {
+ "MountTargets": [
+ {
+ "FileSystemId": "fs-01234567",
+ "IpAddress": "192.0.0.2",
+ "LifeCycleState": "available",
+ "MountTargetId": "fsmt-12340abc",
+ "NetworkInterfaceId": "eni-cedf6789",
+ "OwnerId": "012345678912",
+ "SubnetId": "subnet-1234abcd"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "This operation describes all of a file system's mount targets.",
+ "id": "to-describe-the-mount-targets-for-a-file-system-1481849958584",
+ "title": "To describe the mount targets for a file system"
+ }
+ ],
+ "DescribeTags": [
+ {
+ "input": {
+ "FileSystemId": "fs-01234567"
+ },
+ "output": {
+ "Tags": [
+ {
+ "Key": "Name",
+ "Value": "MyFileSystem"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "This operation describes all of a file system's tags.",
+ "id": "to-describe-the-tags-for-a-file-system-1481850497090",
+ "title": "To describe the tags for a file system"
+ }
+ ],
+ "ModifyMountTargetSecurityGroups": [
+ {
+ "input": {
+ "MountTargetId": "fsmt-12340abc",
+ "SecurityGroups": [
+ "sg-abcd1234"
+ ]
+ },
+ "comments": {
+ },
+ "description": "This operation modifies the security groups associated with a mount target for a file system.",
+ "id": "to-modify-the-security-groups-associated-with-a-mount-target-for-a-file-system-1481850772562",
+ "title": "To modify the security groups associated with a mount target for a file system"
+ }
+ ],
+ "PutLifecycleConfiguration": [
+ {
+ "input": {
+ "FileSystemId": "fs-01234567",
+ "LifecyclePolicies": [
+ {
+ "TransitionToIA": "AFTER_30_DAYS"
+ }
+ ]
+ },
+ "output": {
+ "LifecyclePolicies": [
+ {
+ "TransitionToIA": "AFTER_30_DAYS"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation enables lifecycle management on a file system by creating a new LifecycleConfiguration object. A LifecycleConfiguration object defines when files in an Amazon EFS file system are automatically transitioned to the lower-cost EFS Infrequent Access (IA) storage class. A LifecycleConfiguration applies to all files in a file system.",
+ "id": "creates-a-new-lifecycleconfiguration-object-for-a-file-system-1551201594692",
+ "title": "Creates a new lifecycleconfiguration object for a file system"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/efs/2015-02-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/efs/2015-02-01/paginators-1.json
new file mode 100644
index 00000000..047d3e2f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/efs/2015-02-01/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "DescribeFileSystems": {
+ "input_token": "Marker",
+ "output_token": "NextMarker",
+ "limit_key": "MaxItems",
+ "result_key": "FileSystems"
+ },
+ "DescribeMountTargets": {
+ "input_token": "Marker",
+ "output_token": "NextMarker",
+ "limit_key": "MaxItems",
+ "result_key": "MountTargets"
+ },
+ "DescribeTags": {
+ "input_token": "Marker",
+ "output_token": "NextMarker",
+ "limit_key": "MaxItems",
+ "result_key": "Tags"
+ },
+ "DescribeAccessPoints": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AccessPoints"
+ },
+ "DescribeReplicationConfigurations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Replications"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/efs/2015-02-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/efs/2015-02-01/service-2.json.gz
new file mode 100644
index 00000000..fdfa54a0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/efs/2015-02-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/eks-auth/2023-11-26/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/eks-auth/2023-11-26/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..07bbef79
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/eks-auth/2023-11-26/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/eks-auth/2023-11-26/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/eks-auth/2023-11-26/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/eks-auth/2023-11-26/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/eks-auth/2023-11-26/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/eks-auth/2023-11-26/service-2.json.gz
new file mode 100644
index 00000000..0fd67897
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/eks-auth/2023-11-26/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/eks-auth/2023-11-26/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/eks-auth/2023-11-26/waiters-2.json
new file mode 100644
index 00000000..4b20636a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/eks-auth/2023-11-26/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..ccd3a2fb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/examples-1.json
new file mode 100644
index 00000000..8ea25175
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/examples-1.json
@@ -0,0 +1,135 @@
+{
+ "version": "1.0",
+ "examples": {
+ "CreateCluster": [
+ {
+ "input": {
+ "version": "1.10",
+ "name": "prod",
+ "clientRequestToken": "1d2129a1-3d38-460a-9756-e5b91fddb951",
+ "resourcesVpcConfig": {
+ "securityGroupIds": [
+ "sg-6979fe18"
+ ],
+ "subnetIds": [
+ "subnet-6782e71e",
+ "subnet-e7e761ac"
+ ]
+ },
+ "roleArn": "arn:aws:iam::012345678910:role/eks-service-role-AWSServiceRoleForAmazonEKS-J7ONKE3BQ4PI"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates an Amazon EKS cluster called prod.",
+ "id": "to-create-a-new-cluster-1527868185648",
+ "title": "To create a new cluster"
+ }
+ ],
+ "DeleteCluster": [
+ {
+ "input": {
+ "name": "devel"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example command deletes a cluster named `devel` in your default region.",
+ "id": "to-delete-a-cluster-1527868641252",
+ "title": "To delete a cluster"
+ }
+ ],
+ "DescribeCluster": [
+ {
+ "input": {
+ "name": "devel"
+ },
+ "output": {
+ "cluster": {
+ "version": "1.10",
+ "name": "devel",
+ "arn": "arn:aws:eks:us-west-2:012345678910:cluster/devel",
+ "certificateAuthority": {
+ "data": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRFNE1EVXpNVEl6TVRFek1Wb1hEVEk0TURVeU9ESXpNVEV6TVZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTTZWCjVUaG4rdFcySm9Xa2hQMzRlVUZMNitaRXJOZGIvWVdrTmtDdWNGS2RaaXl2TjlMVmdvUmV2MjlFVFZlN1ZGbSsKUTJ3ZURyRXJiQyt0dVlibkFuN1ZLYmE3ay9hb1BHekZMdmVnb0t6b0M1N2NUdGVwZzRIazRlK2tIWHNaME10MApyb3NzcjhFM1ROeExETnNJTThGL1cwdjhsTGNCbWRPcjQyV2VuTjFHZXJnaDNSZ2wzR3JIazBnNTU0SjFWenJZCm9hTi8zODFUczlOTFF2QTBXb0xIcjBFRlZpTFdSZEoyZ3lXaC9ybDVyOFNDOHZaQXg1YW1BU0hVd01aTFpWRC8KTDBpOW4wRVM0MkpVdzQyQmxHOEdpd3NhTkJWV3lUTHZKclNhRXlDSHFtVVZaUTFDZkFXUjl0L3JleVVOVXM3TApWV1FqM3BFbk9RMitMSWJrc0RzQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFNZ3RsQ1dIQ2U2YzVHMXl2YlFTS0Q4K2hUalkKSm1NSG56L2EvRGt0WG9YUjFVQzIrZUgzT1BZWmVjRVZZZHVaSlZCckNNQ2VWR0ZkeWdBYlNLc1FxWDg0S2RXbAp1MU5QaERDSmEyRHliN2pVMUV6VThTQjFGZUZ5ZFE3a0hNS1E1blpBRVFQOTY4S01hSGUrSm0yQ2x1UFJWbEJVCjF4WlhTS1gzTVZ0K1Q0SU1EV2d6c3JRSjVuQkRjdEtLcUZtM3pKdVVubHo5ZEpVckdscEltMjVJWXJDckxYUFgKWkUwRUtRNWEzMHhkVWNrTHRGQkQrOEtBdFdqSS9yZUZPNzM1YnBMdVoyOTBaNm42QlF3elRrS0p4cnhVc3QvOAppNGsxcnlsaUdWMm5SSjBUYjNORkczNHgrYWdzYTRoSTFPbU90TFM0TmgvRXJxT3lIUXNDc2hEQUtKUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="
+ },
+ "createdAt": 1527807879.988,
+ "endpoint": "https://A0DCCD80A04F01705DD065655C30CC3D.yl4.us-west-2.eks.amazonaws.com",
+ "resourcesVpcConfig": {
+ "securityGroupIds": [
+ "sg-6979fe18"
+ ],
+ "subnetIds": [
+ "subnet-6782e71e",
+ "subnet-e7e761ac"
+ ],
+ "vpcId": "vpc-950809ec"
+ },
+ "roleArn": "arn:aws:iam::012345678910:role/eks-service-role-AWSServiceRoleForAmazonEKS-J7ONKE3BQ4PI",
+ "status": "ACTIVE"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example command provides a description of the specified cluster in your default region.",
+ "id": "to-describe-a-cluster-1527868708512",
+ "title": "To describe a cluster"
+ }
+ ],
+ "ListClusters": [
+ {
+ "input": {
+ },
+ "output": {
+ "clusters": [
+ "devel",
+ "prod"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example command lists all of your available clusters in your default region.",
+ "id": "to-list-your-available-clusters-1527868801040",
+ "title": "To list your available clusters"
+ }
+ ],
+ "ListTagsForResource": [
+ {
+ "input": {
+ "resourceArn": "arn:aws:eks:us-west-2:012345678910:cluster/beta"
+ },
+ "output": {
+ "tags": {
+ "aws:tag:domain": "beta"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists all of the tags for the `beta` cluster.",
+ "id": "to-list-tags-for-a-cluster-1568666903378",
+ "title": "To list tags for a cluster"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/paginators-1.json
new file mode 100644
index 00000000..6be3631f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/paginators-1.json
@@ -0,0 +1,92 @@
+{
+ "pagination": {
+ "ListClusters": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "clusters"
+ },
+ "ListUpdates": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "updateIds"
+ },
+ "ListNodegroups": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "nodegroups"
+ },
+ "ListFargateProfiles": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "fargateProfileNames"
+ },
+ "DescribeAddonVersions": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "addons"
+ },
+ "ListAddons": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "addons"
+ },
+ "ListIdentityProviderConfigs": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "identityProviderConfigs"
+ },
+ "ListEksAnywhereSubscriptions": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "subscriptions"
+ },
+ "ListPodIdentityAssociations": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "associations"
+ },
+ "ListAccessEntries": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "accessEntries"
+ },
+ "ListAccessPolicies": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "accessPolicies"
+ },
+ "ListAssociatedAccessPolicies": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "non_aggregate_keys": [
+ "clusterName",
+ "principalArn"
+ ],
+ "output_token": "nextToken",
+ "result_key": "associatedAccessPolicies"
+ },
+ "ListInsights": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "insights"
+ },
+ "DescribeClusterVersions": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "clusterVersions"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/service-2.json.gz
new file mode 100644
index 00000000..0c48e57a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/service-2.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/service-2.sdk-extras.json
new file mode 100644
index 00000000..b636c211
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/service-2.sdk-extras.json
@@ -0,0 +1,8 @@
+{
+ "version": 1.0,
+ "merge": {
+ "metadata": {
+ "serviceId":"EKS"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/waiters-2.json
new file mode 100644
index 00000000..c0689097
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/eks/2017-11-01/waiters-2.json
@@ -0,0 +1,177 @@
+{
+ "version": 2,
+ "waiters": {
+ "ClusterActive": {
+ "delay": 30,
+ "operation": "DescribeCluster",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "DELETING",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "cluster.status"
+ },
+ {
+ "expected": "FAILED",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "cluster.status"
+ },
+ {
+ "expected": "ACTIVE",
+ "matcher": "path",
+ "state": "success",
+ "argument": "cluster.status"
+ }
+ ]
+ },
+ "ClusterDeleted": {
+ "delay": 30,
+ "operation": "DescribeCluster",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "ACTIVE",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "cluster.status"
+ },
+ {
+ "expected": "CREATING",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "cluster.status"
+ },
+ {
+ "expected": "PENDING",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "cluster.status"
+ },
+ {
+ "expected": "ResourceNotFoundException",
+ "matcher": "error",
+ "state": "success"
+ }
+ ]
+ },
+ "NodegroupActive": {
+ "delay": 30,
+ "operation": "DescribeNodegroup",
+ "maxAttempts": 80,
+ "acceptors": [
+ {
+ "expected": "CREATE_FAILED",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "nodegroup.status"
+ },
+ {
+ "expected": "ACTIVE",
+ "matcher": "path",
+ "state": "success",
+ "argument": "nodegroup.status"
+ }
+ ]
+ },
+ "NodegroupDeleted": {
+ "delay": 30,
+ "operation": "DescribeNodegroup",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "DELETE_FAILED",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "nodegroup.status"
+ },
+ {
+ "expected": "ResourceNotFoundException",
+ "matcher": "error",
+ "state": "success"
+ }
+ ]
+ },
+ "AddonActive": {
+ "delay": 10,
+ "operation": "DescribeAddon",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "CREATE_FAILED",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "addon.status"
+ },
+ {
+ "expected": "DEGRADED",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "addon.status"
+ },
+ {
+ "expected": "ACTIVE",
+ "matcher": "path",
+ "state": "success",
+ "argument": "addon.status"
+ }
+ ]
+ },
+ "AddonDeleted": {
+ "delay": 10,
+ "operation": "DescribeAddon",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "DELETE_FAILED",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "addon.status"
+ },
+ {
+ "expected": "ResourceNotFoundException",
+ "matcher": "error",
+ "state": "success"
+ }
+ ]
+ },
+ "FargateProfileActive": {
+ "delay": 10,
+ "operation": "DescribeFargateProfile",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "CREATE_FAILED",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "fargateProfile.status"
+ },
+ {
+ "expected": "ACTIVE",
+ "matcher": "path",
+ "state": "success",
+ "argument": "fargateProfile.status"
+ }
+ ]
+ },
+ "FargateProfileDeleted": {
+ "delay": 30,
+ "operation": "DescribeFargateProfile",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "DELETE_FAILED",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "fargateProfile.status"
+ },
+ {
+ "expected": "ResourceNotFoundException",
+ "matcher": "error",
+ "state": "success"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2014-09-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2014-09-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..e1d5f821
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2014-09-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2014-09-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2014-09-30/paginators-1.json
new file mode 100644
index 00000000..8724740d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2014-09-30/paginators-1.json
@@ -0,0 +1,76 @@
+{
+ "pagination": {
+ "DescribeCacheClusters": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "CacheClusters"
+ },
+ "DescribeCacheEngineVersions": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "CacheEngineVersions"
+ },
+ "DescribeCacheParameterGroups": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "CacheParameterGroups"
+ },
+ "DescribeCacheParameters": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "Parameters"
+ },
+ "DescribeCacheSecurityGroups": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "CacheSecurityGroups"
+ },
+ "DescribeCacheSubnetGroups": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "CacheSubnetGroups"
+ },
+ "DescribeEngineDefaultParameters": {
+ "input_token": "Marker",
+ "output_token": "EngineDefaults.Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "EngineDefaults.Parameters"
+ },
+ "DescribeEvents": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "Events"
+ },
+ "DescribeReservedCacheNodes": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "ReservedCacheNodes"
+ },
+ "DescribeReservedCacheNodesOfferings": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "ReservedCacheNodesOfferings"
+ },
+ "DescribeReplicationGroups": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "ReplicationGroups"
+ },
+ "DescribeSnapshots": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "Snapshots"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2014-09-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2014-09-30/service-2.json.gz
new file mode 100644
index 00000000..fa4fe06b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2014-09-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2014-09-30/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2014-09-30/waiters-2.json
new file mode 100644
index 00000000..ccb904aa
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2014-09-30/waiters-2.json
@@ -0,0 +1,139 @@
+{
+ "version": 2,
+ "waiters": {
+ "CacheClusterAvailable": {
+ "delay": 30,
+ "operation": "DescribeCacheClusters",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "CacheClusters[].CacheClusterStatus"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CacheClusters[].CacheClusterStatus"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CacheClusters[].CacheClusterStatus"
+ },
+ {
+ "expected": "incompatible-network",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CacheClusters[].CacheClusterStatus"
+ },
+ {
+ "expected": "restore-failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CacheClusters[].CacheClusterStatus"
+ }
+ ]
+ },
+ "CacheClusterDeleted": {
+ "delay": 30,
+ "operation": "DescribeCacheClusters",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "CacheClusterNotFound",
+ "matcher": "error",
+ "state": "success"
+ },
+ {
+ "expected": "creating",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CacheClusters[].CacheClusterStatus"
+ },
+ {
+ "expected": "modifying",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CacheClusters[].CacheClusterStatus"
+ },
+ {
+ "expected": "rebooting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "CacheClusters[].CacheClusterStatus"
+ }
+ ]
+ },
+ "ReplicationGroupAvailable": {
+ "delay": 30,
+ "operation": "DescribeReplicationGroups",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "ReplicationGroups[].Status"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ReplicationGroups[].Status"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ReplicationGroups[].Status"
+ },
+ {
+ "expected": "incompatible-network",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ReplicationGroups[].Status"
+ },
+ {
+ "expected": "restore-failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ReplicationGroups[].Status"
+ }
+ ]
+ },
+ "ReplicationGroupDeleted": {
+ "delay": 30,
+ "operation": "DescribeReplicationGroups",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "ReplicationGroupNotFoundFault",
+ "matcher": "error",
+ "state": "success"
+ },
+ {
+ "expected": "creating",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ReplicationGroups[].Status"
+ },
+ {
+ "expected": "modifying",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ReplicationGroups[].Status"
+ },
+ {
+ "expected": "rebooting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "ReplicationGroups[].Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2015-02-02/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2015-02-02/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..00d5a0f7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2015-02-02/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2015-02-02/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2015-02-02/examples-1.json
new file mode 100644
index 00000000..f1d21bd7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2015-02-02/examples-1.json
@@ -0,0 +1,3149 @@
+{
+ "version": "1.0",
+ "examples": {
+ "AddTagsToResource": [
+ {
+ "input": {
+ "ResourceName": "arn:aws:elasticache:us-east-1:1234567890:cluster:my-mem-cluster",
+ "Tags": [
+ {
+ "Key": "APIVersion",
+ "Value": "20150202"
+ },
+ {
+ "Key": "Service",
+ "Value": "ElastiCache"
+ }
+ ]
+ },
+ "output": {
+ "TagList": [
+ {
+ "Key": "APIVersion",
+ "Value": "20150202"
+ },
+ {
+ "Key": "Service",
+ "Value": "ElastiCache"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Adds up to 10 tags, key/value pairs, to a cluster or snapshot resource.",
+ "id": "addtagstoresource-1482430264385",
+ "title": "AddTagsToResource"
+ }
+ ],
+ "AuthorizeCacheSecurityGroupIngress": [
+ {
+ "input": {
+ "CacheSecurityGroupName": "my-sec-grp",
+ "EC2SecurityGroupName": "my-ec2-sec-grp",
+ "EC2SecurityGroupOwnerId": "1234567890"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Allows network ingress to a cache security group. Applications using ElastiCache must be running on Amazon EC2. Amazon EC2 security groups are used as the authorization mechanism.",
+ "id": "authorizecachecachesecuritygroupingress-1483046446206",
+ "title": "AuthorizeCacheCacheSecurityGroupIngress"
+ }
+ ],
+ "CopySnapshot": [
+ {
+ "input": {
+ "SourceSnapshotName": "my-snapshot",
+ "TargetBucket": "",
+ "TargetSnapshotName": "my-snapshot-copy"
+ },
+ "output": {
+ "Snapshot": {
+ "AutoMinorVersionUpgrade": true,
+ "CacheClusterCreateTime": "2016-12-21T22:24:04.955Z",
+ "CacheClusterId": "my-redis4",
+ "CacheNodeType": "cache.m3.large",
+ "CacheParameterGroupName": "default.redis3.2",
+ "CacheSubnetGroupName": "default",
+ "Engine": "redis",
+ "EngineVersion": "3.2.4",
+ "NodeSnapshots": [
+ {
+ "CacheNodeCreateTime": "2016-12-21T22:24:04.955Z",
+ "CacheNodeId": "0001",
+ "CacheSize": "3 MB",
+ "SnapshotCreateTime": "2016-12-28T07:00:52Z"
+ }
+ ],
+ "NumCacheNodes": 1,
+ "Port": 6379,
+ "PreferredAvailabilityZone": "us-east-1c",
+ "PreferredMaintenanceWindow": "tue:09:30-tue:10:30",
+ "SnapshotName": "my-snapshot-copy",
+ "SnapshotRetentionLimit": 7,
+ "SnapshotSource": "manual",
+ "SnapshotStatus": "creating",
+ "SnapshotWindow": "07:00-08:00",
+ "VpcId": "vpc-3820329f3"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Copies a snapshot to a specified name.",
+ "id": "copysnapshot-1482961393820",
+ "title": "CopySnapshot"
+ }
+ ],
+ "CreateCacheCluster": [
+ {
+ "input": {
+ "AZMode": "cross-az",
+ "CacheClusterId": "my-memcached-cluster",
+ "CacheNodeType": "cache.r3.large",
+ "CacheSubnetGroupName": "default",
+ "Engine": "memcached",
+ "EngineVersion": "1.4.24",
+ "NumCacheNodes": 2,
+ "Port": 11211
+ },
+ "output": {
+ "CacheCluster": {
+ "AutoMinorVersionUpgrade": true,
+ "CacheClusterId": "my-memcached-cluster",
+ "CacheClusterStatus": "creating",
+ "CacheNodeType": "cache.r3.large",
+ "CacheParameterGroup": {
+ "CacheNodeIdsToReboot": [
+
+ ],
+ "CacheParameterGroupName": "default.memcached1.4",
+ "ParameterApplyStatus": "in-sync"
+ },
+ "CacheSecurityGroups": [
+
+ ],
+ "CacheSubnetGroupName": "default",
+ "ClientDownloadLandingPage": "https://console.aws.amazon.com/elasticache/home#client-download:",
+ "Engine": "memcached",
+ "EngineVersion": "1.4.24",
+ "NumCacheNodes": 2,
+ "PendingModifiedValues": {
+ },
+ "PreferredAvailabilityZone": "Multiple",
+ "PreferredMaintenanceWindow": "wed:09:00-wed:10:00"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Creates a Memcached cluster with 2 nodes. ",
+ "id": "createcachecluster-1474994727381",
+ "title": "CreateCacheCluster"
+ },
+ {
+ "input": {
+ "AutoMinorVersionUpgrade": true,
+ "CacheClusterId": "my-redis",
+ "CacheNodeType": "cache.r3.larage",
+ "CacheSubnetGroupName": "default",
+ "Engine": "redis",
+ "EngineVersion": "3.2.4",
+ "NumCacheNodes": 1,
+ "Port": 6379,
+ "PreferredAvailabilityZone": "us-east-1c",
+ "SnapshotRetentionLimit": 7
+ },
+ "output": {
+ "CacheCluster": {
+ "AutoMinorVersionUpgrade": true,
+ "CacheClusterId": "my-redis",
+ "CacheClusterStatus": "creating",
+ "CacheNodeType": "cache.m3.large",
+ "CacheParameterGroup": {
+ "CacheNodeIdsToReboot": [
+
+ ],
+ "CacheParameterGroupName": "default.redis3.2",
+ "ParameterApplyStatus": "in-sync"
+ },
+ "CacheSecurityGroups": [
+
+ ],
+ "CacheSubnetGroupName": "default",
+ "ClientDownloadLandingPage": "https: //console.aws.amazon.com/elasticache/home#client-download: ",
+ "Engine": "redis",
+ "EngineVersion": "3.2.4",
+ "NumCacheNodes": 1,
+ "PendingModifiedValues": {
+ },
+ "PreferredAvailabilityZone": "us-east-1c",
+ "PreferredMaintenanceWindow": "fri: 05: 30-fri: 06: 30",
+ "SnapshotRetentionLimit": 7,
+ "SnapshotWindow": "10: 00-11: 00"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Creates a Redis cluster with 1 node. ",
+ "id": "createcachecluster-1474994727381",
+ "title": "CreateCacheCluster"
+ }
+ ],
+ "CreateCacheParameterGroup": [
+ {
+ "input": {
+ "CacheParameterGroupFamily": "redis2.8",
+ "CacheParameterGroupName": "custom-redis2-8",
+ "Description": "Custom Redis 2.8 parameter group."
+ },
+ "output": {
+ "CacheParameterGroup": {
+ "CacheParameterGroupFamily": "redis2.8",
+ "CacheParameterGroupName": "custom-redis2-8",
+ "Description": "Custom Redis 2.8 parameter group."
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Creates the Amazon ElastiCache parameter group custom-redis2-8.",
+ "id": "createcacheparametergroup-1474997699362",
+ "title": "CreateCacheParameterGroup"
+ }
+ ],
+ "CreateCacheSecurityGroup": [
+ {
+ "input": {
+ "CacheSecurityGroupName": "my-cache-sec-grp",
+ "Description": "Example ElastiCache security group."
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Creates an ElastiCache security group. ElastiCache security groups are only for clusters not running in an AWS VPC.",
+ "id": "createcachesecuritygroup-1483041506604",
+ "title": "CreateCacheSecurityGroup"
+ }
+ ],
+ "CreateCacheSubnetGroup": [
+ {
+ "input": {
+ "CacheSubnetGroupDescription": "Sample subnet group",
+ "CacheSubnetGroupName": "my-sn-grp2",
+ "SubnetIds": [
+ "subnet-6f28c982",
+ "subnet-bcd382f3",
+ "subnet-845b3e7c0"
+ ]
+ },
+ "output": {
+ "CacheSubnetGroup": {
+ "CacheSubnetGroupDescription": "My subnet group.",
+ "CacheSubnetGroupName": "my-sn-grp",
+ "Subnets": [
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1a"
+ },
+ "SubnetIdentifier": "subnet-6f28c982"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1c"
+ },
+ "SubnetIdentifier": "subnet-bcd382f3"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1b"
+ },
+ "SubnetIdentifier": "subnet-845b3e7c0"
+ }
+ ],
+ "VpcId": "vpc-91280df6"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Creates a new cache subnet group.",
+ "id": "createcachesubnet-1483042274558",
+ "title": "CreateCacheSubnet"
+ }
+ ],
+ "CreateReplicationGroup": [
+ {
+ "input": {
+ "AutomaticFailoverEnabled": true,
+ "CacheNodeType": "cache.m3.medium",
+ "Engine": "redis",
+ "EngineVersion": "2.8.24",
+ "NumCacheClusters": 3,
+ "ReplicationGroupDescription": "A Redis replication group.",
+ "ReplicationGroupId": "my-redis-rg",
+ "SnapshotRetentionLimit": 30
+ },
+ "output": {
+ "ReplicationGroup": {
+ "AutomaticFailover": "enabling",
+ "Description": "A Redis replication group.",
+ "MemberClusters": [
+ "my-redis-rg-001",
+ "my-redis-rg-002",
+ "my-redis-rg-003"
+ ],
+ "PendingModifiedValues": {
+ },
+ "ReplicationGroupId": "my-redis-rg",
+ "SnapshottingClusterId": "my-redis-rg-002",
+ "Status": "creating"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Creates a Redis replication group with 3 nodes.",
+ "id": "createcachereplicationgroup-1474998730655",
+ "title": "CreateCacheReplicationGroup"
+ },
+ {
+ "input": {
+ "AutoMinorVersionUpgrade": true,
+ "CacheNodeType": "cache.m3.medium",
+ "CacheParameterGroupName": "default.redis3.2.cluster.on",
+ "Engine": "redis",
+ "EngineVersion": "3.2.4",
+ "NodeGroupConfiguration": [
+ {
+ "PrimaryAvailabilityZone": "us-east-1c",
+ "ReplicaAvailabilityZones": [
+ "us-east-1b"
+ ],
+ "ReplicaCount": 1,
+ "Slots": "0-8999"
+ },
+ {
+ "PrimaryAvailabilityZone": "us-east-1a",
+ "ReplicaAvailabilityZones": [
+ "us-east-1a",
+ "us-east-1c"
+ ],
+ "ReplicaCount": 2,
+ "Slots": "9000-16383"
+ }
+ ],
+ "NumNodeGroups": 2,
+ "ReplicationGroupDescription": "A multi-sharded replication group",
+ "ReplicationGroupId": "clustered-redis-rg",
+ "SnapshotRetentionLimit": 8
+ },
+ "output": {
+ "ReplicationGroup": {
+ "AutomaticFailover": "enabled",
+ "Description": "Sharded replication group",
+ "MemberClusters": [
+ "rc-rg3-0001-001",
+ "rc-rg3-0001-002",
+ "rc-rg3-0002-001",
+ "rc-rg3-0002-002",
+ "rc-rg3-0002-003"
+ ],
+ "PendingModifiedValues": {
+ },
+ "ReplicationGroupId": "clustered-redis-rg",
+ "SnapshotRetentionLimit": 8,
+ "SnapshotWindow": "05:30-06:30",
+ "Status": "creating"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Creates a Redis (cluster mode enabled) replication group with two shards. One shard has one read replica node and the other shard has two read replicas.",
+ "id": "createreplicationgroup-1483657035585",
+ "title": "CreateReplicationGroup"
+ }
+ ],
+ "CreateSnapshot": [
+ {
+ "input": {
+ "CacheClusterId": "onenoderedis",
+ "SnapshotName": "snapshot-1"
+ },
+ "output": {
+ "Snapshot": {
+ "AutoMinorVersionUpgrade": true,
+ "CacheClusterCreateTime": "2017-02-03T15:43:36.278Z",
+ "CacheClusterId": "onenoderedis",
+ "CacheNodeType": "cache.m3.medium",
+ "CacheParameterGroupName": "default.redis3.2",
+ "CacheSubnetGroupName": "default",
+ "Engine": "redis",
+ "EngineVersion": "3.2.4",
+ "NodeSnapshots": [
+ {
+ "CacheNodeCreateTime": "2017-02-03T15:43:36.278Z",
+ "CacheNodeId": "0001",
+ "CacheSize": ""
+ }
+ ],
+ "NumCacheNodes": 1,
+ "Port": 6379,
+ "PreferredAvailabilityZone": "us-west-2c",
+ "PreferredMaintenanceWindow": "sat:08:00-sat:09:00",
+ "SnapshotName": "snapshot-1",
+ "SnapshotRetentionLimit": 1,
+ "SnapshotSource": "manual",
+ "SnapshotStatus": "creating",
+ "SnapshotWindow": "00:00-01:00",
+ "VpcId": "vpc-73c3cd17"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Creates a snapshot of a non-clustered Redis cluster that has only one node.",
+ "id": "createsnapshot-1474999681024",
+ "title": "CreateSnapshot - NonClustered Redis, no read-replicas"
+ },
+ {
+ "input": {
+ "CacheClusterId": "threenoderedis-001",
+ "SnapshotName": "snapshot-2"
+ },
+ "output": {
+ "Snapshot": {
+ "AutoMinorVersionUpgrade": true,
+ "CacheClusterCreateTime": "2017-02-03T15:43:36.278Z",
+ "CacheClusterId": "threenoderedis-001",
+ "CacheNodeType": "cache.m3.medium",
+ "CacheParameterGroupName": "default.redis3.2",
+ "CacheSubnetGroupName": "default",
+ "Engine": "redis",
+ "EngineVersion": "3.2.4",
+ "NodeSnapshots": [
+ {
+ "CacheNodeCreateTime": "2017-02-03T15:43:36.278Z",
+ "CacheNodeId": "0001",
+ "CacheSize": ""
+ }
+ ],
+ "NumCacheNodes": 1,
+ "Port": 6379,
+ "PreferredAvailabilityZone": "us-west-2c",
+ "PreferredMaintenanceWindow": "sat:08:00-sat:09:00",
+ "SnapshotName": "snapshot-2",
+ "SnapshotRetentionLimit": 1,
+ "SnapshotSource": "manual",
+ "SnapshotStatus": "creating",
+ "SnapshotWindow": "00:00-01:00",
+ "VpcId": "vpc-73c3cd17"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Creates a snapshot of a non-clustered Redis cluster that has only three nodes, primary and two read-replicas. CacheClusterId must be a specific node in the cluster.",
+ "id": "createsnapshot-1474999681024",
+ "title": "CreateSnapshot - NonClustered Redis, 2 read-replicas"
+ },
+ {
+ "input": {
+ "ReplicationGroupId": "clusteredredis",
+ "SnapshotName": "snapshot-2x5"
+ },
+ "output": {
+ "Snapshot": {
+ "AutoMinorVersionUpgrade": true,
+ "AutomaticFailover": "enabled",
+ "CacheNodeType": "cache.m3.medium",
+ "CacheParameterGroupName": "default.redis3.2.cluster.on",
+ "CacheSubnetGroupName": "default",
+ "Engine": "redis",
+ "EngineVersion": "3.2.4",
+ "NodeSnapshots": [
+ {
+ "CacheSize": "",
+ "NodeGroupId": "0001"
+ },
+ {
+ "CacheSize": "",
+ "NodeGroupId": "0002"
+ }
+ ],
+ "NumNodeGroups": 2,
+ "Port": 6379,
+ "PreferredMaintenanceWindow": "mon:09:30-mon:10:30",
+ "ReplicationGroupDescription": "Redis cluster with 2 shards.",
+ "ReplicationGroupId": "clusteredredis",
+ "SnapshotName": "snapshot-2x5",
+ "SnapshotRetentionLimit": 1,
+ "SnapshotSource": "manual",
+ "SnapshotStatus": "creating",
+ "SnapshotWindow": "12:00-13:00",
+ "VpcId": "vpc-73c3cd17"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Creates a snapshot of a clustered Redis cluster that has 2 shards, each with a primary and 4 read-replicas.",
+ "id": "createsnapshot-clustered-redis-1486144841758",
+ "title": "CreateSnapshot-clustered Redis"
+ }
+ ],
+ "DeleteCacheCluster": [
+ {
+ "input": {
+ "CacheClusterId": "my-memcached"
+ },
+ "output": {
+ "CacheCluster": {
+ "AutoMinorVersionUpgrade": true,
+ "CacheClusterCreateTime": "2016-12-22T16:05:17.314Z",
+ "CacheClusterId": "my-memcached",
+ "CacheClusterStatus": "deleting",
+ "CacheNodeType": "cache.r3.large",
+ "CacheParameterGroup": {
+ "CacheNodeIdsToReboot": [
+
+ ],
+ "CacheParameterGroupName": "default.memcached1.4",
+ "ParameterApplyStatus": "in-sync"
+ },
+ "CacheSecurityGroups": [
+
+ ],
+ "CacheSubnetGroupName": "default",
+ "ClientDownloadLandingPage": "https://console.aws.amazon.com/elasticache/home#client-download:",
+ "ConfigurationEndpoint": {
+ "Address": "my-memcached2.ameaqx.cfg.use1.cache.amazonaws.com",
+ "Port": 11211
+ },
+ "Engine": "memcached",
+ "EngineVersion": "1.4.24",
+ "NumCacheNodes": 2,
+ "PendingModifiedValues": {
+ },
+ "PreferredAvailabilityZone": "Multiple",
+ "PreferredMaintenanceWindow": "tue:07:30-tue:08:30"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Deletes an Amazon ElastiCache cluster.",
+ "id": "deletecachecluster-1475010605291",
+ "title": "DeleteCacheCluster"
+ }
+ ],
+ "DeleteCacheParameterGroup": [
+ {
+ "input": {
+ "CacheParameterGroupName": "custom-mem1-4"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Deletes the Amazon ElastiCache parameter group custom-mem1-4.",
+ "id": "deletecacheparametergroup-1475010933957",
+ "title": "DeleteCacheParameterGroup"
+ }
+ ],
+ "DeleteCacheSecurityGroup": [
+ {
+ "input": {
+ "CacheSecurityGroupName": "my-sec-group"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Deletes a cache security group.",
+ "id": "deletecachesecuritygroup-1483046967507",
+ "title": "DeleteCacheSecurityGroup"
+ }
+ ],
+ "DeleteCacheSubnetGroup": [
+ {
+ "input": {
+ "CacheSubnetGroupName": "my-subnet-group"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Deletes the Amazon ElastiCache subnet group my-subnet-group.",
+ "id": "deletecachesubnetgroup-1475011431325",
+ "title": "DeleteCacheSubnetGroup"
+ }
+ ],
+ "DeleteReplicationGroup": [
+ {
+ "input": {
+ "ReplicationGroupId": "my-redis-rg",
+ "RetainPrimaryCluster": false
+ },
+ "output": {
+ "ReplicationGroup": {
+ "AutomaticFailover": "disabled",
+ "Description": "simple redis cluster",
+ "PendingModifiedValues": {
+ },
+ "ReplicationGroupId": "my-redis-rg",
+ "Status": "deleting"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Deletes the Amazon ElastiCache replication group my-redis-rg.",
+ "id": "deletereplicationgroup-1475011641804",
+ "title": "DeleteReplicationGroup"
+ }
+ ],
+ "DeleteSnapshot": [
+ {
+ "input": {
+ "SnapshotName": "snapshot-20161212"
+ },
+ "output": {
+ "Snapshot": {
+ "AutoMinorVersionUpgrade": true,
+ "CacheClusterCreateTime": "2016-12-21T22:27:12.543Z",
+ "CacheClusterId": "my-redis5",
+ "CacheNodeType": "cache.m3.large",
+ "CacheParameterGroupName": "default.redis3.2",
+ "CacheSubnetGroupName": "default",
+ "Engine": "redis",
+ "EngineVersion": "3.2.4",
+ "NodeSnapshots": [
+ {
+ "CacheNodeCreateTime": "2016-12-21T22:27:12.543Z",
+ "CacheNodeId": "0001",
+ "CacheSize": "3 MB",
+ "SnapshotCreateTime": "2016-12-21T22:30:26Z"
+ }
+ ],
+ "NumCacheNodes": 1,
+ "Port": 6379,
+ "PreferredAvailabilityZone": "us-east-1c",
+ "PreferredMaintenanceWindow": "fri:05:30-fri:06:30",
+ "SnapshotName": "snapshot-20161212",
+ "SnapshotRetentionLimit": 7,
+ "SnapshotSource": "manual",
+ "SnapshotStatus": "deleting",
+ "SnapshotWindow": "10:00-11:00",
+ "VpcId": "vpc-91280df6"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Deletes the Redis snapshot snapshot-20160822.",
+ "id": "deletesnapshot-1475011945779",
+ "title": "DeleteSnapshot"
+ }
+ ],
+ "DescribeCacheClusters": [
+ {
+ "input": {
+ "CacheClusterId": "my-mem-cluster"
+ },
+ "output": {
+ "CacheClusters": [
+ {
+ "AutoMinorVersionUpgrade": true,
+ "CacheClusterCreateTime": "2016-12-21T21:59:43.794Z",
+ "CacheClusterId": "my-mem-cluster",
+ "CacheClusterStatus": "available",
+ "CacheNodeType": "cache.t2.medium",
+ "CacheParameterGroup": {
+ "CacheNodeIdsToReboot": [
+
+ ],
+ "CacheParameterGroupName": "default.memcached1.4",
+ "ParameterApplyStatus": "in-sync"
+ },
+ "CacheSecurityGroups": [
+
+ ],
+ "CacheSubnetGroupName": "default",
+ "ClientDownloadLandingPage": "https://console.aws.amazon.com/elasticache/home#client-download:",
+ "ConfigurationEndpoint": {
+ "Address": "my-mem-cluster.abcdef.cfg.use1.cache.amazonaws.com",
+ "Port": 11211
+ },
+ "Engine": "memcached",
+ "EngineVersion": "1.4.24",
+ "NumCacheNodes": 2,
+ "PendingModifiedValues": {
+ },
+ "PreferredAvailabilityZone": "Multiple",
+ "PreferredMaintenanceWindow": "wed:06:00-wed:07:00"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists the details for up to 50 cache clusters.",
+ "id": "describecacheclusters-1475012269754",
+ "title": "DescribeCacheClusters"
+ },
+ {
+ "input": {
+ "CacheClusterId": "my-mem-cluster",
+ "ShowCacheNodeInfo": true
+ },
+ "output": {
+ "CacheClusters": [
+ {
+ "AutoMinorVersionUpgrade": true,
+ "CacheClusterCreateTime": "2016-12-21T21:59:43.794Z",
+ "CacheClusterId": "my-mem-cluster",
+ "CacheClusterStatus": "available",
+ "CacheNodeType": "cache.t2.medium",
+ "CacheNodes": [
+ {
+ "CacheNodeCreateTime": "2016-12-21T21:59:43.794Z",
+ "CacheNodeId": "0001",
+ "CacheNodeStatus": "available",
+ "CustomerAvailabilityZone": "us-east-1b",
+ "Endpoint": {
+ "Address": "my-mem-cluster.ameaqx.0001.use1.cache.amazonaws.com",
+ "Port": 11211
+ },
+ "ParameterGroupStatus": "in-sync"
+ },
+ {
+ "CacheNodeCreateTime": "2016-12-21T21:59:43.794Z",
+ "CacheNodeId": "0002",
+ "CacheNodeStatus": "available",
+ "CustomerAvailabilityZone": "us-east-1a",
+ "Endpoint": {
+ "Address": "my-mem-cluster.ameaqx.0002.use1.cache.amazonaws.com",
+ "Port": 11211
+ },
+ "ParameterGroupStatus": "in-sync"
+ }
+ ],
+ "CacheParameterGroup": {
+ "CacheNodeIdsToReboot": [
+
+ ],
+ "CacheParameterGroupName": "default.memcached1.4",
+ "ParameterApplyStatus": "in-sync"
+ },
+ "CacheSecurityGroups": [
+
+ ],
+ "CacheSubnetGroupName": "default",
+ "ClientDownloadLandingPage": "https://console.aws.amazon.com/elasticache/home#client-download:",
+ "ConfigurationEndpoint": {
+ "Address": "my-mem-cluster.ameaqx.cfg.use1.cache.amazonaws.com",
+ "Port": 11211
+ },
+ "Engine": "memcached",
+ "EngineVersion": "1.4.24",
+ "NumCacheNodes": 2,
+ "PendingModifiedValues": {
+ },
+ "PreferredAvailabilityZone": "Multiple",
+ "PreferredMaintenanceWindow": "wed:06:00-wed:07:00"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists the details for the cache cluster my-mem-cluster.",
+ "id": "describecacheclusters-1475012269754",
+ "title": "DescribeCacheClusters"
+ }
+ ],
+ "DescribeCacheEngineVersions": [
+ {
+ "input": {
+ },
+ "output": {
+ "CacheEngineVersions": [
+ {
+ "CacheEngineDescription": "memcached",
+ "CacheEngineVersionDescription": "memcached version 1.4.14",
+ "CacheParameterGroupFamily": "memcached1.4",
+ "Engine": "memcached",
+ "EngineVersion": "1.4.14"
+ },
+ {
+ "CacheEngineDescription": "memcached",
+ "CacheEngineVersionDescription": "memcached version 1.4.24",
+ "CacheParameterGroupFamily": "memcached1.4",
+ "Engine": "memcached",
+ "EngineVersion": "1.4.24"
+ },
+ {
+ "CacheEngineDescription": "memcached",
+ "CacheEngineVersionDescription": "memcached version 1.4.33",
+ "CacheParameterGroupFamily": "memcached1.4",
+ "Engine": "memcached",
+ "EngineVersion": "1.4.33"
+ },
+ {
+ "CacheEngineDescription": "memcached",
+ "CacheEngineVersionDescription": "memcached version 1.4.5",
+ "CacheParameterGroupFamily": "memcached1.4",
+ "Engine": "memcached",
+ "EngineVersion": "1.4.5"
+ },
+ {
+ "CacheEngineDescription": "Redis",
+ "CacheEngineVersionDescription": "redis version 2.6.13",
+ "CacheParameterGroupFamily": "redis2.6",
+ "Engine": "redis",
+ "EngineVersion": "2.6.13"
+ },
+ {
+ "CacheEngineDescription": "Redis",
+ "CacheEngineVersionDescription": "redis version 2.8.19",
+ "CacheParameterGroupFamily": "redis2.8",
+ "Engine": "redis",
+ "EngineVersion": "2.8.19"
+ },
+ {
+ "CacheEngineDescription": "Redis",
+ "CacheEngineVersionDescription": "redis version 2.8.21",
+ "CacheParameterGroupFamily": "redis2.8",
+ "Engine": "redis",
+ "EngineVersion": "2.8.21"
+ },
+ {
+ "CacheEngineDescription": "Redis",
+ "CacheEngineVersionDescription": "redis version 2.8.22 R5",
+ "CacheParameterGroupFamily": "redis2.8",
+ "Engine": "redis",
+ "EngineVersion": "2.8.22"
+ },
+ {
+ "CacheEngineDescription": "Redis",
+ "CacheEngineVersionDescription": "redis version 2.8.23 R4",
+ "CacheParameterGroupFamily": "redis2.8",
+ "Engine": "redis",
+ "EngineVersion": "2.8.23"
+ },
+ {
+ "CacheEngineDescription": "Redis",
+ "CacheEngineVersionDescription": "redis version 2.8.24 R3",
+ "CacheParameterGroupFamily": "redis2.8",
+ "Engine": "redis",
+ "EngineVersion": "2.8.24"
+ },
+ {
+ "CacheEngineDescription": "Redis",
+ "CacheEngineVersionDescription": "redis version 2.8.6",
+ "CacheParameterGroupFamily": "redis2.8",
+ "Engine": "redis",
+ "EngineVersion": "2.8.6"
+ },
+ {
+ "CacheEngineDescription": "Redis",
+ "CacheEngineVersionDescription": "redis version 3.2.4",
+ "CacheParameterGroupFamily": "redis3.2",
+ "Engine": "redis",
+ "EngineVersion": "3.2.4"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists the details for up to 25 Memcached and Redis cache engine versions.",
+ "id": "describecacheengineversions-1475012638790",
+ "title": "DescribeCacheEngineVersions"
+ },
+ {
+ "input": {
+ "DefaultOnly": false,
+ "Engine": "redis",
+ "MaxRecords": 50
+ },
+ "output": {
+ "CacheEngineVersions": [
+ {
+ "CacheEngineDescription": "Redis",
+ "CacheEngineVersionDescription": "redis version 2.6.13",
+ "CacheParameterGroupFamily": "redis2.6",
+ "Engine": "redis",
+ "EngineVersion": "2.6.13"
+ },
+ {
+ "CacheEngineDescription": "Redis",
+ "CacheEngineVersionDescription": "redis version 2.8.19",
+ "CacheParameterGroupFamily": "redis2.8",
+ "Engine": "redis",
+ "EngineVersion": "2.8.19"
+ },
+ {
+ "CacheEngineDescription": "Redis",
+ "CacheEngineVersionDescription": "redis version 2.8.21",
+ "CacheParameterGroupFamily": "redis2.8",
+ "Engine": "redis",
+ "EngineVersion": "2.8.21"
+ },
+ {
+ "CacheEngineDescription": "Redis",
+ "CacheEngineVersionDescription": "redis version 2.8.22 R5",
+ "CacheParameterGroupFamily": "redis2.8",
+ "Engine": "redis",
+ "EngineVersion": "2.8.22"
+ },
+ {
+ "CacheEngineDescription": "Redis",
+ "CacheEngineVersionDescription": "redis version 2.8.23 R4",
+ "CacheParameterGroupFamily": "redis2.8",
+ "Engine": "redis",
+ "EngineVersion": "2.8.23"
+ },
+ {
+ "CacheEngineDescription": "Redis",
+ "CacheEngineVersionDescription": "redis version 2.8.24 R3",
+ "CacheParameterGroupFamily": "redis2.8",
+ "Engine": "redis",
+ "EngineVersion": "2.8.24"
+ },
+ {
+ "CacheEngineDescription": "Redis",
+ "CacheEngineVersionDescription": "redis version 2.8.6",
+ "CacheParameterGroupFamily": "redis2.8",
+ "Engine": "redis",
+ "EngineVersion": "2.8.6"
+ },
+ {
+ "CacheEngineDescription": "Redis",
+ "CacheEngineVersionDescription": "redis version 3.2.4",
+ "CacheParameterGroupFamily": "redis3.2",
+ "Engine": "redis",
+ "EngineVersion": "3.2.4"
+ }
+ ],
+ "Marker": ""
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists the details for up to 50 Redis cache engine versions.",
+ "id": "describecacheengineversions-1475012638790",
+ "title": "DescribeCacheEngineVersions"
+ }
+ ],
+ "DescribeCacheParameterGroups": [
+ {
+ "input": {
+ "CacheParameterGroupName": "custom-mem1-4"
+ },
+ "output": {
+ "CacheParameterGroups": [
+ {
+ "CacheParameterGroupFamily": "memcached1.4",
+ "CacheParameterGroupName": "custom-mem1-4",
+ "Description": "Custom memcache param group"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns a list of cache parameter group descriptions. If a cache parameter group name is specified, the list contains only the descriptions for that group.",
+ "id": "describecacheparametergroups-1483045457557",
+ "title": "DescribeCacheParameterGroups"
+ }
+ ],
+ "DescribeCacheParameters": [
+ {
+ "input": {
+ "CacheParameterGroupName": "custom-redis2-8",
+ "MaxRecords": 100,
+ "Source": "user"
+ },
+ "output": {
+ "Marker": "",
+ "Parameters": [
+ {
+ "AllowedValues": "yes,no",
+ "ChangeType": "requires-reboot",
+ "DataType": "string",
+ "Description": "Apply rehashing or not.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "activerehashing",
+ "ParameterValue": "yes",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "always,everysec,no",
+ "ChangeType": "immediate",
+ "DataType": "string",
+ "Description": "fsync policy for AOF persistence",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "appendfsync",
+ "ParameterValue": "everysec",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "yes,no",
+ "ChangeType": "immediate",
+ "DataType": "string",
+ "Description": "Enable Redis persistence.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "appendonly",
+ "ParameterValue": "no",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Normal client output buffer hard limit in bytes.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "client-output-buffer-limit-normal-hard-limit",
+ "ParameterValue": "0",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Normal client output buffer soft limit in bytes.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "client-output-buffer-limit-normal-soft-limit",
+ "ParameterValue": "0",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Normal client output buffer soft limit in seconds.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "client-output-buffer-limit-normal-soft-seconds",
+ "ParameterValue": "0",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Pubsub client output buffer hard limit in bytes.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "client-output-buffer-limit-pubsub-hard-limit",
+ "ParameterValue": "33554432",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Pubsub client output buffer soft limit in bytes.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "client-output-buffer-limit-pubsub-soft-limit",
+ "ParameterValue": "8388608",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Pubsub client output buffer soft limit in seconds.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "client-output-buffer-limit-pubsub-soft-seconds",
+ "ParameterValue": "60",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Slave client output buffer soft limit in seconds.",
+ "IsModifiable": false,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "client-output-buffer-limit-slave-soft-seconds",
+ "ParameterValue": "60",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "yes,no",
+ "ChangeType": "immediate",
+ "DataType": "string",
+ "Description": "If enabled, clients who attempt to write to a read-only slave will be disconnected. Applicable to 2.8.23 and higher.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.23",
+ "ParameterName": "close-on-slave-write",
+ "ParameterValue": "yes",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "1-1200000",
+ "ChangeType": "requires-reboot",
+ "DataType": "integer",
+ "Description": "Set the number of databases.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "databases",
+ "ParameterValue": "16",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "The maximum number of hash entries in order for the dataset to be compressed.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "hash-max-ziplist-entries",
+ "ParameterValue": "512",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "The threshold of biggest hash entries in order for the dataset to be compressed.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "hash-max-ziplist-value",
+ "ParameterValue": "64",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "The maximum number of list entries in order for the dataset to be compressed.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "list-max-ziplist-entries",
+ "ParameterValue": "512",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "The threshold of biggest list entries in order for the dataset to be compressed.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "list-max-ziplist-value",
+ "ParameterValue": "64",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "5000",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Max execution time of a Lua script in milliseconds. 0 for unlimited execution without warnings.",
+ "IsModifiable": false,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "lua-time-limit",
+ "ParameterValue": "5000",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "1-65000",
+ "ChangeType": "requires-reboot",
+ "DataType": "integer",
+ "Description": "The maximum number of Redis clients.",
+ "IsModifiable": false,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "maxclients",
+ "ParameterValue": "65000",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "volatile-lru,allkeys-lru,volatile-random,allkeys-random,volatile-ttl,noeviction",
+ "ChangeType": "immediate",
+ "DataType": "string",
+ "Description": "Max memory policy.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "maxmemory-policy",
+ "ParameterValue": "volatile-lru",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "1-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Max memory samples.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "maxmemory-samples",
+ "ParameterValue": "3",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Maximum number of seconds within which the master must receive a ping from a slave to take writes. Use this parameter together with min-slaves-to-write to regulate when the master stops accepting writes. Setting this value to 0 means the master always takes writes.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "min-slaves-max-lag",
+ "ParameterValue": "10",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Number of slaves that must be connected in order for master to take writes. Use this parameter together with min-slaves-max-lag to regulate when the master stops accepting writes. Setting this to 0 means the master always takes writes.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "min-slaves-to-write",
+ "ParameterValue": "0",
+ "Source": "system"
+ },
+ {
+ "ChangeType": "immediate",
+ "DataType": "string",
+ "Description": "The keyspace events for Redis to notify Pub/Sub clients about. By default all notifications are disabled",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "notify-keyspace-events",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "16384-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "The replication backlog size in bytes for PSYNC. This is the size of the buffer which accumulates slave data when slave is disconnected for some time, so that when slave reconnects again, only transfer the portion of data which the slave missed. Minimum value is 16K.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "repl-backlog-size",
+ "ParameterValue": "1048576",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "The amount of time in seconds after the master no longer have any slaves connected for the master to free the replication backlog. A value of 0 means to never release the backlog.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "repl-backlog-ttl",
+ "ParameterValue": "3600",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "11-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "The timeout in seconds for bulk transfer I/O during sync and master timeout from the perspective of the slave, and slave timeout from the perspective of the master.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "repl-timeout",
+ "ParameterValue": "60",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "The amount of memory reserved for non-cache memory usage, in bytes. You may want to increase this parameter for nodes with read replicas, AOF enabled, etc, to reduce swap usage.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "reserved-memory",
+ "ParameterValue": "0",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "The limit in the size of the set in order for the dataset to be compressed.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "set-max-intset-entries",
+ "ParameterValue": "512",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "yes,no",
+ "ChangeType": "immediate",
+ "DataType": "string",
+ "Description": "Configures if chaining of slaves is allowed",
+ "IsModifiable": false,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "slave-allow-chaining",
+ "ParameterValue": "no",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "The execution time, in microseconds, to exceed in order for the command to get logged. Note that a negative number disables the slow log, while a value of zero forces the logging of every command.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "slowlog-log-slower-than",
+ "ParameterValue": "10000",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "The length of the slow log. There is no limit to this length. Just be aware that it will consume memory. You can reclaim memory used by the slow log with SLOWLOG RESET.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "slowlog-max-len",
+ "ParameterValue": "128",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "If non-zero, send ACKs every given number of seconds.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "tcp-keepalive",
+ "ParameterValue": "0",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0,20-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Close connection if client is idle for a given number of seconds, or never if 0.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "timeout",
+ "ParameterValue": "0",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "The maximum number of sorted set entries in order for the dataset to be compressed.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "zset-max-ziplist-entries",
+ "ParameterValue": "128",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "The threshold of biggest sorted set entries in order for the dataset to be compressed.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "zset-max-ziplist-value",
+ "ParameterValue": "64",
+ "Source": "system"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists up to 100 user parameter values for the parameter group custom.redis2.8.",
+ "id": "describecacheparameters-1475013576900",
+ "title": "DescribeCacheParameters"
+ }
+ ],
+ "DescribeCacheSecurityGroups": [
+ {
+ "input": {
+ "CacheSecurityGroupName": "my-sec-group"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns a list of cache security group descriptions. If a cache security group name is specified, the list contains only the description of that group.",
+ "id": "describecachesecuritygroups-1483047200801",
+ "title": "DescribeCacheSecurityGroups"
+ }
+ ],
+ "DescribeCacheSubnetGroups": [
+ {
+ "input": {
+ "MaxRecords": 25
+ },
+ "output": {
+ "CacheSubnetGroups": [
+ {
+ "CacheSubnetGroupDescription": "Default CacheSubnetGroup",
+ "CacheSubnetGroupName": "default",
+ "Subnets": [
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1a"
+ },
+ "SubnetIdentifier": "subnet-1a2b3c4d"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1c"
+ },
+ "SubnetIdentifier": "subnet-a1b2c3d4"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1e"
+ },
+ "SubnetIdentifier": "subnet-abcd1234"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1b"
+ },
+ "SubnetIdentifier": "subnet-1234abcd"
+ }
+ ],
+ "VpcId": "vpc-91280df6"
+ }
+ ],
+ "Marker": ""
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Describes up to 25 cache subnet groups.",
+ "id": "describecachesubnetgroups-1482439214064",
+ "title": "DescribeCacheSubnetGroups"
+ }
+ ],
+ "DescribeEngineDefaultParameters": [
+ {
+ "input": {
+ "CacheParameterGroupFamily": "redis2.8",
+ "MaxRecords": 25
+ },
+ "output": {
+ "EngineDefaults": {
+ "CacheNodeTypeSpecificParameters": [
+ {
+ "AllowedValues": "0-",
+ "CacheNodeTypeSpecificValues": [
+ {
+ "CacheNodeType": "cache.c1.xlarge",
+ "Value": "650117120"
+ },
+ {
+ "CacheNodeType": "cache.m1.large",
+ "Value": "702545920"
+ },
+ {
+ "CacheNodeType": "cache.m1.medium",
+ "Value": "309329920"
+ },
+ {
+ "CacheNodeType": "cache.m1.small",
+ "Value": "94371840"
+ },
+ {
+ "CacheNodeType": "cache.m1.xlarge",
+ "Value": "1488977920"
+ },
+ {
+ "CacheNodeType": "cache.m2.2xlarge",
+ "Value": "3502243840"
+ },
+ {
+ "CacheNodeType": "cache.m2.4xlarge",
+ "Value": "7088373760"
+ },
+ {
+ "CacheNodeType": "cache.m2.xlarge",
+ "Value": "1709178880"
+ },
+ {
+ "CacheNodeType": "cache.m3.2xlarge",
+ "Value": "2998927360"
+ },
+ {
+ "CacheNodeType": "cache.m3.large",
+ "Value": "650117120"
+ },
+ {
+ "CacheNodeType": "cache.m3.medium",
+ "Value": "309329920"
+ },
+ {
+ "CacheNodeType": "cache.m3.xlarge",
+ "Value": "1426063360"
+ },
+ {
+ "CacheNodeType": "cache.m4.10xlarge",
+ "Value": "16604761424"
+ },
+ {
+ "CacheNodeType": "cache.m4.2xlarge",
+ "Value": "3188912636"
+ },
+ {
+ "CacheNodeType": "cache.m4.4xlarge",
+ "Value": "6525729063"
+ },
+ {
+ "CacheNodeType": "cache.m4.large",
+ "Value": "689259315"
+ },
+ {
+ "CacheNodeType": "cache.m4.xlarge",
+ "Value": "1532850176"
+ },
+ {
+ "CacheNodeType": "cache.r3.2xlarge",
+ "Value": "6081740800"
+ },
+ {
+ "CacheNodeType": "cache.r3.4xlarge",
+ "Value": "12268339200"
+ },
+ {
+ "CacheNodeType": "cache.r3.8xlarge",
+ "Value": "24536678400"
+ },
+ {
+ "CacheNodeType": "cache.r3.large",
+ "Value": "1468006400"
+ },
+ {
+ "CacheNodeType": "cache.r3.xlarge",
+ "Value": "3040870400"
+ },
+ {
+ "CacheNodeType": "cache.t1.micro",
+ "Value": "14260633"
+ },
+ {
+ "CacheNodeType": "cache.t2.medium",
+ "Value": "346134937"
+ },
+ {
+ "CacheNodeType": "cache.t2.micro",
+ "Value": "58195968"
+ },
+ {
+ "CacheNodeType": "cache.t2.small",
+ "Value": "166513868"
+ }
+ ],
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Slave client output buffer hard limit in bytes.",
+ "IsModifiable": false,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "client-output-buffer-limit-slave-hard-limit",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "CacheNodeTypeSpecificValues": [
+ {
+ "CacheNodeType": "cache.c1.xlarge",
+ "Value": "650117120"
+ },
+ {
+ "CacheNodeType": "cache.m1.large",
+ "Value": "702545920"
+ },
+ {
+ "CacheNodeType": "cache.m1.medium",
+ "Value": "309329920"
+ },
+ {
+ "CacheNodeType": "cache.m1.small",
+ "Value": "94371840"
+ },
+ {
+ "CacheNodeType": "cache.m1.xlarge",
+ "Value": "1488977920"
+ },
+ {
+ "CacheNodeType": "cache.m2.2xlarge",
+ "Value": "3502243840"
+ },
+ {
+ "CacheNodeType": "cache.m2.4xlarge",
+ "Value": "7088373760"
+ },
+ {
+ "CacheNodeType": "cache.m2.xlarge",
+ "Value": "1709178880"
+ },
+ {
+ "CacheNodeType": "cache.m3.2xlarge",
+ "Value": "2998927360"
+ },
+ {
+ "CacheNodeType": "cache.m3.large",
+ "Value": "650117120"
+ },
+ {
+ "CacheNodeType": "cache.m3.medium",
+ "Value": "309329920"
+ },
+ {
+ "CacheNodeType": "cache.m3.xlarge",
+ "Value": "1426063360"
+ },
+ {
+ "CacheNodeType": "cache.m4.10xlarge",
+ "Value": "16604761424"
+ },
+ {
+ "CacheNodeType": "cache.m4.2xlarge",
+ "Value": "3188912636"
+ },
+ {
+ "CacheNodeType": "cache.m4.4xlarge",
+ "Value": "6525729063"
+ },
+ {
+ "CacheNodeType": "cache.m4.large",
+ "Value": "689259315"
+ },
+ {
+ "CacheNodeType": "cache.m4.xlarge",
+ "Value": "1532850176"
+ },
+ {
+ "CacheNodeType": "cache.r3.2xlarge",
+ "Value": "6081740800"
+ },
+ {
+ "CacheNodeType": "cache.r3.4xlarge",
+ "Value": "12268339200"
+ },
+ {
+ "CacheNodeType": "cache.r3.8xlarge",
+ "Value": "24536678400"
+ },
+ {
+ "CacheNodeType": "cache.r3.large",
+ "Value": "1468006400"
+ },
+ {
+ "CacheNodeType": "cache.r3.xlarge",
+ "Value": "3040870400"
+ },
+ {
+ "CacheNodeType": "cache.t1.micro",
+ "Value": "14260633"
+ },
+ {
+ "CacheNodeType": "cache.t2.medium",
+ "Value": "346134937"
+ },
+ {
+ "CacheNodeType": "cache.t2.micro",
+ "Value": "58195968"
+ },
+ {
+ "CacheNodeType": "cache.t2.small",
+ "Value": "166513868"
+ }
+ ],
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Slave client output buffer soft limit in bytes.",
+ "IsModifiable": false,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "client-output-buffer-limit-slave-soft-limit",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "CacheNodeTypeSpecificValues": [
+ {
+ "CacheNodeType": "cache.c1.xlarge",
+ "Value": "6501171200"
+ },
+ {
+ "CacheNodeType": "cache.m1.large",
+ "Value": "7025459200"
+ },
+ {
+ "CacheNodeType": "cache.m1.medium",
+ "Value": "3093299200"
+ },
+ {
+ "CacheNodeType": "cache.m1.small",
+ "Value": "943718400"
+ },
+ {
+ "CacheNodeType": "cache.m1.xlarge",
+ "Value": "14889779200"
+ },
+ {
+ "CacheNodeType": "cache.m2.2xlarge",
+ "Value": "35022438400"
+ },
+ {
+ "CacheNodeType": "cache.m2.4xlarge",
+ "Value": "70883737600"
+ },
+ {
+ "CacheNodeType": "cache.m2.xlarge",
+ "Value": "17091788800"
+ },
+ {
+ "CacheNodeType": "cache.m3.2xlarge",
+ "Value": "29989273600"
+ },
+ {
+ "CacheNodeType": "cache.m3.large",
+ "Value": "6501171200"
+ },
+ {
+ "CacheNodeType": "cache.m3.medium",
+ "Value": "2988441600"
+ },
+ {
+ "CacheNodeType": "cache.m3.xlarge",
+ "Value": "14260633600"
+ },
+ {
+ "CacheNodeType": "cache.m4.10xlarge",
+ "Value": "166047614239"
+ },
+ {
+ "CacheNodeType": "cache.m4.2xlarge",
+ "Value": "31889126359"
+ },
+ {
+ "CacheNodeType": "cache.m4.4xlarge",
+ "Value": "65257290629"
+ },
+ {
+ "CacheNodeType": "cache.m4.large",
+ "Value": "6892593152"
+ },
+ {
+ "CacheNodeType": "cache.m4.xlarge",
+ "Value": "15328501760"
+ },
+ {
+ "CacheNodeType": "cache.r3.2xlarge",
+ "Value": "62495129600"
+ },
+ {
+ "CacheNodeType": "cache.r3.4xlarge",
+ "Value": "126458265600"
+ },
+ {
+ "CacheNodeType": "cache.r3.8xlarge",
+ "Value": "254384537600"
+ },
+ {
+ "CacheNodeType": "cache.r3.large",
+ "Value": "14470348800"
+ },
+ {
+ "CacheNodeType": "cache.r3.xlarge",
+ "Value": "30513561600"
+ },
+ {
+ "CacheNodeType": "cache.t1.micro",
+ "Value": "142606336"
+ },
+ {
+ "CacheNodeType": "cache.t2.medium",
+ "Value": "3461349376"
+ },
+ {
+ "CacheNodeType": "cache.t2.micro",
+ "Value": "581959680"
+ },
+ {
+ "CacheNodeType": "cache.t2.small",
+ "Value": "1665138688"
+ }
+ ],
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "The maximum configurable amount of memory to use to store items, in bytes.",
+ "IsModifiable": false,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "maxmemory",
+ "Source": "system"
+ }
+ ],
+ "CacheParameterGroupFamily": "redis2.8",
+ "Marker": "bWluLXNsYXZlcy10by13cml0ZQ==",
+ "Parameters": [
+ {
+ "AllowedValues": "yes,no",
+ "ChangeType": "requires-reboot",
+ "DataType": "string",
+ "Description": "Apply rehashing or not.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "activerehashing",
+ "ParameterValue": "yes",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "always,everysec,no",
+ "ChangeType": "immediate",
+ "DataType": "string",
+ "Description": "fsync policy for AOF persistence",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "appendfsync",
+ "ParameterValue": "everysec",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "yes,no",
+ "ChangeType": "immediate",
+ "DataType": "string",
+ "Description": "Enable Redis persistence.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "appendonly",
+ "ParameterValue": "no",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Normal client output buffer hard limit in bytes.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "client-output-buffer-limit-normal-hard-limit",
+ "ParameterValue": "0",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Normal client output buffer soft limit in bytes.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "client-output-buffer-limit-normal-soft-limit",
+ "ParameterValue": "0",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Normal client output buffer soft limit in seconds.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "client-output-buffer-limit-normal-soft-seconds",
+ "ParameterValue": "0",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Pubsub client output buffer hard limit in bytes.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "client-output-buffer-limit-pubsub-hard-limit",
+ "ParameterValue": "33554432",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Pubsub client output buffer soft limit in bytes.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "client-output-buffer-limit-pubsub-soft-limit",
+ "ParameterValue": "8388608",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Pubsub client output buffer soft limit in seconds.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "client-output-buffer-limit-pubsub-soft-seconds",
+ "ParameterValue": "60",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Slave client output buffer soft limit in seconds.",
+ "IsModifiable": false,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "client-output-buffer-limit-slave-soft-seconds",
+ "ParameterValue": "60",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "yes,no",
+ "ChangeType": "immediate",
+ "DataType": "string",
+ "Description": "If enabled, clients who attempt to write to a read-only slave will be disconnected. Applicable to 2.8.23 and higher.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.23",
+ "ParameterName": "close-on-slave-write",
+ "ParameterValue": "yes",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "1-1200000",
+ "ChangeType": "requires-reboot",
+ "DataType": "integer",
+ "Description": "Set the number of databases.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "databases",
+ "ParameterValue": "16",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "The maximum number of hash entries in order for the dataset to be compressed.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "hash-max-ziplist-entries",
+ "ParameterValue": "512",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "The threshold of biggest hash entries in order for the dataset to be compressed.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "hash-max-ziplist-value",
+ "ParameterValue": "64",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "The maximum number of list entries in order for the dataset to be compressed.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "list-max-ziplist-entries",
+ "ParameterValue": "512",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "The threshold of biggest list entries in order for the dataset to be compressed.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "list-max-ziplist-value",
+ "ParameterValue": "64",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "5000",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Max execution time of a Lua script in milliseconds. 0 for unlimited execution without warnings.",
+ "IsModifiable": false,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "lua-time-limit",
+ "ParameterValue": "5000",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "1-65000",
+ "ChangeType": "requires-reboot",
+ "DataType": "integer",
+ "Description": "The maximum number of Redis clients.",
+ "IsModifiable": false,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "maxclients",
+ "ParameterValue": "65000",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "volatile-lru,allkeys-lru,volatile-random,allkeys-random,volatile-ttl,noeviction",
+ "ChangeType": "immediate",
+ "DataType": "string",
+ "Description": "Max memory policy.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "maxmemory-policy",
+ "ParameterValue": "volatile-lru",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "1-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Max memory samples.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "maxmemory-samples",
+ "ParameterValue": "3",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Maximum number of seconds within which the master must receive a ping from a slave to take writes. Use this parameter together with min-slaves-to-write to regulate when the master stops accepting writes. Setting this value to 0 means the master always takes writes.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "min-slaves-max-lag",
+ "ParameterValue": "10",
+ "Source": "system"
+ },
+ {
+ "AllowedValues": "0-",
+ "ChangeType": "immediate",
+ "DataType": "integer",
+ "Description": "Number of slaves that must be connected in order for master to take writes. Use this parameter together with min-slaves-max-lag to regulate when the master stops accepting writes. Setting this to 0 means the master always takes writes.",
+ "IsModifiable": true,
+ "MinimumEngineVersion": "2.8.6",
+ "ParameterName": "min-slaves-to-write",
+ "ParameterValue": "0",
+ "Source": "system"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns the default engine and system parameter information for the specified cache engine.",
+ "id": "describeenginedefaultparameters-1481738057686",
+ "title": "DescribeEngineDefaultParameters"
+ }
+ ],
+ "DescribeEvents": [
+ {
+ "input": {
+ "Duration": 360,
+ "SourceType": "cache-cluster"
+ },
+ "output": {
+ "Events": [
+ {
+ "Date": "2016-12-22T16:27:56.088Z",
+ "Message": "Added cache node 0001 in availability zone us-east-1e",
+ "SourceIdentifier": "redis-cluster",
+ "SourceType": "cache-cluster"
+ },
+ {
+ "Date": "2016-12-22T16:27:56.078Z",
+ "Message": "Cache cluster created",
+ "SourceIdentifier": "redis-cluster",
+ "SourceType": "cache-cluster"
+ },
+ {
+ "Date": "2016-12-22T16:05:17.326Z",
+ "Message": "Added cache node 0002 in availability zone us-east-1c",
+ "SourceIdentifier": "my-memcached2",
+ "SourceType": "cache-cluster"
+ },
+ {
+ "Date": "2016-12-22T16:05:17.323Z",
+ "Message": "Added cache node 0001 in availability zone us-east-1e",
+ "SourceIdentifier": "my-memcached2",
+ "SourceType": "cache-cluster"
+ },
+ {
+ "Date": "2016-12-22T16:05:17.314Z",
+ "Message": "Cache cluster created",
+ "SourceIdentifier": "my-memcached2",
+ "SourceType": "cache-cluster"
+ }
+ ],
+ "Marker": ""
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Describes all the cache-cluster events for the past 120 minutes.",
+ "id": "describeevents-1481843894757",
+ "title": "DescribeEvents"
+ },
+ {
+ "input": {
+ "StartTime": "2016-12-22T15:00:00.000Z"
+ },
+ "output": {
+ "Events": [
+ {
+ "Date": "2016-12-22T21:35:46.674Z",
+ "Message": "Snapshot succeeded for snapshot with ID 'cr-bkup' of replication group with ID 'clustered-redis'",
+ "SourceIdentifier": "clustered-redis-0001-001",
+ "SourceType": "cache-cluster"
+ },
+ {
+ "Date": "2016-12-22T16:27:56.088Z",
+ "Message": "Added cache node 0001 in availability zone us-east-1e",
+ "SourceIdentifier": "redis-cluster",
+ "SourceType": "cache-cluster"
+ },
+ {
+ "Date": "2016-12-22T16:27:56.078Z",
+ "Message": "Cache cluster created",
+ "SourceIdentifier": "redis-cluster",
+ "SourceType": "cache-cluster"
+ },
+ {
+ "Date": "2016-12-22T16:05:17.326Z",
+ "Message": "Added cache node 0002 in availability zone us-east-1c",
+ "SourceIdentifier": "my-memcached2",
+ "SourceType": "cache-cluster"
+ },
+ {
+ "Date": "2016-12-22T16:05:17.323Z",
+ "Message": "Added cache node 0001 in availability zone us-east-1e",
+ "SourceIdentifier": "my-memcached2",
+ "SourceType": "cache-cluster"
+ },
+ {
+ "Date": "2016-12-22T16:05:17.314Z",
+ "Message": "Cache cluster created",
+ "SourceIdentifier": "my-memcached2",
+ "SourceType": "cache-cluster"
+ }
+ ],
+ "Marker": ""
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Describes all the replication-group events from 3:00P to 5:00P on November 11, 2016.",
+ "id": "describeevents-1481843894757",
+ "title": "DescribeEvents"
+ }
+ ],
+ "DescribeReplicationGroups": [
+ {
+ "input": {
+ },
+ "output": {
+ "Marker": "",
+ "ReplicationGroups": [
+ {
+ "AutomaticFailover": "enabled",
+ "Description": "Test cluster",
+ "MemberClusters": [
+ "clustered-redis-0001-001",
+ "clustered-redis-0001-002",
+ "clustered-redis-0002-001",
+ "clustered-redis-0002-002"
+ ],
+ "NodeGroups": [
+ {
+ "NodeGroupId": "0001",
+ "NodeGroupMembers": [
+ {
+ "CacheClusterId": "clustered-redis-0001-001",
+ "CacheNodeId": "0001",
+ "PreferredAvailabilityZone": "us-east-1e"
+ },
+ {
+ "CacheClusterId": "clustered-redis-0001-002",
+ "CacheNodeId": "0001",
+ "PreferredAvailabilityZone": "us-east-1c"
+ }
+ ],
+ "Status": "available"
+ },
+ {
+ "NodeGroupId": "0002",
+ "NodeGroupMembers": [
+ {
+ "CacheClusterId": "clustered-redis-0002-001",
+ "CacheNodeId": "0001",
+ "PreferredAvailabilityZone": "us-east-1c"
+ },
+ {
+ "CacheClusterId": "clustered-redis-0002-002",
+ "CacheNodeId": "0001",
+ "PreferredAvailabilityZone": "us-east-1b"
+ }
+ ],
+ "Status": "available"
+ }
+ ],
+ "PendingModifiedValues": {
+ },
+ "ReplicationGroupId": "clustered-redis",
+ "Status": "available"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns information about the replication group myreplgroup.",
+ "id": "describereplicationgroups-1481742639427",
+ "title": "DescribeReplicationGroups"
+ }
+ ],
+ "DescribeReservedCacheNodes": [
+ {
+ "input": {
+ "MaxRecords": 25
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns information about reserved cache nodes for this account, or about a specified reserved cache node. If the account has no reserved cache nodes, the operation returns an empty list, as shown here.",
+ "id": "describereservedcachenodes-1481742348045",
+ "title": "DescribeReservedCacheNodes"
+ }
+ ],
+ "DescribeReservedCacheNodesOfferings": [
+ {
+ "input": {
+ "MaxRecords": 20
+ },
+ "output": {
+ "Marker": "1ef01f5b-433f-94ff-a530-61a56bfc8e7a",
+ "ReservedCacheNodesOfferings": [
+ {
+ "CacheNodeType": "cache.m1.small",
+ "Duration": 94608000,
+ "FixedPrice": 157.0,
+ "OfferingType": "Medium Utilization",
+ "ProductDescription": "memcached",
+ "RecurringCharges": [
+
+ ],
+ "ReservedCacheNodesOfferingId": "0167633d-37f6-4222-b872-b1f22eb79ba4",
+ "UsagePrice": 0.017
+ },
+ {
+ "CacheNodeType": "cache.m4.xlarge",
+ "Duration": 94608000,
+ "FixedPrice": 1248.0,
+ "OfferingType": "Heavy Utilization",
+ "ProductDescription": "redis",
+ "RecurringCharges": [
+ {
+ "RecurringChargeAmount": 0.077,
+ "RecurringChargeFrequency": "Hourly"
+ }
+ ],
+ "ReservedCacheNodesOfferingId": "02c04e13-baca-4e71-9ceb-620eed94827d",
+ "UsagePrice": 0.0
+ },
+ {
+ "CacheNodeType": "cache.m2.4xlarge",
+ "Duration": 94608000,
+ "FixedPrice": 2381.0,
+ "OfferingType": "Medium Utilization",
+ "ProductDescription": "memcached",
+ "RecurringCharges": [
+
+ ],
+ "ReservedCacheNodesOfferingId": "02e1755e-76e8-48e3-8d82-820a5726a458",
+ "UsagePrice": 0.276
+ },
+ {
+ "CacheNodeType": "cache.m1.small",
+ "Duration": 94608000,
+ "FixedPrice": 188.0,
+ "OfferingType": "Heavy Utilization",
+ "ProductDescription": "redis",
+ "RecurringCharges": [
+ {
+ "RecurringChargeAmount": 0.013,
+ "RecurringChargeFrequency": "Hourly"
+ }
+ ],
+ "ReservedCacheNodesOfferingId": "03315215-7b87-421a-a3dd-785021e4113f",
+ "UsagePrice": 0.0
+ },
+ {
+ "CacheNodeType": "cache.m4.10xlarge",
+ "Duration": 31536000,
+ "FixedPrice": 6158.0,
+ "OfferingType": "Heavy Utilization",
+ "ProductDescription": "redis",
+ "RecurringCharges": [
+ {
+ "RecurringChargeAmount": 1.125,
+ "RecurringChargeFrequency": "Hourly"
+ }
+ ],
+ "ReservedCacheNodesOfferingId": "05ffbb44-2ace-4476-a2a5-8ec99f866fb3",
+ "UsagePrice": 0.0
+ },
+ {
+ "CacheNodeType": "cache.m1.small",
+ "Duration": 31536000,
+ "FixedPrice": 101.0,
+ "OfferingType": "Medium Utilization",
+ "ProductDescription": "redis",
+ "RecurringCharges": [
+
+ ],
+ "ReservedCacheNodesOfferingId": "065c71ae-4a4e-4f1e-bebf-37525f4c6cb2",
+ "UsagePrice": 0.023
+ },
+ {
+ "CacheNodeType": "cache.m1.medium",
+ "Duration": 94608000,
+ "FixedPrice": 314.0,
+ "OfferingType": "Medium Utilization",
+ "ProductDescription": "memcached",
+ "RecurringCharges": [
+
+ ],
+ "ReservedCacheNodesOfferingId": "06774b12-7f5e-48c1-907a-f286c63f327d",
+ "UsagePrice": 0.034
+ },
+ {
+ "CacheNodeType": "cache.m2.xlarge",
+ "Duration": 31536000,
+ "FixedPrice": 163.0,
+ "OfferingType": "Light Utilization",
+ "ProductDescription": "memcached",
+ "RecurringCharges": [
+
+ ],
+ "ReservedCacheNodesOfferingId": "0924ac6b-847f-4761-ba6b-4290b2adf719",
+ "UsagePrice": 0.137
+ },
+ {
+ "CacheNodeType": "cache.m2.xlarge",
+ "Duration": 94608000,
+ "FixedPrice": 719.0,
+ "OfferingType": "Heavy Utilization",
+ "ProductDescription": "redis",
+ "RecurringCharges": [
+ {
+ "RecurringChargeAmount": 0.049,
+ "RecurringChargeFrequency": "Hourly"
+ }
+ ],
+ "ReservedCacheNodesOfferingId": "09eeb126-69b6-4d3f-8f94-ca3510629f53",
+ "UsagePrice": 0.0
+ },
+ {
+ "CacheNodeType": "cache.r3.2xlarge",
+ "Duration": 94608000,
+ "FixedPrice": 4132.0,
+ "OfferingType": "Heavy Utilization",
+ "ProductDescription": "redis",
+ "RecurringCharges": [
+ {
+ "RecurringChargeAmount": 0.182,
+ "RecurringChargeFrequency": "Hourly"
+ }
+ ],
+ "ReservedCacheNodesOfferingId": "0a516ad8-557f-4310-9dd0-2448c2ff4d62",
+ "UsagePrice": 0.0
+ },
+ {
+ "CacheNodeType": "cache.c1.xlarge",
+ "Duration": 94608000,
+ "FixedPrice": 875.0,
+ "OfferingType": "Light Utilization",
+ "ProductDescription": "memcached",
+ "RecurringCharges": [
+
+ ],
+ "ReservedCacheNodesOfferingId": "0b0c1cc5-2177-4150-95d7-c67ec34dcb19",
+ "UsagePrice": 0.363
+ },
+ {
+ "CacheNodeType": "cache.m4.10xlarge",
+ "Duration": 94608000,
+ "FixedPrice": 12483.0,
+ "OfferingType": "Heavy Utilization",
+ "ProductDescription": "memcached",
+ "RecurringCharges": [
+ {
+ "RecurringChargeAmount": 0.76,
+ "RecurringChargeFrequency": "Hourly"
+ }
+ ],
+ "ReservedCacheNodesOfferingId": "0c2b139b-1cff-43d0-8fba-0c753f9b1950",
+ "UsagePrice": 0.0
+ },
+ {
+ "CacheNodeType": "cache.c1.xlarge",
+ "Duration": 31536000,
+ "FixedPrice": 1620.0,
+ "OfferingType": "Heavy Utilization",
+ "ProductDescription": "memcached",
+ "RecurringCharges": [
+ {
+ "RecurringChargeAmount": 0.207,
+ "RecurringChargeFrequency": "Hourly"
+ }
+ ],
+ "ReservedCacheNodesOfferingId": "0c52115b-38cb-47a2-8dbc-e02e40b6a13f",
+ "UsagePrice": 0.0
+ },
+ {
+ "CacheNodeType": "cache.m2.4xlarge",
+ "Duration": 94608000,
+ "FixedPrice": 2381.0,
+ "OfferingType": "Medium Utilization",
+ "ProductDescription": "redis",
+ "RecurringCharges": [
+
+ ],
+ "ReservedCacheNodesOfferingId": "12fcb19c-5416-4e1d-934f-28f1e2cb8599",
+ "UsagePrice": 0.276
+ },
+ {
+ "CacheNodeType": "cache.m4.xlarge",
+ "Duration": 31536000,
+ "FixedPrice": 616.0,
+ "OfferingType": "Heavy Utilization",
+ "ProductDescription": "memcached",
+ "RecurringCharges": [
+ {
+ "RecurringChargeAmount": 0.112,
+ "RecurringChargeFrequency": "Hourly"
+ }
+ ],
+ "ReservedCacheNodesOfferingId": "13af20ad-914d-4d8b-9763-fa2e565f3549",
+ "UsagePrice": 0.0
+ },
+ {
+ "CacheNodeType": "cache.r3.8xlarge",
+ "Duration": 94608000,
+ "FixedPrice": 16528.0,
+ "OfferingType": "Heavy Utilization",
+ "ProductDescription": "memcached",
+ "RecurringCharges": [
+ {
+ "RecurringChargeAmount": 0.729,
+ "RecurringChargeFrequency": "Hourly"
+ }
+ ],
+ "ReservedCacheNodesOfferingId": "14da3d3f-b526-4dbf-b09b-355578b2a576",
+ "UsagePrice": 0.0
+ },
+ {
+ "CacheNodeType": "cache.m1.medium",
+ "Duration": 94608000,
+ "FixedPrice": 140.0,
+ "OfferingType": "Light Utilization",
+ "ProductDescription": "redis",
+ "RecurringCharges": [
+
+ ],
+ "ReservedCacheNodesOfferingId": "15d7018c-71fb-4717-8409-4bdcdca18da7",
+ "UsagePrice": 0.052
+ },
+ {
+ "CacheNodeType": "cache.m4.4xlarge",
+ "Duration": 94608000,
+ "FixedPrice": 4993.0,
+ "OfferingType": "Heavy Utilization",
+ "ProductDescription": "memcached",
+ "RecurringCharges": [
+ {
+ "RecurringChargeAmount": 0.304,
+ "RecurringChargeFrequency": "Hourly"
+ }
+ ],
+ "ReservedCacheNodesOfferingId": "1ae7ec5f-a76e-49b6-822b-629b1768a13a",
+ "UsagePrice": 0.0
+ },
+ {
+ "CacheNodeType": "cache.m3.2xlarge",
+ "Duration": 31536000,
+ "FixedPrice": 1772.0,
+ "OfferingType": "Heavy Utilization",
+ "ProductDescription": "redis",
+ "RecurringCharges": [
+ {
+ "RecurringChargeAmount": 0.25,
+ "RecurringChargeFrequency": "Hourly"
+ }
+ ],
+ "ReservedCacheNodesOfferingId": "1d31242b-3925-48d1-b882-ce03204e6013",
+ "UsagePrice": 0.0
+ },
+ {
+ "CacheNodeType": "cache.t1.micro",
+ "Duration": 31536000,
+ "FixedPrice": 54.0,
+ "OfferingType": "Medium Utilization",
+ "ProductDescription": "memcached",
+ "RecurringCharges": [
+
+ ],
+ "ReservedCacheNodesOfferingId": "1ef01f5b-94ff-433f-a530-61a56bfc8e7a",
+ "UsagePrice": 0.008
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists available reserved cache node offerings.",
+ "id": "describereseredcachenodeofferings-1481742869998",
+ "title": "DescribeReseredCacheNodeOfferings"
+ },
+ {
+ "input": {
+ "CacheNodeType": "cache.r3.large",
+ "Duration": "3",
+ "MaxRecords": 25,
+ "OfferingType": "Light Utilization",
+ "ReservedCacheNodesOfferingId": ""
+ },
+ "output": {
+ "Marker": "",
+ "ReservedCacheNodesOfferings": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists available reserved cache node offerings for cache.r3.large nodes with a 3 year commitment.",
+ "id": "describereseredcachenodeofferings-1481742869998",
+ "title": "DescribeReseredCacheNodeOfferings"
+ },
+ {
+ "input": {
+ "CacheNodeType": "",
+ "Duration": "",
+ "Marker": "",
+ "MaxRecords": 25,
+ "OfferingType": "",
+ "ProductDescription": "",
+ "ReservedCacheNodesOfferingId": "438012d3-4052-4cc7-b2e3-8d3372e0e706"
+ },
+ "output": {
+ "Marker": "",
+ "ReservedCacheNodesOfferings": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists available reserved cache node offerings.",
+ "id": "describereseredcachenodeofferings-1481742869998",
+ "title": "DescribeReseredCacheNodeOfferings"
+ }
+ ],
+ "DescribeSnapshots": [
+ {
+ "input": {
+ "SnapshotName": "snapshot-20161212"
+ },
+ "output": {
+ "Marker": "",
+ "Snapshots": [
+ {
+ "AutoMinorVersionUpgrade": true,
+ "CacheClusterCreateTime": "2016-12-21T22:27:12.543Z",
+ "CacheClusterId": "my-redis5",
+ "CacheNodeType": "cache.m3.large",
+ "CacheParameterGroupName": "default.redis3.2",
+ "CacheSubnetGroupName": "default",
+ "Engine": "redis",
+ "EngineVersion": "3.2.4",
+ "NodeSnapshots": [
+ {
+ "CacheNodeCreateTime": "2016-12-21T22:27:12.543Z",
+ "CacheNodeId": "0001",
+ "CacheSize": "3 MB",
+ "SnapshotCreateTime": "2016-12-21T22:30:26Z"
+ }
+ ],
+ "NumCacheNodes": 1,
+ "Port": 6379,
+ "PreferredAvailabilityZone": "us-east-1c",
+ "PreferredMaintenanceWindow": "fri:05:30-fri:06:30",
+ "SnapshotName": "snapshot-20161212",
+ "SnapshotRetentionLimit": 7,
+ "SnapshotSource": "manual",
+ "SnapshotStatus": "available",
+ "SnapshotWindow": "10:00-11:00",
+ "VpcId": "vpc-91280df6"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns information about the snapshot mysnapshot. By default.",
+ "id": "describesnapshots-1481743399584",
+ "title": "DescribeSnapshots"
+ }
+ ],
+ "ListAllowedNodeTypeModifications": [
+ {
+ "input": {
+ "ReplicationGroupId": "myreplgroup"
+ },
+ "output": {
+ "ScaleUpModifications": [
+ "cache.m4.10xlarge",
+ "cache.m4.2xlarge",
+ "cache.m4.4xlarge",
+ "cache.m4.xlarge",
+ "cache.r3.2xlarge",
+ "cache.r3.4xlarge",
+ "cache.r3.8xlarge",
+ "cache.r3.xlarge"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists all available node types that you can scale your Redis cluster's or replication group's current node type up to.",
+ "id": "listallowednodetypemodifications-1481748494872",
+ "title": "ListAllowedNodeTypeModifications"
+ },
+ {
+ "input": {
+ "CacheClusterId": "mycluster"
+ },
+ "output": {
+ "ScaleUpModifications": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists all available node types that you can scale your Redis cluster's or replication group's current node type up to.",
+ "id": "listallowednodetypemodifications-1481748494872",
+ "title": "ListAllowedNodeTypeModifications"
+ }
+ ],
+ "ListTagsForResource": [
+ {
+ "input": {
+ "ResourceName": "arn:aws:elasticache:us-west-2:<my-account-id>:cluster:mycluster"
+ },
+ "output": {
+ "TagList": [
+ {
+ "Key": "APIVersion",
+ "Value": "20150202"
+ },
+ {
+ "Key": "Service",
+ "Value": "ElastiCache"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists all cost allocation tags currently on the named resource. A cost allocation tag is a key-value pair where the key is case-sensitive and the value is optional. You can use cost allocation tags to categorize and track your AWS costs.",
+ "id": "listtagsforresource-1481748784584",
+ "title": "ListTagsForResource"
+ }
+ ],
+ "ModifyCacheCluster": [
+ {
+ "input": {
+ "ApplyImmediately": true,
+ "CacheClusterId": "redis-cluster",
+ "SnapshotRetentionLimit": 14
+ },
+ "output": {
+ "CacheCluster": {
+ "AutoMinorVersionUpgrade": true,
+ "CacheClusterCreateTime": "2016-12-22T16:27:56.078Z",
+ "CacheClusterId": "redis-cluster",
+ "CacheClusterStatus": "available",
+ "CacheNodeType": "cache.r3.large",
+ "CacheParameterGroup": {
+ "CacheNodeIdsToReboot": [
+
+ ],
+ "CacheParameterGroupName": "default.redis3.2",
+ "ParameterApplyStatus": "in-sync"
+ },
+ "CacheSecurityGroups": [
+
+ ],
+ "CacheSubnetGroupName": "default",
+ "ClientDownloadLandingPage": "https://console.aws.amazon.com/elasticache/home#client-download:",
+ "Engine": "redis",
+ "EngineVersion": "3.2.4",
+ "NumCacheNodes": 1,
+ "PendingModifiedValues": {
+ },
+ "PreferredAvailabilityZone": "us-east-1e",
+ "PreferredMaintenanceWindow": "fri:09:00-fri:10:00",
+ "SnapshotRetentionLimit": 14,
+ "SnapshotWindow": "07:00-08:00"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Copies a snapshot to a specified name.",
+ "id": "modifycachecluster-1482962725919",
+ "title": "ModifyCacheCluster"
+ }
+ ],
+ "ModifyCacheParameterGroup": [
+ {
+ "input": {
+ "CacheParameterGroupName": "custom-mem1-4",
+ "ParameterNameValues": [
+ {
+ "ParameterName": "binding_protocol",
+ "ParameterValue": "ascii"
+ },
+ {
+ "ParameterName": "chunk_size",
+ "ParameterValue": "96"
+ }
+ ]
+ },
+ "output": {
+ "CacheParameterGroupName": "custom-mem1-4"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Modifies one or more parameter values in the specified parameter group. You cannot modify any default parameter group.",
+ "id": "modifycacheparametergroup-1482966746787",
+ "title": "ModifyCacheParameterGroup"
+ }
+ ],
+ "ModifyCacheSubnetGroup": [
+ {
+ "input": {
+ "CacheSubnetGroupName": "my-sn-grp",
+ "SubnetIds": [
+ "subnet-bcde2345"
+ ]
+ },
+ "output": {
+ "CacheSubnetGroup": {
+ "CacheSubnetGroupDescription": "My subnet group.",
+ "CacheSubnetGroupName": "my-sn-grp",
+ "Subnets": [
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1c"
+ },
+ "SubnetIdentifier": "subnet-a1b2c3d4"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1e"
+ },
+ "SubnetIdentifier": "subnet-1a2b3c4d"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1e"
+ },
+ "SubnetIdentifier": "subnet-bcde2345"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1c"
+ },
+ "SubnetIdentifier": "subnet-1234abcd"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-east-1b"
+ },
+ "SubnetIdentifier": "subnet-abcd1234"
+ }
+ ],
+ "VpcId": "vpc-91280df6"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Modifies an existing ElastiCache subnet group.",
+ "id": "modifycachesubnetgroup-1483043446226",
+ "title": "ModifyCacheSubnetGroup"
+ }
+ ],
+ "ModifyReplicationGroup": [
+ {
+ "input": {
+ "ApplyImmediately": true,
+ "ReplicationGroupDescription": "Modified replication group",
+ "ReplicationGroupId": "my-redis-rg",
+ "SnapshotRetentionLimit": 30,
+ "SnapshottingClusterId": "my-redis-rg-001"
+ },
+ "output": {
+ "ReplicationGroup": {
+ "AutomaticFailover": "enabled",
+ "Description": "Modified replication group",
+ "MemberClusters": [
+ "my-redis-rg-001",
+ "my-redis-rg-002",
+ "my-redis-rg-003"
+ ],
+ "NodeGroups": [
+ {
+ "NodeGroupId": "0001",
+ "NodeGroupMembers": [
+ {
+ "CacheClusterId": "my-redis-rg-001",
+ "CacheNodeId": "0001",
+ "CurrentRole": "primary",
+ "PreferredAvailabilityZone": "us-east-1b",
+ "ReadEndpoint": {
+ "Address": "my-redis-rg-001.abcdef.0001.use1.cache.amazonaws.com",
+ "Port": 6379
+ }
+ },
+ {
+ "CacheClusterId": "my-redis-rg-002",
+ "CacheNodeId": "0001",
+ "CurrentRole": "replica",
+ "PreferredAvailabilityZone": "us-east-1a",
+ "ReadEndpoint": {
+ "Address": "my-redis-rg-002.abcdef.0001.use1.cache.amazonaws.com",
+ "Port": 6379
+ }
+ },
+ {
+ "CacheClusterId": "my-redis-rg-003",
+ "CacheNodeId": "0001",
+ "CurrentRole": "replica",
+ "PreferredAvailabilityZone": "us-east-1c",
+ "ReadEndpoint": {
+ "Address": "my-redis-rg-003.abcdef.0001.use1.cache.amazonaws.com",
+ "Port": 6379
+ }
+ }
+ ],
+ "PrimaryEndpoint": {
+ "Address": "my-redis-rg.abcdef.ng.0001.use1.cache.amazonaws.com",
+ "Port": 6379
+ },
+ "Status": "available"
+ }
+ ],
+ "PendingModifiedValues": {
+ },
+ "ReplicationGroupId": "my-redis-rg",
+ "SnapshottingClusterId": "my-redis-rg-002",
+ "Status": "available"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "",
+ "id": "modifyreplicationgroup-1483039689581",
+ "title": "ModifyReplicationGroup"
+ }
+ ],
+ "PurchaseReservedCacheNodesOffering": [
+ {
+ "input": {
+ "ReservedCacheNodesOfferingId": "1ef01f5b-94ff-433f-a530-61a56bfc8e7a"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Allows you to purchase a reserved cache node offering.",
+ "id": "purchasereservedcachenodesofferings-1483040798484",
+ "title": "PurchaseReservedCacheNodesOfferings"
+ }
+ ],
+ "RebootCacheCluster": [
+ {
+ "input": {
+ "CacheClusterId": "custom-mem1-4 ",
+ "CacheNodeIdsToReboot": [
+ "0001",
+ "0002"
+ ]
+ },
+ "output": {
+ "CacheCluster": {
+ "AutoMinorVersionUpgrade": true,
+ "CacheClusterCreateTime": "2016-12-21T21:59:43.794Z",
+ "CacheClusterId": "my-mem-cluster",
+ "CacheClusterStatus": "rebooting cache cluster nodes",
+ "CacheNodeType": "cache.t2.medium",
+ "CacheParameterGroup": {
+ "CacheNodeIdsToReboot": [
+
+ ],
+ "CacheParameterGroupName": "default.memcached1.4",
+ "ParameterApplyStatus": "in-sync"
+ },
+ "CacheSecurityGroups": [
+
+ ],
+ "CacheSubnetGroupName": "default",
+ "ClientDownloadLandingPage": "https://console.aws.amazon.com/elasticache/home#client-download:",
+ "ConfigurationEndpoint": {
+ "Address": "my-mem-cluster.abcdef.cfg.use1.cache.amazonaws.com",
+ "Port": 11211
+ },
+ "Engine": "memcached",
+ "EngineVersion": "1.4.24",
+ "NumCacheNodes": 2,
+ "PendingModifiedValues": {
+ },
+ "PreferredAvailabilityZone": "Multiple",
+ "PreferredMaintenanceWindow": "wed:06:00-wed:07:00"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Reboots the specified nodes in the names cluster.",
+ "id": "rebootcachecluster-1482969019505",
+ "title": "RebootCacheCluster"
+ }
+ ],
+ "RemoveTagsFromResource": [
+ {
+ "input": {
+ "ResourceName": "arn:aws:elasticache:us-east-1:1234567890:cluster:my-mem-cluster",
+ "TagKeys": [
+ "A",
+ "C",
+ "E"
+ ]
+ },
+ "output": {
+ "TagList": [
+ {
+ "Key": "B",
+ "Value": "Banana"
+ },
+ {
+ "Key": "D",
+ "Value": "Dog"
+ },
+ {
+ "Key": "F",
+ "Value": "Fox"
+ },
+ {
+ "Key": "I",
+ "Value": ""
+ },
+ {
+ "Key": "K",
+ "Value": "Kite"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Removes tags identified by a list of tag keys from the list of tags on the specified resource.",
+ "id": "removetagsfromresource-1483037920947",
+ "title": "RemoveTagsFromResource"
+ }
+ ],
+ "ResetCacheParameterGroup": [
+ {
+ "input": {
+ "CacheParameterGroupName": "custom-mem1-4",
+ "ResetAllParameters": true
+ },
+ "output": {
+ "CacheParameterGroupName": "custom-mem1-4"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Modifies the parameters of a cache parameter group to the engine or system default value.",
+ "id": "resetcacheparametergroup-1483038334014",
+ "title": "ResetCacheParameterGroup"
+ }
+ ],
+ "RevokeCacheSecurityGroupIngress": [
+ {
+ "input": {
+ "CacheSecurityGroupName": "my-sec-grp",
+ "EC2SecurityGroupName": "my-ec2-sec-grp",
+ "EC2SecurityGroupOwnerId": "1234567890"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns a list of cache security group descriptions. If a cache security group name is specified, the list contains only the description of that group.",
+ "id": "describecachesecuritygroups-1483047200801",
+ "title": "DescribeCacheSecurityGroups"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2015-02-02/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2015-02-02/paginators-1.json
new file mode 100644
index 00000000..12368b96
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2015-02-02/paginators-1.json
@@ -0,0 +1,118 @@
+{
+ "pagination": {
+ "DescribeCacheClusters": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "CacheClusters"
+ },
+ "DescribeCacheEngineVersions": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "CacheEngineVersions"
+ },
+ "DescribeCacheParameterGroups": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "CacheParameterGroups"
+ },
+ "DescribeCacheParameters": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "Parameters"
+ },
+ "DescribeCacheSecurityGroups": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "CacheSecurityGroups"
+ },
+ "DescribeCacheSubnetGroups": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "CacheSubnetGroups"
+ },
+ "DescribeEngineDefaultParameters": {
+ "input_token": "Marker",
+ "output_token": "EngineDefaults.Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "EngineDefaults.Parameters"
+ },
+ "DescribeEvents": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "Events"
+ },
+ "DescribeReservedCacheNodes": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "ReservedCacheNodes"
+ },
+ "DescribeReservedCacheNodesOfferings": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "ReservedCacheNodesOfferings"
+ },
+ "DescribeReplicationGroups": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "ReplicationGroups"
+ },
+ "DescribeSnapshots": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "Snapshots"
+ },
+ "DescribeServiceUpdates": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "ServiceUpdates"
+ },
+ "DescribeUpdateActions": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "UpdateActions"
+ },
+ "DescribeGlobalReplicationGroups": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "GlobalReplicationGroups"
+ },
+ "DescribeUserGroups": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "UserGroups"
+ },
+ "DescribeUsers": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "Users"
+ },
+ "DescribeServerlessCacheSnapshots": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ServerlessCacheSnapshots"
+ },
+ "DescribeServerlessCaches": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ServerlessCaches"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2015-02-02/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2015-02-02/service-2.json.gz
new file mode 100644
index 00000000..e5be265c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2015-02-02/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2015-02-02/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2015-02-02/waiters-2.json
new file mode 100644
index 00000000..c177d7b9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elasticache/2015-02-02/waiters-2.json
@@ -0,0 +1,143 @@
+{
+ "version":2,
+ "waiters":{
+ "CacheClusterAvailable":{
+ "acceptors":[
+ {
+ "argument":"CacheClusters[].CacheClusterStatus",
+ "expected":"available",
+ "matcher":"pathAll",
+ "state":"success"
+ },
+ {
+ "argument":"CacheClusters[].CacheClusterStatus",
+ "expected":"deleted",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"CacheClusters[].CacheClusterStatus",
+ "expected":"deleting",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"CacheClusters[].CacheClusterStatus",
+ "expected":"incompatible-network",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"CacheClusters[].CacheClusterStatus",
+ "expected":"restore-failed",
+ "matcher":"pathAny",
+ "state":"failure"
+ }
+ ],
+ "delay":15,
+ "description":"Wait until ElastiCache cluster is available.",
+ "maxAttempts":40,
+ "operation":"DescribeCacheClusters"
+ },
+ "CacheClusterDeleted":{
+ "acceptors":[
+ {
+ "argument":"CacheClusters[].CacheClusterStatus",
+ "expected":"deleted",
+ "matcher":"pathAll",
+ "state":"success"
+ },
+ {
+ "expected":"CacheClusterNotFound",
+ "matcher":"error",
+ "state":"success"
+ },
+ {
+ "argument":"CacheClusters[].CacheClusterStatus",
+ "expected":"available",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"CacheClusters[].CacheClusterStatus",
+ "expected":"creating",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"CacheClusters[].CacheClusterStatus",
+ "expected":"incompatible-network",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"CacheClusters[].CacheClusterStatus",
+ "expected":"modifying",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"CacheClusters[].CacheClusterStatus",
+ "expected":"restore-failed",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "argument":"CacheClusters[].CacheClusterStatus",
+ "expected":"snapshotting",
+ "matcher":"pathAny",
+ "state":"failure"
+ }
+ ],
+ "delay":15,
+ "description":"Wait until ElastiCache cluster is deleted.",
+ "maxAttempts":40,
+ "operation":"DescribeCacheClusters"
+ },
+ "ReplicationGroupAvailable":{
+ "acceptors":[
+ {
+ "argument":"ReplicationGroups[].Status",
+ "expected":"available",
+ "matcher":"pathAll",
+ "state":"success"
+ },
+ {
+ "argument":"ReplicationGroups[].Status",
+ "expected":"deleted",
+ "matcher":"pathAny",
+ "state":"failure"
+ }
+ ],
+ "delay":15,
+ "description":"Wait until ElastiCache replication group is available.",
+ "maxAttempts":40,
+ "operation":"DescribeReplicationGroups"
+ },
+ "ReplicationGroupDeleted":{
+ "acceptors":[
+ {
+ "argument":"ReplicationGroups[].Status",
+ "expected":"deleted",
+ "matcher":"pathAll",
+ "state":"success"
+ },
+ {
+ "argument":"ReplicationGroups[].Status",
+ "expected":"available",
+ "matcher":"pathAny",
+ "state":"failure"
+ },
+ {
+ "expected":"ReplicationGroupNotFoundFault",
+ "matcher":"error",
+ "state":"success"
+ }
+ ],
+ "delay":15,
+ "description":"Wait until ElastiCache replication group is deleted.",
+ "maxAttempts":40,
+ "operation":"DescribeReplicationGroups"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elasticbeanstalk/2010-12-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/elasticbeanstalk/2010-12-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..384d89c5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elasticbeanstalk/2010-12-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elasticbeanstalk/2010-12-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/elasticbeanstalk/2010-12-01/examples-1.json
new file mode 100644
index 00000000..0fded628
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elasticbeanstalk/2010-12-01/examples-1.json
@@ -0,0 +1,1109 @@
+{
+ "version": "1.0",
+ "examples": {
+ "AbortEnvironmentUpdate": [
+ {
+ "input": {
+ "EnvironmentName": "my-env"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following code aborts a running application version deployment for an environment named my-env:",
+ "id": "to-abort-a-deployment-1456267848227",
+ "title": "To abort a deployment"
+ }
+ ],
+ "CheckDNSAvailability": [
+ {
+ "input": {
+ "CNAMEPrefix": "my-cname"
+ },
+ "output": {
+ "Available": true,
+ "FullyQualifiedCNAME": "my-cname.us-west-2.elasticbeanstalk.com"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation checks the availability of the subdomain my-cname:",
+ "id": "to-check-the-availability-of-a-cname-1456268589537",
+ "title": "To check the availability of a CNAME"
+ }
+ ],
+ "CreateApplication": [
+ {
+ "input": {
+ "ApplicationName": "my-app",
+ "Description": "my application"
+ },
+ "output": {
+ "Application": {
+ "ApplicationName": "my-app",
+ "ConfigurationTemplates": [
+
+ ],
+ "DateCreated": "2015-02-12T18:32:21.181Z",
+ "DateUpdated": "2015-02-12T18:32:21.181Z",
+ "Description": "my application"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation creates a new application named my-app:",
+ "id": "to-create-a-new-application-1456268895683",
+ "title": "To create a new application"
+ }
+ ],
+ "CreateApplicationVersion": [
+ {
+ "input": {
+ "ApplicationName": "my-app",
+ "AutoCreateApplication": true,
+ "Description": "my-app-v1",
+ "Process": true,
+ "SourceBundle": {
+ "S3Bucket": "my-bucket",
+ "S3Key": "sample.war"
+ },
+ "VersionLabel": "v1"
+ },
+ "output": {
+ "ApplicationVersion": {
+ "ApplicationName": "my-app",
+ "DateCreated": "2015-02-03T23:01:25.412Z",
+ "DateUpdated": "2015-02-03T23:01:25.412Z",
+ "Description": "my-app-v1",
+ "SourceBundle": {
+ "S3Bucket": "my-bucket",
+ "S3Key": "sample.war"
+ },
+ "VersionLabel": "v1"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation creates a new version (v1) of an application named my-app:",
+ "id": "to-create-a-new-application-1456268895683",
+ "title": "To create a new application"
+ }
+ ],
+ "CreateConfigurationTemplate": [
+ {
+ "input": {
+ "ApplicationName": "my-app",
+ "EnvironmentId": "e-rpqsewtp2j",
+ "TemplateName": "my-app-v1"
+ },
+ "output": {
+ "ApplicationName": "my-app",
+ "DateCreated": "2015-08-12T18:40:39Z",
+ "DateUpdated": "2015-08-12T18:40:39Z",
+ "SolutionStackName": "64bit Amazon Linux 2015.03 v2.0.0 running Tomcat 8 Java 8",
+ "TemplateName": "my-app-v1"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation creates a configuration template named my-app-v1 from the settings applied to an environment with the id e-rpqsewtp2j:",
+ "id": "to-create-a-configuration-template-1456269283586",
+ "title": "To create a configuration template"
+ }
+ ],
+ "CreateEnvironment": [
+ {
+ "input": {
+ "ApplicationName": "my-app",
+ "CNAMEPrefix": "my-app",
+ "EnvironmentName": "my-env",
+ "SolutionStackName": "64bit Amazon Linux 2015.03 v2.0.0 running Tomcat 8 Java 8",
+ "VersionLabel": "v1"
+ },
+ "output": {
+ "ApplicationName": "my-app",
+ "CNAME": "my-app.elasticbeanstalk.com",
+ "DateCreated": "2015-02-03T23:04:54.479Z",
+ "DateUpdated": "2015-02-03T23:04:54.479Z",
+ "EnvironmentId": "e-izqpassy4h",
+ "EnvironmentName": "my-env",
+ "Health": "Grey",
+ "SolutionStackName": "64bit Amazon Linux 2015.03 v2.0.0 running Tomcat 8 Java 8",
+ "Status": "Launching",
+ "Tier": {
+ "Name": "WebServer",
+ "Type": "Standard",
+ "Version": " "
+ },
+ "VersionLabel": "v1"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation creates a new environment for version v1 of a java application named my-app:",
+ "id": "to-create-a-new-environment-for-an-application-1456269380396",
+ "title": "To create a new environment for an application"
+ }
+ ],
+ "CreateStorageLocation": [
+ {
+ "output": {
+ "S3Bucket": "elasticbeanstalk-us-west-2-0123456789012"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation creates a new environment for version v1 of a java application named my-app:",
+ "id": "to-create-a-new-environment-for-an-application-1456269380396",
+ "title": "To create a new environment for an application"
+ }
+ ],
+ "DeleteApplication": [
+ {
+ "input": {
+ "ApplicationName": "my-app"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation deletes an application named my-app:",
+ "id": "to-delete-an-application-1456269699366",
+ "title": "To delete an application"
+ }
+ ],
+ "DeleteApplicationVersion": [
+ {
+ "input": {
+ "ApplicationName": "my-app",
+ "DeleteSourceBundle": true,
+ "VersionLabel": "22a0-stage-150819_182129"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation deletes an application version named 22a0-stage-150819_182129 for an application named my-app:",
+ "id": "to-delete-an-application-version-1456269792956",
+ "title": "To delete an application version"
+ }
+ ],
+ "DeleteConfigurationTemplate": [
+ {
+ "input": {
+ "ApplicationName": "my-app",
+ "TemplateName": "my-template"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation deletes a configuration template named my-template for an application named my-app:",
+ "id": "to-delete-a-configuration-template-1456269836701",
+ "title": "To delete a configuration template"
+ }
+ ],
+ "DeleteEnvironmentConfiguration": [
+ {
+ "input": {
+ "ApplicationName": "my-app",
+ "EnvironmentName": "my-env"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation deletes a draft configuration for an environment named my-env:",
+ "id": "to-delete-a-draft-configuration-1456269886654",
+ "title": "To delete a draft configuration"
+ }
+ ],
+ "DescribeApplicationVersions": [
+ {
+ "input": {
+ "ApplicationName": "my-app",
+ "VersionLabels": [
+ "v2"
+ ]
+ },
+ "output": {
+ "ApplicationVersions": [
+ {
+ "ApplicationName": "my-app",
+ "DateCreated": "2015-07-23T01:32:26.079Z",
+ "DateUpdated": "2015-07-23T01:32:26.079Z",
+ "Description": "update cover page",
+ "SourceBundle": {
+ "S3Bucket": "elasticbeanstalk-us-west-2-015321684451",
+ "S3Key": "my-app/5026-stage-150723_224258.war"
+ },
+ "VersionLabel": "v2"
+ },
+ {
+ "ApplicationName": "my-app",
+ "DateCreated": "2015-07-23T22:26:10.816Z",
+ "DateUpdated": "2015-07-23T22:26:10.816Z",
+ "Description": "initial version",
+ "SourceBundle": {
+ "S3Bucket": "elasticbeanstalk-us-west-2-015321684451",
+ "S3Key": "my-app/5026-stage-150723_222618.war"
+ },
+ "VersionLabel": "v1"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation retrieves information about an application version labeled v2:",
+ "id": "to-view-information-about-an-application-version-1456269947428",
+ "title": "To view information about an application version"
+ }
+ ],
+ "DescribeApplications": [
+ {
+ "input": {
+ },
+ "output": {
+ "Applications": [
+ {
+ "ApplicationName": "ruby",
+ "ConfigurationTemplates": [
+
+ ],
+ "DateCreated": "2015-08-13T21:05:44.376Z",
+ "DateUpdated": "2015-08-13T21:05:44.376Z",
+ "Versions": [
+ "Sample Application"
+ ]
+ },
+ {
+ "ApplicationName": "pythonsample",
+ "ConfigurationTemplates": [
+
+ ],
+ "DateCreated": "2015-08-13T19:05:43.637Z",
+ "DateUpdated": "2015-08-13T19:05:43.637Z",
+ "Description": "Application created from the EB CLI using \"eb init\"",
+ "Versions": [
+ "Sample Application"
+ ]
+ },
+ {
+ "ApplicationName": "nodejs-example",
+ "ConfigurationTemplates": [
+
+ ],
+ "DateCreated": "2015-08-06T17:50:02.486Z",
+ "DateUpdated": "2015-08-06T17:50:02.486Z",
+ "Versions": [
+ "add elasticache",
+ "First Release"
+ ]
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation retrieves information about applications in the current region:",
+ "id": "to-view-a-list-of-applications-1456270027373",
+ "title": "To view a list of applications"
+ }
+ ],
+ "DescribeConfigurationOptions": [
+ {
+ "input": {
+ "ApplicationName": "my-app",
+ "EnvironmentName": "my-env"
+ },
+ "output": {
+ "Options": [
+ {
+ "ChangeSeverity": "NoInterruption",
+ "DefaultValue": "30",
+ "MaxValue": 300,
+ "MinValue": 5,
+ "Name": "Interval",
+ "Namespace": "aws:elb:healthcheck",
+ "UserDefined": false,
+ "ValueType": "Scalar"
+ },
+ {
+ "ChangeSeverity": "NoInterruption",
+ "DefaultValue": "2000000",
+ "MinValue": 0,
+ "Name": "LowerThreshold",
+ "Namespace": "aws:autoscaling:trigger",
+ "UserDefined": false,
+ "ValueType": "Scalar"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation retrieves descriptions of all available configuration options for an environment named my-env:",
+ "id": "to-view-configuration-options-for-an-environment-1456276763917",
+ "title": "To view configuration options for an environment"
+ }
+ ],
+ "DescribeConfigurationSettings": [
+ {
+ "input": {
+ "ApplicationName": "my-app",
+ "EnvironmentName": "my-env"
+ },
+ "output": {
+ "ConfigurationSettings": [
+ {
+ "ApplicationName": "my-app",
+ "DateCreated": "2015-08-13T19:16:25Z",
+ "DateUpdated": "2015-08-13T23:30:07Z",
+ "DeploymentStatus": "deployed",
+ "Description": "Environment created from the EB CLI using \"eb create\"",
+ "EnvironmentName": "my-env",
+ "OptionSettings": [
+ {
+ "Namespace": "aws:autoscaling:asg",
+ "OptionName": "Availability Zones",
+ "ResourceName": "AWSEBAutoScalingGroup",
+ "Value": "Any"
+ },
+ {
+ "Namespace": "aws:autoscaling:asg",
+ "OptionName": "Cooldown",
+ "ResourceName": "AWSEBAutoScalingGroup",
+ "Value": "360"
+ },
+ {
+ "Namespace": "aws:elb:policies",
+ "OptionName": "ConnectionDrainingTimeout",
+ "ResourceName": "AWSEBLoadBalancer",
+ "Value": "20"
+ },
+ {
+ "Namespace": "aws:elb:policies",
+ "OptionName": "ConnectionSettingIdleTimeout",
+ "ResourceName": "AWSEBLoadBalancer",
+ "Value": "60"
+ }
+ ],
+ "SolutionStackName": "64bit Amazon Linux 2015.03 v2.0.0 running Tomcat 8 Java 8"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ "abbreviated": "Output is abbreviated"
+ }
+ },
+ "description": "The following operation retrieves configuration settings for an environment named my-env:",
+ "id": "to-view-configurations-settings-for-an-environment-1456276924537",
+ "title": "To view configurations settings for an environment"
+ }
+ ],
+ "DescribeEnvironmentHealth": [
+ {
+ "input": {
+ "AttributeNames": [
+ "All"
+ ],
+ "EnvironmentName": "my-env"
+ },
+ "output": {
+ "ApplicationMetrics": {
+ "Duration": 10,
+ "Latency": {
+ "P10": 0.001,
+ "P50": 0.001,
+ "P75": 0.002,
+ "P85": 0.003,
+ "P90": 0.003,
+ "P95": 0.004,
+ "P99": 0.004,
+ "P999": 0.004
+ },
+ "RequestCount": 45,
+ "StatusCodes": {
+ "Status2xx": 45,
+ "Status3xx": 0,
+ "Status4xx": 0,
+ "Status5xx": 0
+ }
+ },
+ "Causes": [
+
+ ],
+ "Color": "Green",
+ "EnvironmentName": "my-env",
+ "HealthStatus": "Ok",
+ "InstancesHealth": {
+ "Degraded": 0,
+ "Info": 0,
+ "NoData": 0,
+ "Ok": 1,
+ "Pending": 0,
+ "Severe": 0,
+ "Unknown": 0,
+ "Warning": 0
+ },
+ "RefreshedAt": "2015-08-20T21:09:18Z"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation retrieves overall health information for an environment named my-env:",
+ "id": "to-view-environment-health-1456277109510",
+ "title": "To view environment health"
+ }
+ ],
+ "DescribeEnvironmentResources": [
+ {
+ "input": {
+ "EnvironmentName": "my-env"
+ },
+ "output": {
+ "EnvironmentResources": {
+ "AutoScalingGroups": [
+ {
+ "Name": "awseb-e-qu3fyyjyjs-stack-AWSEBAutoScalingGroup-QSB2ZO88SXZT"
+ }
+ ],
+ "EnvironmentName": "my-env",
+ "Instances": [
+ {
+ "Id": "i-0c91c786"
+ }
+ ],
+ "LaunchConfigurations": [
+ {
+ "Name": "awseb-e-qu3fyyjyjs-stack-AWSEBAutoScalingLaunchConfiguration-1UUVQIBC96TQ2"
+ }
+ ],
+ "LoadBalancers": [
+ {
+ "Name": "awseb-e-q-AWSEBLoa-1EEPZ0K98BIF0"
+ }
+ ],
+ "Queues": [
+
+ ],
+ "Triggers": [
+
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation retrieves information about resources in an environment named my-env:",
+ "id": "to-view-information-about-the-aws-resources-in-your-environment-1456277206232",
+ "title": "To view information about the AWS resources in your environment"
+ }
+ ],
+ "DescribeEnvironments": [
+ {
+ "input": {
+ "EnvironmentNames": [
+ "my-env"
+ ]
+ },
+ "output": {
+ "Environments": [
+ {
+ "AbortableOperationInProgress": false,
+ "ApplicationName": "my-app",
+ "CNAME": "my-env.elasticbeanstalk.com",
+ "DateCreated": "2015-08-07T20:48:49.599Z",
+ "DateUpdated": "2015-08-12T18:16:55.019Z",
+ "EndpointURL": "awseb-e-w-AWSEBLoa-1483140XB0Q4L-109QXY8121.us-west-2.elb.amazonaws.com",
+ "EnvironmentId": "e-rpqsewtp2j",
+ "EnvironmentName": "my-env",
+ "Health": "Green",
+ "SolutionStackName": "64bit Amazon Linux 2015.03 v2.0.0 running Tomcat 8 Java 8",
+ "Status": "Ready",
+ "Tier": {
+ "Name": "WebServer",
+ "Type": "Standard",
+ "Version": " "
+ },
+ "VersionLabel": "7f58-stage-150812_025409"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation retrieves information about an environment named my-env:",
+ "id": "to-view-information-about-an-environment-1456277288662",
+ "title": "To view information about an environment"
+ }
+ ],
+ "DescribeEvents": [
+ {
+ "input": {
+ "EnvironmentName": "my-env"
+ },
+ "output": {
+ "Events": [
+ {
+ "ApplicationName": "my-app",
+ "EnvironmentName": "my-env",
+ "EventDate": "2015-08-20T07:06:53.535Z",
+ "Message": "Environment health has transitioned from Info to Ok.",
+ "Severity": "INFO"
+ },
+ {
+ "ApplicationName": "my-app",
+ "EnvironmentName": "my-env",
+ "EventDate": "2015-08-20T07:06:02.049Z",
+ "Message": "Environment update completed successfully.",
+ "RequestId": "b7f3960b-4709-11e5-ba1e-07e16200da41",
+ "Severity": "INFO"
+ },
+ {
+ "ApplicationName": "my-app",
+ "EnvironmentName": "my-env",
+ "EventDate": "2015-08-13T19:16:27.561Z",
+ "Message": "Using elasticbeanstalk-us-west-2-012445113685 as Amazon S3 storage bucket for environment data.",
+ "RequestId": "ca8dfbf6-41ef-11e5-988b-651aa638f46b",
+ "Severity": "INFO"
+ },
+ {
+ "ApplicationName": "my-app",
+ "EnvironmentName": "my-env",
+ "EventDate": "2015-08-13T19:16:26.581Z",
+ "Message": "createEnvironment is starting.",
+ "RequestId": "cdfba8f6-41ef-11e5-988b-65638f41aa6b",
+ "Severity": "INFO"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation retrieves events for an environment named my-env:",
+ "id": "to-view-events-for-an-environment-1456277367589",
+ "title": "To view events for an environment"
+ }
+ ],
+ "DescribeInstancesHealth": [
+ {
+ "input": {
+ "AttributeNames": [
+ "All"
+ ],
+ "EnvironmentName": "my-env"
+ },
+ "output": {
+ "InstanceHealthList": [
+ {
+ "ApplicationMetrics": {
+ "Duration": 10,
+ "Latency": {
+ "P10": 0,
+ "P50": 0.001,
+ "P75": 0.002,
+ "P85": 0.003,
+ "P90": 0.004,
+ "P95": 0.005,
+ "P99": 0.006,
+ "P999": 0.006
+ },
+ "RequestCount": 48,
+ "StatusCodes": {
+ "Status2xx": 47,
+ "Status3xx": 0,
+ "Status4xx": 1,
+ "Status5xx": 0
+ }
+ },
+ "Causes": [
+
+ ],
+ "Color": "Green",
+ "HealthStatus": "Ok",
+ "InstanceId": "i-08691cc7",
+ "LaunchedAt": "2015-08-13T19:17:09Z",
+ "System": {
+ "CPUUtilization": {
+ "IOWait": 0.2,
+ "IRQ": 0,
+ "Idle": 97.8,
+ "Nice": 0.1,
+ "SoftIRQ": 0.1,
+ "System": 0.3,
+ "User": 1.5
+ },
+ "LoadAverage": [
+ 0,
+ 0.02,
+ 0.05
+ ]
+ }
+ }
+ ],
+ "RefreshedAt": "2015-08-20T21:09:08Z"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation retrieves health information for instances in an environment named my-env:",
+ "id": "to-view-environment-health-1456277424757",
+ "title": "To view environment health"
+ }
+ ],
+ "ListAvailableSolutionStacks": [
+ {
+ "output": {
+ "SolutionStackDetails": [
+ {
+ "PermittedFileTypes": [
+ "zip"
+ ],
+ "SolutionStackName": "64bit Amazon Linux 2015.03 v2.0.0 running Node.js"
+ }
+ ],
+ "SolutionStacks": [
+ "64bit Amazon Linux 2015.03 v2.0.0 running Node.js",
+ "64bit Amazon Linux 2015.03 v2.0.0 running PHP 5.6",
+ "64bit Amazon Linux 2015.03 v2.0.0 running PHP 5.5",
+ "64bit Amazon Linux 2015.03 v2.0.0 running PHP 5.4",
+ "64bit Amazon Linux 2015.03 v2.0.0 running Python 3.4",
+ "64bit Amazon Linux 2015.03 v2.0.0 running Python 2.7",
+ "64bit Amazon Linux 2015.03 v2.0.0 running Python",
+ "64bit Amazon Linux 2015.03 v2.0.0 running Ruby 2.2 (Puma)",
+ "64bit Amazon Linux 2015.03 v2.0.0 running Ruby 2.2 (Passenger Standalone)",
+ "64bit Amazon Linux 2015.03 v2.0.0 running Ruby 2.1 (Puma)",
+ "64bit Amazon Linux 2015.03 v2.0.0 running Ruby 2.1 (Passenger Standalone)",
+ "64bit Amazon Linux 2015.03 v2.0.0 running Ruby 2.0 (Puma)",
+ "64bit Amazon Linux 2015.03 v2.0.0 running Ruby 2.0 (Passenger Standalone)",
+ "64bit Amazon Linux 2015.03 v2.0.0 running Ruby 1.9.3",
+ "64bit Amazon Linux 2015.03 v2.0.0 running Tomcat 8 Java 8",
+ "64bit Amazon Linux 2015.03 v2.0.0 running Tomcat 7 Java 7",
+ "64bit Amazon Linux 2015.03 v2.0.0 running Tomcat 7 Java 6",
+ "64bit Windows Server Core 2012 R2 running IIS 8.5",
+ "64bit Windows Server 2012 R2 running IIS 8.5",
+ "64bit Windows Server 2012 running IIS 8",
+ "64bit Windows Server 2008 R2 running IIS 7.5",
+ "64bit Amazon Linux 2015.03 v2.0.0 running Docker 1.6.2",
+ "64bit Amazon Linux 2015.03 v2.0.0 running Multi-container Docker 1.6.2 (Generic)",
+ "64bit Debian jessie v2.0.0 running GlassFish 4.1 Java 8 (Preconfigured - Docker)",
+ "64bit Debian jessie v2.0.0 running GlassFish 4.0 Java 7 (Preconfigured - Docker)",
+ "64bit Debian jessie v2.0.0 running Go 1.4 (Preconfigured - Docker)",
+ "64bit Debian jessie v2.0.0 running Go 1.3 (Preconfigured - Docker)",
+ "64bit Debian jessie v2.0.0 running Python 3.4 (Preconfigured - Docker)"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation lists solution stacks for all currently available platform configurations and any that you have used in the past:",
+ "id": "to-view-solution-stacks-1456277504811",
+ "title": "To view solution stacks"
+ }
+ ],
+ "RebuildEnvironment": [
+ {
+ "input": {
+ "EnvironmentName": "my-env"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation terminates and recreates the resources in an environment named my-env:",
+ "id": "to-rebuild-an-environment-1456277600918",
+ "title": "To rebuild an environment"
+ }
+ ],
+ "RequestEnvironmentInfo": [
+ {
+ "input": {
+ "EnvironmentName": "my-env",
+ "InfoType": "tail"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation requests logs from an environment named my-env:",
+ "id": "to-request-tailed-logs-1456277657045",
+ "title": "To request tailed logs"
+ }
+ ],
+ "RestartAppServer": [
+ {
+ "input": {
+ "EnvironmentName": "my-env"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation restarts application servers on all instances in an environment named my-env:",
+ "id": "to-restart-application-servers-1456277739302",
+ "title": "To restart application servers"
+ }
+ ],
+ "RetrieveEnvironmentInfo": [
+ {
+ "input": {
+ "EnvironmentName": "my-env",
+ "InfoType": "tail"
+ },
+ "output": {
+ "EnvironmentInfo": [
+ {
+ "Ec2InstanceId": "i-09c1c867",
+ "InfoType": "tail",
+ "Message": "https://elasticbeanstalk-us-west-2-0123456789012.s3.amazonaws.com/resources/environments/logs/tail/e-fyqyju3yjs/i-09c1c867/TailLogs-1440109397703.out?AWSAccessKeyId=AKGPT4J56IAJ2EUBL5CQ&Expires=1440195891&Signature=n%2BEalOV6A2HIOx4Rcfb7LT16bBM%3D",
+ "SampleTimestamp": "2015-08-20T22:23:17.703Z"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation retrieves a link to logs from an environment named my-env:",
+ "id": "to-retrieve-tailed-logs-1456277792734",
+ "title": "To retrieve tailed logs"
+ }
+ ],
+ "SwapEnvironmentCNAMEs": [
+ {
+ "input": {
+ "DestinationEnvironmentName": "my-env-green",
+ "SourceEnvironmentName": "my-env-blue"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation swaps the assigned subdomains of two environments:",
+ "id": "to-swap-environment-cnames-1456277839438",
+ "title": "To swap environment CNAMES"
+ }
+ ],
+ "TerminateEnvironment": [
+ {
+ "input": {
+ "EnvironmentName": "my-env"
+ },
+ "output": {
+ "AbortableOperationInProgress": false,
+ "ApplicationName": "my-app",
+ "CNAME": "my-env.elasticbeanstalk.com",
+ "DateCreated": "2015-08-12T18:52:53.622Z",
+ "DateUpdated": "2015-08-12T19:05:54.744Z",
+ "EndpointURL": "awseb-e-f-AWSEBLoa-1I9XUMP4-8492WNUP202574.us-west-2.elb.amazonaws.com",
+ "EnvironmentId": "e-fh2eravpns",
+ "EnvironmentName": "my-env",
+ "Health": "Grey",
+ "SolutionStackName": "64bit Amazon Linux 2015.03 v2.0.0 running Tomcat 8 Java 8",
+ "Status": "Terminating",
+ "Tier": {
+ "Name": "WebServer",
+ "Type": "Standard",
+ "Version": " "
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation terminates an Elastic Beanstalk environment named my-env:",
+ "id": "to-terminate-an-environment-1456277888556",
+ "title": "To terminate an environment"
+ }
+ ],
+ "UpdateApplication": [
+ {
+ "input": {
+ "ApplicationName": "my-app",
+ "Description": "my Elastic Beanstalk application"
+ },
+ "output": {
+ "Application": {
+ "ApplicationName": "my-app",
+ "ConfigurationTemplates": [
+
+ ],
+ "DateCreated": "2015-08-13T19:15:50.449Z",
+ "DateUpdated": "2015-08-20T22:34:56.195Z",
+ "Description": "my Elastic Beanstalk application",
+ "Versions": [
+ "2fba-stage-150819_234450",
+ "bf07-stage-150820_214945",
+ "93f8",
+ "fd7c-stage-150820_000431",
+ "22a0-stage-150819_185942"
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation updates the description of an application named my-app:",
+ "id": "to-change-an-applications-description-1456277957075",
+ "title": "To change an application's description"
+ }
+ ],
+ "UpdateApplicationVersion": [
+ {
+ "input": {
+ "ApplicationName": "my-app",
+ "Description": "new description",
+ "VersionLabel": "22a0-stage-150819_185942"
+ },
+ "output": {
+ "ApplicationVersion": {
+ "ApplicationName": "my-app",
+ "DateCreated": "2015-08-19T18:59:17.646Z",
+ "DateUpdated": "2015-08-20T22:53:28.871Z",
+ "Description": "new description",
+ "SourceBundle": {
+ "S3Bucket": "elasticbeanstalk-us-west-2-0123456789012",
+ "S3Key": "my-app/22a0-stage-150819_185942.war"
+ },
+ "VersionLabel": "22a0-stage-150819_185942"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation updates the description of an application version named 22a0-stage-150819_185942:",
+ "id": "to-change-an-application-versions-description-1456278019237",
+ "title": "To change an application version's description"
+ }
+ ],
+ "UpdateConfigurationTemplate": [
+ {
+ "input": {
+ "ApplicationName": "my-app",
+ "OptionsToRemove": [
+ {
+ "Namespace": "aws:elasticbeanstalk:healthreporting:system",
+ "OptionName": "ConfigDocument"
+ }
+ ],
+ "TemplateName": "my-template"
+ },
+ "output": {
+ "ApplicationName": "my-app",
+ "DateCreated": "2015-08-20T22:39:31Z",
+ "DateUpdated": "2015-08-20T22:43:11Z",
+ "SolutionStackName": "64bit Amazon Linux 2015.03 v2.0.0 running Tomcat 8 Java 8",
+ "TemplateName": "my-template"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation removes the configured CloudWatch custom health metrics configuration ConfigDocument from a saved configuration template named my-template:",
+ "id": "to-update-a-configuration-template-1456278075300",
+ "title": "To update a configuration template"
+ }
+ ],
+ "UpdateEnvironment": [
+ {
+ "input": {
+ "EnvironmentName": "my-env",
+ "VersionLabel": "v2"
+ },
+ "output": {
+ "ApplicationName": "my-app",
+ "CNAME": "my-env.elasticbeanstalk.com",
+ "DateCreated": "2015-02-03T23:04:54.453Z",
+ "DateUpdated": "2015-02-03T23:12:29.119Z",
+ "EndpointURL": "awseb-e-i-AWSEBLoa-1RDLX6TC9VUAO-0123456789.us-west-2.elb.amazonaws.com",
+ "EnvironmentId": "e-szqipays4h",
+ "EnvironmentName": "my-env",
+ "Health": "Grey",
+ "SolutionStackName": "64bit Amazon Linux running Tomcat 7",
+ "Status": "Updating",
+ "Tier": {
+ "Name": "WebServer",
+ "Type": "Standard",
+ "Version": " "
+ },
+ "VersionLabel": "v2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation updates an environment named \"my-env\" to version \"v2\" of the application to which it belongs:",
+ "id": "to-update-an-environment-to-a-new-version-1456278210718",
+ "title": "To update an environment to a new version"
+ },
+ {
+ "input": {
+ "EnvironmentName": "my-env",
+ "OptionSettings": [
+ {
+ "Namespace": "aws:elb:healthcheck",
+ "OptionName": "Interval",
+ "Value": "15"
+ },
+ {
+ "Namespace": "aws:elb:healthcheck",
+ "OptionName": "Timeout",
+ "Value": "8"
+ },
+ {
+ "Namespace": "aws:elb:healthcheck",
+ "OptionName": "HealthyThreshold",
+ "Value": "2"
+ },
+ {
+ "Namespace": "aws:elb:healthcheck",
+ "OptionName": "UnhealthyThreshold",
+ "Value": "3"
+ }
+ ]
+ },
+ "output": {
+ "AbortableOperationInProgress": true,
+ "ApplicationName": "my-app",
+ "CNAME": "my-env.elasticbeanstalk.com",
+ "DateCreated": "2015-08-07T20:48:49.599Z",
+ "DateUpdated": "2015-08-12T18:15:23.804Z",
+ "EndpointURL": "awseb-e-w-AWSEBLoa-14XB83101Q4L-104QXY80921.sa-east-1.elb.amazonaws.com",
+ "EnvironmentId": "e-wtp2rpqsej",
+ "EnvironmentName": "my-env",
+ "Health": "Grey",
+ "SolutionStackName": "64bit Amazon Linux 2015.03 v2.0.0 running Tomcat 8 Java 8",
+ "Status": "Updating",
+ "Tier": {
+ "Name": "WebServer",
+ "Type": "Standard",
+ "Version": " "
+ },
+ "VersionLabel": "7f58-stage-150812_025409"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation configures several options in the aws:elb:loadbalancer namespace:",
+ "id": "to-configure-option-settings-1456278286349",
+ "title": "To configure option settings"
+ }
+ ],
+ "ValidateConfigurationSettings": [
+ {
+ "input": {
+ "ApplicationName": "my-app",
+ "EnvironmentName": "my-env",
+ "OptionSettings": [
+ {
+ "Namespace": "aws:elasticbeanstalk:healthreporting:system",
+ "OptionName": "ConfigDocument",
+ "Value": "{\"CloudWatchMetrics\": {\"Environment\": {\"ApplicationLatencyP99.9\": null,\"InstancesSevere\": 60,\"ApplicationLatencyP90\": 60,\"ApplicationLatencyP99\": null,\"ApplicationLatencyP95\": 60,\"InstancesUnknown\": 60,\"ApplicationLatencyP85\": 60,\"InstancesInfo\": null,\"ApplicationRequests2xx\": null,\"InstancesDegraded\": null,\"InstancesWarning\": 60,\"ApplicationLatencyP50\": 60,\"ApplicationRequestsTotal\": null,\"InstancesNoData\": null,\"InstancesPending\": 60,\"ApplicationLatencyP10\": null,\"ApplicationRequests5xx\": null,\"ApplicationLatencyP75\": null,\"InstancesOk\": 60,\"ApplicationRequests3xx\": null,\"ApplicationRequests4xx\": null},\"Instance\": {\"ApplicationLatencyP99.9\": null,\"ApplicationLatencyP90\": 60,\"ApplicationLatencyP99\": null,\"ApplicationLatencyP95\": null,\"ApplicationLatencyP85\": null,\"CPUUser\": 60,\"ApplicationRequests2xx\": null,\"CPUIdle\": null,\"ApplicationLatencyP50\": null,\"ApplicationRequestsTotal\": 60,\"RootFilesystemUtil\": null,\"LoadAverage1min\": null,\"CPUIrq\": null,\"CPUNice\": 60,\"CPUIowait\": 60,\"ApplicationLatencyP10\": null,\"LoadAverage5min\": null,\"ApplicationRequests5xx\": null,\"ApplicationLatencyP75\": 60,\"CPUSystem\": 60,\"ApplicationRequests3xx\": 60,\"ApplicationRequests4xx\": null,\"InstanceHealth\": null,\"CPUSoftirq\": 60}},\"Version\": 1}"
+ }
+ ]
+ },
+ "output": {
+ "Messages": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation validates a CloudWatch custom metrics config document:",
+ "id": "to-validate-configuration-settings-1456278393654",
+ "title": "To validate configuration settings"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elasticbeanstalk/2010-12-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/elasticbeanstalk/2010-12-01/paginators-1.json
new file mode 100644
index 00000000..4f53c866
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elasticbeanstalk/2010-12-01/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "DescribeEvents": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxRecords",
+ "result_key": "Events"
+ },
+ "DescribeApplicationVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxRecords",
+ "output_token": "NextToken",
+ "result_key": "ApplicationVersions"
+ },
+ "DescribeEnvironmentManagedActionHistory": {
+ "input_token": "NextToken",
+ "limit_key": "MaxItems",
+ "output_token": "NextToken",
+ "result_key": "ManagedActionHistoryItems"
+ },
+ "DescribeEnvironments": {
+ "input_token": "NextToken",
+ "limit_key": "MaxRecords",
+ "output_token": "NextToken",
+ "result_key": "Environments"
+ },
+ "ListPlatformVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxRecords",
+ "output_token": "NextToken",
+ "result_key": "PlatformSummaryList"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elasticbeanstalk/2010-12-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/elasticbeanstalk/2010-12-01/service-2.json.gz
new file mode 100644
index 00000000..42371fd1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elasticbeanstalk/2010-12-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elasticbeanstalk/2010-12-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/elasticbeanstalk/2010-12-01/waiters-2.json
new file mode 100644
index 00000000..4fb906b4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elasticbeanstalk/2010-12-01/waiters-2.json
@@ -0,0 +1,63 @@
+{
+ "version": 2,
+ "waiters": {
+ "EnvironmentExists": {
+ "delay": 20,
+ "maxAttempts": 20,
+ "operation": "DescribeEnvironments",
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "Environments[].Status",
+ "expected": "Ready"
+ },
+ {
+ "state": "retry",
+ "matcher": "pathAll",
+ "argument": "Environments[].Status",
+ "expected": "Launching"
+ }
+ ]
+ },
+ "EnvironmentUpdated": {
+ "delay": 20,
+ "maxAttempts": 20,
+ "operation": "DescribeEnvironments",
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "Environments[].Status",
+ "expected": "Ready"
+ },
+ {
+ "state": "retry",
+ "matcher": "pathAll",
+ "argument": "Environments[].Status",
+ "expected": "Updating"
+ }
+ ]
+ },
+ "EnvironmentTerminated": {
+ "delay": 20,
+ "maxAttempts": 20,
+ "operation": "DescribeEnvironments",
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "Environments[].Status",
+ "expected": "Terminated"
+ },
+ {
+ "state": "retry",
+ "matcher": "pathAll",
+ "argument": "Environments[].Status",
+ "expected": "Terminating"
+ }
+ ]
+ }
+ }
+}
+
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elastictranscoder/2012-09-25/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/elastictranscoder/2012-09-25/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..c96f2c67
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elastictranscoder/2012-09-25/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elastictranscoder/2012-09-25/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/elastictranscoder/2012-09-25/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elastictranscoder/2012-09-25/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elastictranscoder/2012-09-25/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/elastictranscoder/2012-09-25/paginators-1.json
new file mode 100644
index 00000000..5a145d36
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elastictranscoder/2012-09-25/paginators-1.json
@@ -0,0 +1,24 @@
+{
+ "pagination": {
+ "ListJobsByPipeline": {
+ "input_token": "PageToken",
+ "output_token": "NextPageToken",
+ "result_key": "Jobs"
+ },
+ "ListJobsByStatus": {
+ "input_token": "PageToken",
+ "output_token": "NextPageToken",
+ "result_key": "Jobs"
+ },
+ "ListPipelines": {
+ "input_token": "PageToken",
+ "output_token": "NextPageToken",
+ "result_key": "Pipelines"
+ },
+ "ListPresets": {
+ "input_token": "PageToken",
+ "output_token": "NextPageToken",
+ "result_key": "Presets"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elastictranscoder/2012-09-25/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/elastictranscoder/2012-09-25/service-2.json.gz
new file mode 100644
index 00000000..56c646ca
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elastictranscoder/2012-09-25/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elastictranscoder/2012-09-25/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/elastictranscoder/2012-09-25/waiters-2.json
new file mode 100644
index 00000000..55c36280
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elastictranscoder/2012-09-25/waiters-2.json
@@ -0,0 +1,30 @@
+{
+ "version": 2,
+ "waiters": {
+ "JobComplete": {
+ "delay": 30,
+ "operation": "ReadJob",
+ "maxAttempts": 120,
+ "acceptors": [
+ {
+ "expected": "Complete",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Job.Status"
+ },
+ {
+ "expected": "Canceled",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "Job.Status"
+ },
+ {
+ "expected": "Error",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "Job.Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elb/2012-06-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/elb/2012-06-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..e0be4296
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elb/2012-06-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elb/2012-06-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/elb/2012-06-01/examples-1.json
new file mode 100644
index 00000000..ce50fdd1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elb/2012-06-01/examples-1.json
@@ -0,0 +1,1036 @@
+{
+ "version": "1.0",
+ "examples": {
+ "AddTags": [
+ {
+ "input": {
+ "LoadBalancerNames": [
+ "my-load-balancer"
+ ],
+ "Tags": [
+ {
+ "Key": "project",
+ "Value": "lima"
+ },
+ {
+ "Key": "department",
+ "Value": "digital-media"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example adds two tags to the specified load balancer.",
+ "id": "elb-add-tags-1",
+ "title": "To add tags to a load balancer"
+ }
+ ],
+ "ApplySecurityGroupsToLoadBalancer": [
+ {
+ "input": {
+ "LoadBalancerName": "my-load-balancer",
+ "SecurityGroups": [
+ "sg-fc448899"
+ ]
+ },
+ "output": {
+ "SecurityGroups": [
+ "sg-fc448899"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates a security group with the specified load balancer in a VPC.",
+ "id": "elb-apply-security-groups-to-load-balancer-1",
+ "title": "To associate a security group with a load balancer in a VPC"
+ }
+ ],
+ "AttachLoadBalancerToSubnets": [
+ {
+ "input": {
+ "LoadBalancerName": "my-load-balancer",
+ "Subnets": [
+ "subnet-0ecac448"
+ ]
+ },
+ "output": {
+ "Subnets": [
+ "subnet-15aaab61",
+ "subnet-0ecac448"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example adds the specified subnet to the set of configured subnets for the specified load balancer.",
+ "id": "elb-attach-load-balancer-to-subnets-1",
+ "title": "To attach subnets to a load balancer"
+ }
+ ],
+ "ConfigureHealthCheck": [
+ {
+ "input": {
+ "HealthCheck": {
+ "HealthyThreshold": 2,
+ "Interval": 30,
+ "Target": "HTTP:80/png",
+ "Timeout": 3,
+ "UnhealthyThreshold": 2
+ },
+ "LoadBalancerName": "my-load-balancer"
+ },
+ "output": {
+ "HealthCheck": {
+ "HealthyThreshold": 2,
+ "Interval": 30,
+ "Target": "HTTP:80/png",
+ "Timeout": 3,
+ "UnhealthyThreshold": 2
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example specifies the health check settings used to evaluate the health of your backend EC2 instances.",
+ "id": "elb-configure-health-check-1",
+ "title": "To specify the health check settings for your backend EC2 instances"
+ }
+ ],
+ "CreateAppCookieStickinessPolicy": [
+ {
+ "input": {
+ "CookieName": "my-app-cookie",
+ "LoadBalancerName": "my-load-balancer",
+ "PolicyName": "my-app-cookie-policy"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example generates a stickiness policy that follows the sticky session lifetimes of the application-generated cookie.",
+ "id": "elb-create-app-cookie-stickiness-policy-1",
+ "title": "To generate a stickiness policy for your load balancer"
+ }
+ ],
+ "CreateLBCookieStickinessPolicy": [
+ {
+ "input": {
+ "CookieExpirationPeriod": 60,
+ "LoadBalancerName": "my-load-balancer",
+ "PolicyName": "my-duration-cookie-policy"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example generates a stickiness policy with sticky session lifetimes controlled by the specified expiration period.",
+ "id": "elb-create-lb-cookie-stickiness-policy-1",
+ "title": "To generate a duration-based stickiness policy for your load balancer"
+ }
+ ],
+ "CreateLoadBalancer": [
+ {
+ "input": {
+ "Listeners": [
+ {
+ "InstancePort": 80,
+ "InstanceProtocol": "HTTP",
+ "LoadBalancerPort": 80,
+ "Protocol": "HTTP"
+ }
+ ],
+ "LoadBalancerName": "my-load-balancer",
+ "SecurityGroups": [
+ "sg-a61988c3"
+ ],
+ "Subnets": [
+ "subnet-15aaab61"
+ ]
+ },
+ "output": {
+ "DNSName": "my-load-balancer-1234567890.us-west-2.elb.amazonaws.com"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a load balancer with an HTTP listener in a VPC.",
+ "id": "elb-create-load-balancer-1",
+ "title": "To create an HTTP load balancer in a VPC"
+ },
+ {
+ "input": {
+ "AvailabilityZones": [
+ "us-west-2a"
+ ],
+ "Listeners": [
+ {
+ "InstancePort": 80,
+ "InstanceProtocol": "HTTP",
+ "LoadBalancerPort": 80,
+ "Protocol": "HTTP"
+ }
+ ],
+ "LoadBalancerName": "my-load-balancer"
+ },
+ "output": {
+ "DNSName": "my-load-balancer-123456789.us-west-2.elb.amazonaws.com"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a load balancer with an HTTP listener in EC2-Classic.",
+ "id": "elb-create-load-balancer-2",
+ "title": "To create an HTTP load balancer in EC2-Classic"
+ },
+ {
+ "input": {
+ "Listeners": [
+ {
+ "InstancePort": 80,
+ "InstanceProtocol": "HTTP",
+ "LoadBalancerPort": 80,
+ "Protocol": "HTTP"
+ },
+ {
+ "InstancePort": 80,
+ "InstanceProtocol": "HTTP",
+ "LoadBalancerPort": 443,
+ "Protocol": "HTTPS",
+ "SSLCertificateId": "arn:aws:iam::123456789012:server-certificate/my-server-cert"
+ }
+ ],
+ "LoadBalancerName": "my-load-balancer",
+ "SecurityGroups": [
+ "sg-a61988c3"
+ ],
+ "Subnets": [
+ "subnet-15aaab61"
+ ]
+ },
+ "output": {
+ "DNSName": "my-load-balancer-1234567890.us-west-2.elb.amazonaws.com"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a load balancer with an HTTPS listener in a VPC.",
+ "id": "elb-create-load-balancer-3",
+ "title": "To create an HTTPS load balancer in a VPC"
+ },
+ {
+ "input": {
+ "AvailabilityZones": [
+ "us-west-2a"
+ ],
+ "Listeners": [
+ {
+ "InstancePort": 80,
+ "InstanceProtocol": "HTTP",
+ "LoadBalancerPort": 80,
+ "Protocol": "HTTP"
+ },
+ {
+ "InstancePort": 80,
+ "InstanceProtocol": "HTTP",
+ "LoadBalancerPort": 443,
+ "Protocol": "HTTPS",
+ "SSLCertificateId": "arn:aws:iam::123456789012:server-certificate/my-server-cert"
+ }
+ ],
+ "LoadBalancerName": "my-load-balancer"
+ },
+ "output": {
+ "DNSName": "my-load-balancer-123456789.us-west-2.elb.amazonaws.com"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a load balancer with an HTTPS listener in EC2-Classic.",
+ "id": "elb-create-load-balancer-4",
+ "title": "To create an HTTPS load balancer in EC2-Classic"
+ },
+ {
+ "input": {
+ "Listeners": [
+ {
+ "InstancePort": 80,
+ "InstanceProtocol": "HTTP",
+ "LoadBalancerPort": 80,
+ "Protocol": "HTTP"
+ }
+ ],
+ "LoadBalancerName": "my-load-balancer",
+ "Scheme": "internal",
+ "SecurityGroups": [
+ "sg-a61988c3"
+ ],
+ "Subnets": [
+ "subnet-15aaab61"
+ ]
+ },
+ "output": {
+ "DNSName": "internal-my-load-balancer-123456789.us-west-2.elb.amazonaws.com"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an internal load balancer with an HTTP listener in a VPC.",
+ "id": "elb-create-load-balancer-5",
+ "title": "To create an internal load balancer"
+ }
+ ],
+ "CreateLoadBalancerListeners": [
+ {
+ "input": {
+ "Listeners": [
+ {
+ "InstancePort": 80,
+ "InstanceProtocol": "HTTP",
+ "LoadBalancerPort": 80,
+ "Protocol": "HTTP"
+ }
+ ],
+ "LoadBalancerName": "my-load-balancer"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a listener for your load balancer at port 80 using the HTTP protocol.",
+ "id": "elb-create-load-balancer-listeners-1",
+ "title": "To create an HTTP listener for a load balancer"
+ },
+ {
+ "input": {
+ "Listeners": [
+ {
+ "InstancePort": 80,
+ "InstanceProtocol": "HTTP",
+ "LoadBalancerPort": 443,
+ "Protocol": "HTTPS",
+ "SSLCertificateId": "arn:aws:iam::123456789012:server-certificate/my-server-cert"
+ }
+ ],
+ "LoadBalancerName": "my-load-balancer"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a listener for your load balancer at port 443 using the HTTPS protocol.",
+ "id": "elb-create-load-balancer-listeners-2",
+ "title": "To create an HTTPS listener for a load balancer"
+ }
+ ],
+ "CreateLoadBalancerPolicy": [
+ {
+ "input": {
+ "LoadBalancerName": "my-load-balancer",
+ "PolicyAttributes": [
+ {
+ "AttributeName": "ProxyProtocol",
+ "AttributeValue": "true"
+ }
+ ],
+ "PolicyName": "my-ProxyProtocol-policy",
+ "PolicyTypeName": "ProxyProtocolPolicyType"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a policy that enables Proxy Protocol on the specified load balancer.",
+ "id": "elb-create-load-balancer-policy-1",
+ "title": "To create a policy that enables Proxy Protocol on a load balancer"
+ },
+ {
+ "input": {
+ "LoadBalancerName": "my-load-balancer",
+ "PolicyAttributes": [
+ {
+ "AttributeName": "PublicKey",
+ "AttributeValue": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwAYUjnfyEyXr1pxjhFWBpMlggUcqoi3kl+dS74kj//c6x7ROtusUaeQCTgIUkayttRDWchuqo1pHC1u+n5xxXnBBe2ejbb2WRsKIQ5rXEeixsjFpFsojpSQKkzhVGI6mJVZBJDVKSHmswnwLBdofLhzvllpovBPTHe+o4haAWvDBALJU0pkSI1FecPHcs2hwxf14zHoXy1e2k36A64nXW43wtfx5qcVSIxtCEOjnYRg7RPvybaGfQ+v6Iaxb/+7J5kEvZhTFQId+bSiJImF1FSUT1W1xwzBZPUbcUkkXDj45vC2s3Z8E+Lk7a3uZhvsQHLZnrfuWjBWGWvZ/MhZYgEXAMPLE"
+ }
+ ],
+ "PolicyName": "my-PublicKey-policy",
+ "PolicyTypeName": "PublicKeyPolicyType"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a public key policy.",
+ "id": "elb-create-load-balancer-policy-2",
+ "title": "To create a public key policy"
+ },
+ {
+ "input": {
+ "LoadBalancerName": "my-load-balancer",
+ "PolicyAttributes": [
+ {
+ "AttributeName": "PublicKeyPolicyName",
+ "AttributeValue": "my-PublicKey-policy"
+ }
+ ],
+ "PolicyName": "my-authentication-policy",
+ "PolicyTypeName": "BackendServerAuthenticationPolicyType"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a backend server authentication policy that enables authentication on your backend instance using a public key policy.",
+ "id": "elb-create-load-balancer-policy-3",
+ "title": "To create a backend server authentication policy"
+ }
+ ],
+ "DeleteLoadBalancer": [
+ {
+ "input": {
+ "LoadBalancerName": "my-load-balancer"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified load balancer.",
+ "id": "elb-delete-load-balancer-1",
+ "title": "To delete a load balancer"
+ }
+ ],
+ "DeleteLoadBalancerListeners": [
+ {
+ "input": {
+ "LoadBalancerName": "my-load-balancer",
+ "LoadBalancerPorts": [
+ 80
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the listener for the specified port from the specified load balancer.",
+ "id": "elb-delete-load-balancer-listeners-1",
+ "title": "To delete a listener from your load balancer"
+ }
+ ],
+ "DeleteLoadBalancerPolicy": [
+ {
+ "input": {
+ "LoadBalancerName": "my-load-balancer",
+ "PolicyName": "my-duration-cookie-policy"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified policy from the specified load balancer. The policy must not be enabled on any listener.",
+ "id": "elb-delete-load-balancer-policy-1",
+ "title": "To delete a policy from your load balancer"
+ }
+ ],
+ "DeregisterInstancesFromLoadBalancer": [
+ {
+ "input": {
+ "Instances": [
+ {
+ "InstanceId": "i-d6f6fae3"
+ }
+ ],
+ "LoadBalancerName": "my-load-balancer"
+ },
+ "output": {
+ "Instances": [
+ {
+ "InstanceId": "i-207d9717"
+ },
+ {
+ "InstanceId": "i-afefb49b"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deregisters the specified instance from the specified load balancer.",
+ "id": "elb-deregister-instances-from-load-balancer-1",
+ "title": "To deregister instances from a load balancer"
+ }
+ ],
+ "DescribeInstanceHealth": [
+ {
+ "input": {
+ "LoadBalancerName": "my-load-balancer"
+ },
+ "output": {
+ "InstanceStates": [
+ {
+ "Description": "N/A",
+ "InstanceId": "i-207d9717",
+ "ReasonCode": "N/A",
+ "State": "InService"
+ },
+ {
+ "Description": "N/A",
+ "InstanceId": "i-afefb49b",
+ "ReasonCode": "N/A",
+ "State": "InService"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the health of the instances for the specified load balancer.",
+ "id": "elb-describe-instance-health-1",
+ "title": "To describe the health of the instances for a load balancer"
+ }
+ ],
+ "DescribeLoadBalancerAttributes": [
+ {
+ "input": {
+ "LoadBalancerName": "my-load-balancer"
+ },
+ "output": {
+ "LoadBalancerAttributes": {
+ "AccessLog": {
+ "Enabled": false
+ },
+ "ConnectionDraining": {
+ "Enabled": false,
+ "Timeout": 300
+ },
+ "ConnectionSettings": {
+ "IdleTimeout": 60
+ },
+ "CrossZoneLoadBalancing": {
+ "Enabled": false
+ }
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the attributes of the specified load balancer.",
+ "id": "elb-describe-load-balancer-attributes-1",
+ "title": "To describe the attributes of a load balancer"
+ }
+ ],
+ "DescribeLoadBalancerPolicies": [
+ {
+ "input": {
+ "LoadBalancerName": "my-load-balancer",
+ "PolicyNames": [
+ "my-authentication-policy"
+ ]
+ },
+ "output": {
+ "PolicyDescriptions": [
+ {
+ "PolicyAttributeDescriptions": [
+ {
+ "AttributeName": "PublicKeyPolicyName",
+ "AttributeValue": "my-PublicKey-policy"
+ }
+ ],
+ "PolicyName": "my-authentication-policy",
+ "PolicyTypeName": "BackendServerAuthenticationPolicyType"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified policy associated with the specified load balancer.",
+ "id": "elb-describe-load-balancer-policies-1",
+ "title": "To describe a policy associated with a load balancer"
+ }
+ ],
+ "DescribeLoadBalancerPolicyTypes": [
+ {
+ "input": {
+ "PolicyTypeNames": [
+ "ProxyProtocolPolicyType"
+ ]
+ },
+ "output": {
+ "PolicyTypeDescriptions": [
+ {
+ "Description": "Policy that controls whether to include the IP address and port of the originating request for TCP messages. This policy operates on TCP listeners only.",
+ "PolicyAttributeTypeDescriptions": [
+ {
+ "AttributeName": "ProxyProtocol",
+ "AttributeType": "Boolean",
+ "Cardinality": "ONE"
+ }
+ ],
+ "PolicyTypeName": "ProxyProtocolPolicyType"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified load balancer policy type.",
+ "id": "elb-describe-load-balancer-policy-types-1",
+ "title": "To describe a load balancer policy type defined by Elastic Load Balancing"
+ }
+ ],
+ "DescribeLoadBalancers": [
+ {
+ "input": {
+ "LoadBalancerNames": [
+ "my-load-balancer"
+ ]
+ },
+ "output": {
+ "LoadBalancerDescriptions": [
+ {
+ "AvailabilityZones": [
+ "us-west-2a"
+ ],
+ "BackendServerDescriptions": [
+ {
+ "InstancePort": 80,
+ "PolicyNames": [
+ "my-ProxyProtocol-policy"
+ ]
+ }
+ ],
+ "CanonicalHostedZoneName": "my-load-balancer-1234567890.us-west-2.elb.amazonaws.com",
+ "CanonicalHostedZoneNameID": "Z3DZXE0EXAMPLE",
+ "CreatedTime": "2015-03-19T03:24:02.650Z",
+ "DNSName": "my-load-balancer-1234567890.us-west-2.elb.amazonaws.com",
+ "HealthCheck": {
+ "HealthyThreshold": 2,
+ "Interval": 30,
+ "Target": "HTTP:80/png",
+ "Timeout": 3,
+ "UnhealthyThreshold": 2
+ },
+ "Instances": [
+ {
+ "InstanceId": "i-207d9717"
+ },
+ {
+ "InstanceId": "i-afefb49b"
+ }
+ ],
+ "ListenerDescriptions": [
+ {
+ "Listener": {
+ "InstancePort": 80,
+ "InstanceProtocol": "HTTP",
+ "LoadBalancerPort": 80,
+ "Protocol": "HTTP"
+ },
+ "PolicyNames": [
+
+ ]
+ },
+ {
+ "Listener": {
+ "InstancePort": 443,
+ "InstanceProtocol": "HTTPS",
+ "LoadBalancerPort": 443,
+ "Protocol": "HTTPS",
+ "SSLCertificateId": "arn:aws:iam::123456789012:server-certificate/my-server-cert"
+ },
+ "PolicyNames": [
+ "ELBSecurityPolicy-2015-03"
+ ]
+ }
+ ],
+ "LoadBalancerName": "my-load-balancer",
+ "Policies": {
+ "AppCookieStickinessPolicies": [
+
+ ],
+ "LBCookieStickinessPolicies": [
+ {
+ "CookieExpirationPeriod": 60,
+ "PolicyName": "my-duration-cookie-policy"
+ }
+ ],
+ "OtherPolicies": [
+ "my-PublicKey-policy",
+ "my-authentication-policy",
+ "my-SSLNegotiation-policy",
+ "my-ProxyProtocol-policy",
+ "ELBSecurityPolicy-2015-03"
+ ]
+ },
+ "Scheme": "internet-facing",
+ "SecurityGroups": [
+ "sg-a61988c3"
+ ],
+ "SourceSecurityGroup": {
+ "GroupName": "my-elb-sg",
+ "OwnerAlias": "123456789012"
+ },
+ "Subnets": [
+ "subnet-15aaab61"
+ ],
+ "VPCId": "vpc-a01106c2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified load balancer.",
+ "id": "elb-describe-load-balancers-1",
+ "title": "To describe one of your load balancers"
+ }
+ ],
+ "DescribeTags": [
+ {
+ "input": {
+ "LoadBalancerNames": [
+ "my-load-balancer"
+ ]
+ },
+ "output": {
+ "TagDescriptions": [
+ {
+ "LoadBalancerName": "my-load-balancer",
+ "Tags": [
+ {
+ "Key": "project",
+ "Value": "lima"
+ },
+ {
+ "Key": "department",
+ "Value": "digital-media"
+ }
+ ]
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the tags for the specified load balancer.",
+ "id": "elb-describe-tags-1",
+ "title": "To describe the tags for a load balancer"
+ }
+ ],
+ "DetachLoadBalancerFromSubnets": [
+ {
+ "input": {
+ "LoadBalancerName": "my-load-balancer",
+ "Subnets": [
+ "subnet-0ecac448"
+ ]
+ },
+ "output": {
+ "Subnets": [
+ "subnet-15aaab61"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example detaches the specified load balancer from the specified subnet.",
+ "id": "elb-detach-load-balancer-from-subnets-1",
+ "title": "To detach a load balancer from a subnet"
+ }
+ ],
+ "DisableAvailabilityZonesForLoadBalancer": [
+ {
+ "input": {
+ "AvailabilityZones": [
+ "us-west-2a"
+ ],
+ "LoadBalancerName": "my-load-balancer"
+ },
+ "output": {
+ "AvailabilityZones": [
+ "us-west-2b"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example removes the specified Availability Zone from the set of Availability Zones for the specified load balancer.",
+ "id": "elb-disable-availability-zones-for-load-balancer-1",
+ "title": "To disable an Availability Zone for a load balancer"
+ }
+ ],
+ "EnableAvailabilityZonesForLoadBalancer": [
+ {
+ "input": {
+ "AvailabilityZones": [
+ "us-west-2b"
+ ],
+ "LoadBalancerName": "my-load-balancer"
+ },
+ "output": {
+ "AvailabilityZones": [
+ "us-west-2a",
+ "us-west-2b"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example adds the specified Availability Zone to the specified load balancer.",
+ "id": "elb-enable-availability-zones-for-load-balancer-1",
+ "title": "To enable an Availability Zone for a load balancer"
+ }
+ ],
+ "ModifyLoadBalancerAttributes": [
+ {
+ "input": {
+ "LoadBalancerAttributes": {
+ "CrossZoneLoadBalancing": {
+ "Enabled": true
+ }
+ },
+ "LoadBalancerName": "my-load-balancer"
+ },
+ "output": {
+ "LoadBalancerAttributes": {
+ "CrossZoneLoadBalancing": {
+ "Enabled": true
+ }
+ },
+ "LoadBalancerName": "my-load-balancer"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example enables cross-zone load balancing for the specified load balancer.",
+ "id": "elb-modify-load-balancer-attributes-1",
+ "title": "To enable cross-zone load balancing"
+ },
+ {
+ "input": {
+ "LoadBalancerAttributes": {
+ "ConnectionDraining": {
+ "Enabled": true,
+ "Timeout": 300
+ }
+ },
+ "LoadBalancerName": "my-load-balancer"
+ },
+ "output": {
+ "LoadBalancerAttributes": {
+ "ConnectionDraining": {
+ "Enabled": true,
+ "Timeout": 300
+ }
+ },
+ "LoadBalancerName": "my-load-balancer"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example enables connection draining for the specified load balancer.",
+ "id": "elb-modify-load-balancer-attributes-2",
+ "title": "To enable connection draining"
+ }
+ ],
+ "RegisterInstancesWithLoadBalancer": [
+ {
+ "input": {
+ "Instances": [
+ {
+ "InstanceId": "i-d6f6fae3"
+ }
+ ],
+ "LoadBalancerName": "my-load-balancer"
+ },
+ "output": {
+ "Instances": [
+ {
+ "InstanceId": "i-d6f6fae3"
+ },
+ {
+ "InstanceId": "i-207d9717"
+ },
+ {
+ "InstanceId": "i-afefb49b"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example registers the specified instance with the specified load balancer.",
+ "id": "elb-register-instances-with-load-balancer-1",
+ "title": "To register instances with a load balancer"
+ }
+ ],
+ "RemoveTags": [
+ {
+ "input": {
+ "LoadBalancerNames": [
+ "my-load-balancer"
+ ],
+ "Tags": [
+ {
+ "Key": "project"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example removes the specified tag from the specified load balancer.",
+ "id": "elb-remove-tags-1",
+ "title": "To remove tags from a load balancer"
+ }
+ ],
+ "SetLoadBalancerListenerSSLCertificate": [
+ {
+ "input": {
+ "LoadBalancerName": "my-load-balancer",
+ "LoadBalancerPort": 443,
+ "SSLCertificateId": "arn:aws:iam::123456789012:server-certificate/new-server-cert"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example replaces the existing SSL certificate for the specified HTTPS listener.",
+ "id": "elb-set-load-balancer-listener-ssl-certificate-1",
+ "title": "To update the SSL certificate for an HTTPS listener"
+ }
+ ],
+ "SetLoadBalancerPoliciesForBackendServer": [
+ {
+ "input": {
+ "InstancePort": 80,
+ "LoadBalancerName": "my-load-balancer",
+ "PolicyNames": [
+ "my-ProxyProtocol-policy"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example replaces the policies that are currently associated with the specified port.",
+ "id": "elb-set-load-balancer-policies-for-backend-server-1",
+ "title": "To replace the policies associated with a port for a backend instance"
+ }
+ ],
+ "SetLoadBalancerPoliciesOfListener": [
+ {
+ "input": {
+ "LoadBalancerName": "my-load-balancer",
+ "LoadBalancerPort": 80,
+ "PolicyNames": [
+ "my-SSLNegotiation-policy"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example replaces the policies that are currently associated with the specified listener.",
+ "id": "elb-set-load-balancer-policies-of-listener-1",
+ "title": "To replace the policies associated with a listener"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elb/2012-06-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/elb/2012-06-01/paginators-1.json
new file mode 100644
index 00000000..b3bd3301
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elb/2012-06-01/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "DescribeLoadBalancers": {
+ "input_token": "Marker",
+ "output_token": "NextMarker",
+ "result_key": "LoadBalancerDescriptions",
+ "limit_key": "PageSize"
+ },
+ "DescribeAccountLimits": {
+ "input_token": "Marker",
+ "limit_key": "PageSize",
+ "output_token": "NextMarker",
+ "result_key": "Limits"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elb/2012-06-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/elb/2012-06-01/service-2.json.gz
new file mode 100644
index 00000000..09da8008
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elb/2012-06-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elb/2012-06-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/elb/2012-06-01/waiters-2.json
new file mode 100644
index 00000000..182e070b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elb/2012-06-01/waiters-2.json
@@ -0,0 +1,54 @@
+{
+ "version":2,
+ "waiters":{
+ "InstanceDeregistered": {
+ "delay": 15,
+ "operation": "DescribeInstanceHealth",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "OutOfService",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "InstanceStates[].State"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidInstance",
+ "state": "success"
+ }
+ ]
+ },
+ "AnyInstanceInService":{
+ "acceptors":[
+ {
+ "argument":"InstanceStates[].State",
+ "expected":"InService",
+ "matcher":"pathAny",
+ "state":"success"
+ }
+ ],
+ "delay":15,
+ "maxAttempts":40,
+ "operation":"DescribeInstanceHealth"
+ },
+ "InstanceInService":{
+ "acceptors":[
+ {
+ "argument":"InstanceStates[].State",
+ "expected":"InService",
+ "matcher":"pathAll",
+ "state":"success"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidInstance",
+ "state": "retry"
+ }
+ ],
+ "delay":15,
+ "maxAttempts":40,
+ "operation":"DescribeInstanceHealth"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elbv2/2015-12-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/elbv2/2015-12-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..e0be4296
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elbv2/2015-12-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elbv2/2015-12-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/elbv2/2015-12-01/examples-1.json
new file mode 100644
index 00000000..508b0991
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elbv2/2015-12-01/examples-1.json
@@ -0,0 +1,1384 @@
+{
+ "version": "1.0",
+ "examples": {
+ "AddTags": [
+ {
+ "input": {
+ "ResourceArns": [
+ "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188"
+ ],
+ "Tags": [
+ {
+ "Key": "project",
+ "Value": "lima"
+ },
+ {
+ "Key": "department",
+ "Value": "digital-media"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example adds the specified tags to the specified load balancer.",
+ "id": "elbv2-add-tags-1",
+ "title": "To add tags to a load balancer"
+ }
+ ],
+ "CreateListener": [
+ {
+ "input": {
+ "DefaultActions": [
+ {
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
+ "Type": "forward"
+ }
+ ],
+ "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188",
+ "Port": 80,
+ "Protocol": "HTTP"
+ },
+ "output": {
+ "Listeners": [
+ {
+ "DefaultActions": [
+ {
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
+ "Type": "forward"
+ }
+ ],
+ "ListenerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2",
+ "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188",
+ "Port": 80,
+ "Protocol": "HTTP"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an HTTP listener for the specified load balancer that forwards requests to the specified target group.",
+ "id": "elbv2-create-listener-1",
+ "title": "To create an HTTP listener"
+ },
+ {
+ "input": {
+ "Certificates": [
+ {
+ "CertificateArn": "arn:aws:iam::123456789012:server-certificate/my-server-cert"
+ }
+ ],
+ "DefaultActions": [
+ {
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
+ "Type": "forward"
+ }
+ ],
+ "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188",
+ "Port": 443,
+ "Protocol": "HTTPS",
+ "SslPolicy": "ELBSecurityPolicy-2015-05"
+ },
+ "output": {
+ "Listeners": [
+ {
+ "Certificates": [
+ {
+ "CertificateArn": "arn:aws:iam::123456789012:server-certificate/my-server-cert"
+ }
+ ],
+ "DefaultActions": [
+ {
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
+ "Type": "forward"
+ }
+ ],
+ "ListenerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2",
+ "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188",
+ "Port": 443,
+ "Protocol": "HTTPS",
+ "SslPolicy": "ELBSecurityPolicy-2015-05"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an HTTPS listener for the specified load balancer that forwards requests to the specified target group. Note that you must specify an SSL certificate for an HTTPS listener. You can create and manage certificates using AWS Certificate Manager (ACM). Alternatively, you can create a certificate using SSL/TLS tools, get the certificate signed by a certificate authority (CA), and upload the certificate to AWS Identity and Access Management (IAM).",
+ "id": "elbv2-create-listener-2",
+ "title": "To create an HTTPS listener"
+ }
+ ],
+ "CreateLoadBalancer": [
+ {
+ "input": {
+ "Name": "my-load-balancer",
+ "Subnets": [
+ "subnet-b7d581c0",
+ "subnet-8360a9e7"
+ ]
+ },
+ "output": {
+ "LoadBalancers": [
+ {
+ "AvailabilityZones": [
+ {
+ "SubnetId": "subnet-8360a9e7",
+ "ZoneName": "us-west-2a"
+ },
+ {
+ "SubnetId": "subnet-b7d581c0",
+ "ZoneName": "us-west-2b"
+ }
+ ],
+ "CanonicalHostedZoneId": "Z2P70J7EXAMPLE",
+ "CreatedTime": "2016-03-25T21:26:12.920Z",
+ "DNSName": "my-load-balancer-424835706.us-west-2.elb.amazonaws.com",
+ "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188",
+ "LoadBalancerName": "my-load-balancer",
+ "Scheme": "internet-facing",
+ "SecurityGroups": [
+ "sg-5943793c"
+ ],
+ "State": {
+ "Code": "provisioning"
+ },
+ "Type": "application",
+ "VpcId": "vpc-3ac0fb5f"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an Internet-facing load balancer and enables the Availability Zones for the specified subnets.",
+ "id": "elbv2-create-load-balancer-1",
+ "title": "To create an Internet-facing load balancer"
+ },
+ {
+ "input": {
+ "Name": "my-internal-load-balancer",
+ "Scheme": "internal",
+ "SecurityGroups": [
+
+ ],
+ "Subnets": [
+ "subnet-b7d581c0",
+ "subnet-8360a9e7"
+ ]
+ },
+ "output": {
+ "LoadBalancers": [
+ {
+ "AvailabilityZones": [
+ {
+ "SubnetId": "subnet-8360a9e7",
+ "ZoneName": "us-west-2a"
+ },
+ {
+ "SubnetId": "subnet-b7d581c0",
+ "ZoneName": "us-west-2b"
+ }
+ ],
+ "CanonicalHostedZoneId": "Z2P70J7EXAMPLE",
+ "CreatedTime": "2016-03-25T21:29:48.850Z",
+ "DNSName": "internal-my-internal-load-balancer-1529930873.us-west-2.elb.amazonaws.com",
+ "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-internal-load-balancer/5b49b8d4303115c2",
+ "LoadBalancerName": "my-internal-load-balancer",
+ "Scheme": "internal",
+ "SecurityGroups": [
+ "sg-5943793c"
+ ],
+ "State": {
+ "Code": "provisioning"
+ },
+ "Type": "application",
+ "VpcId": "vpc-3ac0fb5f"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an internal load balancer and enables the Availability Zones for the specified subnets.",
+ "id": "elbv2-create-load-balancer-2",
+ "title": "To create an internal load balancer"
+ }
+ ],
+ "CreateRule": [
+ {
+ "input": {
+ "Actions": [
+ {
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
+ "Type": "forward"
+ }
+ ],
+ "Conditions": [
+ {
+ "Field": "path-pattern",
+ "Values": [
+ "/img/*"
+ ]
+ }
+ ],
+ "ListenerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2",
+ "Priority": 10
+ },
+ "output": {
+ "Rules": [
+ {
+ "Actions": [
+ {
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
+ "Type": "forward"
+ }
+ ],
+ "Conditions": [
+ {
+ "Field": "path-pattern",
+ "Values": [
+ "/img/*"
+ ]
+ }
+ ],
+ "IsDefault": false,
+ "Priority": "10",
+ "RuleArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2/9683b2d02a6cabee"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a rule that forwards requests to the specified target group if the URL contains the specified pattern (for example, /img/*).",
+ "id": "elbv2-create-rule-1",
+ "title": "To create a rule"
+ }
+ ],
+ "CreateTargetGroup": [
+ {
+ "input": {
+ "Name": "my-targets",
+ "Port": 80,
+ "Protocol": "HTTP",
+ "VpcId": "vpc-3ac0fb5f"
+ },
+ "output": {
+ "TargetGroups": [
+ {
+ "HealthCheckIntervalSeconds": 30,
+ "HealthCheckPath": "/",
+ "HealthCheckPort": "traffic-port",
+ "HealthCheckProtocol": "HTTP",
+ "HealthCheckTimeoutSeconds": 5,
+ "HealthyThresholdCount": 5,
+ "Matcher": {
+ "HttpCode": "200"
+ },
+ "Port": 80,
+ "Protocol": "HTTP",
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
+ "TargetGroupName": "my-targets",
+ "UnhealthyThresholdCount": 2,
+ "VpcId": "vpc-3ac0fb5f"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a target group that you can use to route traffic to targets using HTTP on port 80. This target group uses the default health check configuration.",
+ "id": "elbv2-create-target-group-1",
+ "title": "To create a target group"
+ }
+ ],
+ "DeleteListener": [
+ {
+ "input": {
+ "ListenerArn": "arn:aws:elasticloadbalancing:ua-west-2:123456789012:listener/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified listener.",
+ "id": "elbv2-delete-listener-1",
+ "title": "To delete a listener"
+ }
+ ],
+ "DeleteLoadBalancer": [
+ {
+ "input": {
+ "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified load balancer.",
+ "id": "elbv2-delete-load-balancer-1",
+ "title": "To delete a load balancer"
+ }
+ ],
+ "DeleteRule": [
+ {
+ "input": {
+ "RuleArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2/1291d13826f405c3"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified rule.",
+ "id": "elbv2-delete-rule-1",
+ "title": "To delete a rule"
+ }
+ ],
+ "DeleteTargetGroup": [
+ {
+ "input": {
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified target group.",
+ "id": "elbv2-delete-target-group-1",
+ "title": "To delete a target group"
+ }
+ ],
+ "DeregisterTargets": [
+ {
+ "input": {
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
+ "Targets": [
+ {
+ "Id": "i-0f76fade"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deregisters the specified instance from the specified target group.",
+ "id": "elbv2-deregister-targets-1",
+ "title": "To deregister a target from a target group"
+ }
+ ],
+ "DescribeListeners": [
+ {
+ "input": {
+ "ListenerArns": [
+ "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2"
+ ]
+ },
+ "output": {
+ "Listeners": [
+ {
+ "DefaultActions": [
+ {
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
+ "Type": "forward"
+ }
+ ],
+ "ListenerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2",
+ "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188",
+ "Port": 80,
+ "Protocol": "HTTP"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified listener.",
+ "id": "elbv2-describe-listeners-1",
+ "title": "To describe a listener"
+ }
+ ],
+ "DescribeLoadBalancerAttributes": [
+ {
+ "input": {
+ "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188"
+ },
+ "output": {
+ "Attributes": [
+ {
+ "Key": "access_logs.s3.enabled",
+ "Value": "false"
+ },
+ {
+ "Key": "idle_timeout.timeout_seconds",
+ "Value": "60"
+ },
+ {
+ "Key": "access_logs.s3.prefix",
+ "Value": ""
+ },
+ {
+ "Key": "deletion_protection.enabled",
+ "Value": "false"
+ },
+ {
+ "Key": "access_logs.s3.bucket",
+ "Value": ""
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the attributes of the specified load balancer.",
+ "id": "elbv2-describe-load-balancer-attributes-1",
+ "title": "To describe load balancer attributes"
+ }
+ ],
+ "DescribeLoadBalancers": [
+ {
+ "input": {
+ "LoadBalancerArns": [
+ "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188"
+ ]
+ },
+ "output": {
+ "LoadBalancers": [
+ {
+ "AvailabilityZones": [
+ {
+ "SubnetId": "subnet-8360a9e7",
+ "ZoneName": "us-west-2a"
+ },
+ {
+ "SubnetId": "subnet-b7d581c0",
+ "ZoneName": "us-west-2b"
+ }
+ ],
+ "CanonicalHostedZoneId": "Z2P70J7EXAMPLE",
+ "CreatedTime": "2016-03-25T21:26:12.920Z",
+ "DNSName": "my-load-balancer-424835706.us-west-2.elb.amazonaws.com",
+ "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188",
+ "LoadBalancerName": "my-load-balancer",
+ "Scheme": "internet-facing",
+ "SecurityGroups": [
+ "sg-5943793c"
+ ],
+ "State": {
+ "Code": "active"
+ },
+ "Type": "application",
+ "VpcId": "vpc-3ac0fb5f"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified load balancer.",
+ "id": "elbv2-describe-load-balancers-1",
+ "title": "To describe a load balancer"
+ }
+ ],
+ "DescribeRules": [
+ {
+ "input": {
+ "RuleArns": [
+ "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2/9683b2d02a6cabee"
+ ]
+ },
+ "output": {
+ "Rules": [
+ {
+ "Actions": [
+ {
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
+ "Type": "forward"
+ }
+ ],
+ "Conditions": [
+ {
+ "Field": "path-pattern",
+ "Values": [
+ "/img/*"
+ ]
+ }
+ ],
+ "IsDefault": false,
+ "Priority": "10",
+ "RuleArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2/9683b2d02a6cabee"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified rule.",
+ "id": "elbv2-describe-rules-1",
+ "title": "To describe a rule"
+ }
+ ],
+ "DescribeSSLPolicies": [
+ {
+ "input": {
+ "Names": [
+ "ELBSecurityPolicy-2015-05"
+ ]
+ },
+ "output": {
+ "SslPolicies": [
+ {
+ "Ciphers": [
+ {
+ "Name": "ECDHE-ECDSA-AES128-GCM-SHA256",
+ "Priority": 1
+ },
+ {
+ "Name": "ECDHE-RSA-AES128-GCM-SHA256",
+ "Priority": 2
+ },
+ {
+ "Name": "ECDHE-ECDSA-AES128-SHA256",
+ "Priority": 3
+ },
+ {
+ "Name": "ECDHE-RSA-AES128-SHA256",
+ "Priority": 4
+ },
+ {
+ "Name": "ECDHE-ECDSA-AES128-SHA",
+ "Priority": 5
+ },
+ {
+ "Name": "ECDHE-RSA-AES128-SHA",
+ "Priority": 6
+ },
+ {
+ "Name": "DHE-RSA-AES128-SHA",
+ "Priority": 7
+ },
+ {
+ "Name": "ECDHE-ECDSA-AES256-GCM-SHA384",
+ "Priority": 8
+ },
+ {
+ "Name": "ECDHE-RSA-AES256-GCM-SHA384",
+ "Priority": 9
+ },
+ {
+ "Name": "ECDHE-ECDSA-AES256-SHA384",
+ "Priority": 10
+ },
+ {
+ "Name": "ECDHE-RSA-AES256-SHA384",
+ "Priority": 11
+ },
+ {
+ "Name": "ECDHE-RSA-AES256-SHA",
+ "Priority": 12
+ },
+ {
+ "Name": "ECDHE-ECDSA-AES256-SHA",
+ "Priority": 13
+ },
+ {
+ "Name": "AES128-GCM-SHA256",
+ "Priority": 14
+ },
+ {
+ "Name": "AES128-SHA256",
+ "Priority": 15
+ },
+ {
+ "Name": "AES128-SHA",
+ "Priority": 16
+ },
+ {
+ "Name": "AES256-GCM-SHA384",
+ "Priority": 17
+ },
+ {
+ "Name": "AES256-SHA256",
+ "Priority": 18
+ },
+ {
+ "Name": "AES256-SHA",
+ "Priority": 19
+ }
+ ],
+ "Name": "ELBSecurityPolicy-2015-05",
+ "SslProtocols": [
+ "TLSv1",
+ "TLSv1.1",
+ "TLSv1.2"
+ ]
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified policy used for SSL negotiation.",
+ "id": "elbv2-describe-ssl-policies-1",
+ "title": "To describe a policy used for SSL negotiation"
+ }
+ ],
+ "DescribeTags": [
+ {
+ "input": {
+ "ResourceArns": [
+ "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188"
+ ]
+ },
+ "output": {
+ "TagDescriptions": [
+ {
+ "ResourceArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188",
+ "Tags": [
+ {
+ "Key": "project",
+ "Value": "lima"
+ },
+ {
+ "Key": "department",
+ "Value": "digital-media"
+ }
+ ]
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the tags assigned to the specified load balancer.",
+ "id": "elbv2-describe-tags-1",
+ "title": "To describe the tags assigned to a load balancer"
+ }
+ ],
+ "DescribeTargetGroupAttributes": [
+ {
+ "input": {
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067"
+ },
+ "output": {
+ "Attributes": [
+ {
+ "Key": "stickiness.enabled",
+ "Value": "false"
+ },
+ {
+ "Key": "deregistration_delay.timeout_seconds",
+ "Value": "300"
+ },
+ {
+ "Key": "stickiness.type",
+ "Value": "lb_cookie"
+ },
+ {
+ "Key": "stickiness.lb_cookie.duration_seconds",
+ "Value": "86400"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the attributes of the specified target group.",
+ "id": "elbv2-describe-target-group-attributes-1",
+ "title": "To describe target group attributes"
+ }
+ ],
+ "DescribeTargetGroups": [
+ {
+ "input": {
+ "TargetGroupArns": [
+ "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067"
+ ]
+ },
+ "output": {
+ "TargetGroups": [
+ {
+ "HealthCheckIntervalSeconds": 30,
+ "HealthCheckPath": "/",
+ "HealthCheckPort": "traffic-port",
+ "HealthCheckProtocol": "HTTP",
+ "HealthCheckTimeoutSeconds": 5,
+ "HealthyThresholdCount": 5,
+ "LoadBalancerArns": [
+ "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188"
+ ],
+ "Matcher": {
+ "HttpCode": "200"
+ },
+ "Port": 80,
+ "Protocol": "HTTP",
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
+ "TargetGroupName": "my-targets",
+ "UnhealthyThresholdCount": 2,
+ "VpcId": "vpc-3ac0fb5f"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the specified target group.",
+ "id": "elbv2-describe-target-groups-1",
+ "title": "To describe a target group"
+ }
+ ],
+ "DescribeTargetHealth": [
+ {
+ "input": {
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067"
+ },
+ "output": {
+ "TargetHealthDescriptions": [
+ {
+ "Target": {
+ "Id": "i-0f76fade",
+ "Port": 80
+ },
+ "TargetHealth": {
+ "Description": "Given target group is not configured to receive traffic from ELB",
+ "Reason": "Target.NotInUse",
+ "State": "unused"
+ }
+ },
+ {
+ "HealthCheckPort": "80",
+ "Target": {
+ "Id": "i-0f76fade",
+ "Port": 80
+ },
+ "TargetHealth": {
+ "State": "healthy"
+ }
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the health of the targets for the specified target group. One target is healthy but the other is not specified in an action, so it can't receive traffic from the load balancer.",
+ "id": "elbv2-describe-target-health-1",
+ "title": "To describe the health of the targets for a target group"
+ },
+ {
+ "input": {
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
+ "Targets": [
+ {
+ "Id": "i-0f76fade",
+ "Port": 80
+ }
+ ]
+ },
+ "output": {
+ "TargetHealthDescriptions": [
+ {
+ "HealthCheckPort": "80",
+ "Target": {
+ "Id": "i-0f76fade",
+ "Port": 80
+ },
+ "TargetHealth": {
+ "State": "healthy"
+ }
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example describes the health of the specified target. This target is healthy.",
+ "id": "elbv2-describe-target-health-2",
+ "title": "To describe the health of a target"
+ }
+ ],
+ "ModifyListener": [
+ {
+ "input": {
+ "DefaultActions": [
+ {
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-new-targets/2453ed029918f21f",
+ "Type": "forward"
+ }
+ ],
+ "ListenerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2"
+ },
+ "output": {
+ "Listeners": [
+ {
+ "DefaultActions": [
+ {
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-new-targets/2453ed029918f21f",
+ "Type": "forward"
+ }
+ ],
+ "ListenerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2",
+ "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188",
+ "Port": 80,
+ "Protocol": "HTTP"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example changes the default action for the specified listener.",
+ "id": "elbv2-modify-listener-1",
+ "title": "To change the default action for a listener"
+ },
+ {
+ "input": {
+ "Certificates": [
+ {
+ "CertificateArn": "arn:aws:iam::123456789012:server-certificate/my-new-server-cert"
+ }
+ ],
+ "ListenerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener/app/my-load-balancer/50dc6c495c0c9188/0467ef3c8400ae65"
+ },
+ "output": {
+ "Listeners": [
+ {
+ "Certificates": [
+ {
+ "CertificateArn": "arn:aws:iam::123456789012:server-certificate/my-new-server-cert"
+ }
+ ],
+ "DefaultActions": [
+ {
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
+ "Type": "forward"
+ }
+ ],
+ "ListenerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener/app/my-load-balancer/50dc6c495c0c9188/0467ef3c8400ae65",
+ "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188",
+ "Port": 443,
+ "Protocol": "HTTPS",
+ "SslPolicy": "ELBSecurityPolicy-2015-05"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example changes the server certificate for the specified HTTPS listener.",
+ "id": "elbv2-modify-listener-2",
+ "title": "To change the server certificate"
+ }
+ ],
+ "ModifyLoadBalancerAttributes": [
+ {
+ "input": {
+ "Attributes": [
+ {
+ "Key": "deletion_protection.enabled",
+ "Value": "true"
+ }
+ ],
+ "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188"
+ },
+ "output": {
+ "Attributes": [
+ {
+ "Key": "deletion_protection.enabled",
+ "Value": "true"
+ },
+ {
+ "Key": "access_logs.s3.enabled",
+ "Value": "false"
+ },
+ {
+ "Key": "idle_timeout.timeout_seconds",
+ "Value": "60"
+ },
+ {
+ "Key": "access_logs.s3.prefix",
+ "Value": ""
+ },
+ {
+ "Key": "access_logs.s3.bucket",
+ "Value": ""
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example enables deletion protection for the specified load balancer.",
+ "id": "elbv2-modify-load-balancer-attributes-1",
+ "title": "To enable deletion protection"
+ },
+ {
+ "input": {
+ "Attributes": [
+ {
+ "Key": "idle_timeout.timeout_seconds",
+ "Value": "30"
+ }
+ ],
+ "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188"
+ },
+ "output": {
+ "Attributes": [
+ {
+ "Key": "idle_timeout.timeout_seconds",
+ "Value": "30"
+ },
+ {
+ "Key": "access_logs.s3.enabled",
+ "Value": "false"
+ },
+ {
+ "Key": "access_logs.s3.prefix",
+ "Value": ""
+ },
+ {
+ "Key": "deletion_protection.enabled",
+ "Value": "true"
+ },
+ {
+ "Key": "access_logs.s3.bucket",
+ "Value": ""
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example changes the idle timeout value for the specified load balancer.",
+ "id": "elbv2-modify-load-balancer-attributes-2",
+ "title": "To change the idle timeout"
+ },
+ {
+ "input": {
+ "Attributes": [
+ {
+ "Key": "access_logs.s3.enabled",
+ "Value": "true"
+ },
+ {
+ "Key": "access_logs.s3.bucket",
+ "Value": "my-loadbalancer-logs"
+ },
+ {
+ "Key": "access_logs.s3.prefix",
+ "Value": "myapp"
+ }
+ ],
+ "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188"
+ },
+ "output": {
+ "Attributes": [
+ {
+ "Key": "access_logs.s3.enabled",
+ "Value": "true"
+ },
+ {
+ "Key": "access_logs.s3.bucket",
+ "Value": "my-load-balancer-logs"
+ },
+ {
+ "Key": "access_logs.s3.prefix",
+ "Value": "myapp"
+ },
+ {
+ "Key": "idle_timeout.timeout_seconds",
+ "Value": "60"
+ },
+ {
+ "Key": "deletion_protection.enabled",
+ "Value": "false"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example enables access logs for the specified load balancer. Note that the S3 bucket must exist in the same region as the load balancer and must have a policy attached that grants access to the Elastic Load Balancing service.",
+ "id": "elbv2-modify-load-balancer-attributes-3",
+ "title": "To enable access logs"
+ }
+ ],
+ "ModifyRule": [
+ {
+ "input": {
+ "Conditions": [
+ {
+ "Field": "path-pattern",
+ "Values": [
+ "/images/*"
+ ]
+ }
+ ],
+ "RuleArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2/9683b2d02a6cabee"
+ },
+ "output": {
+ "Rules": [
+ {
+ "Actions": [
+ {
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
+ "Type": "forward"
+ }
+ ],
+ "Conditions": [
+ {
+ "Field": "path-pattern",
+ "Values": [
+ "/images/*"
+ ]
+ }
+ ],
+ "IsDefault": false,
+ "Priority": "10",
+ "RuleArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2/9683b2d02a6cabee"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example modifies the condition for the specified rule.",
+ "id": "elbv2-modify-rule-1",
+ "title": "To modify a rule"
+ }
+ ],
+ "ModifyTargetGroup": [
+ {
+ "input": {
+ "HealthCheckPort": "443",
+ "HealthCheckProtocol": "HTTPS",
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-https-targets/2453ed029918f21f"
+ },
+ "output": {
+ "TargetGroups": [
+ {
+ "HealthCheckIntervalSeconds": 30,
+ "HealthCheckPort": "443",
+ "HealthCheckProtocol": "HTTPS",
+ "HealthCheckTimeoutSeconds": 5,
+ "HealthyThresholdCount": 5,
+ "LoadBalancerArns": [
+ "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188"
+ ],
+ "Matcher": {
+ "HttpCode": "200"
+ },
+ "Port": 443,
+ "Protocol": "HTTPS",
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-https-targets/2453ed029918f21f",
+ "TargetGroupName": "my-https-targets",
+ "UnhealthyThresholdCount": 2,
+ "VpcId": "vpc-3ac0fb5f"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example changes the configuration of the health checks used to evaluate the health of the targets for the specified target group.",
+ "id": "elbv2-modify-target-group-1",
+ "title": "To modify the health check configuration for a target group"
+ }
+ ],
+ "ModifyTargetGroupAttributes": [
+ {
+ "input": {
+ "Attributes": [
+ {
+ "Key": "deregistration_delay.timeout_seconds",
+ "Value": "600"
+ }
+ ],
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067"
+ },
+ "output": {
+ "Attributes": [
+ {
+ "Key": "stickiness.enabled",
+ "Value": "false"
+ },
+ {
+ "Key": "deregistration_delay.timeout_seconds",
+ "Value": "600"
+ },
+ {
+ "Key": "stickiness.type",
+ "Value": "lb_cookie"
+ },
+ {
+ "Key": "stickiness.lb_cookie.duration_seconds",
+ "Value": "86400"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example sets the deregistration delay timeout to the specified value for the specified target group.",
+ "id": "elbv2-modify-target-group-attributes-1",
+ "title": "To modify the deregistration delay timeout"
+ }
+ ],
+ "RegisterTargets": [
+ {
+ "input": {
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
+ "Targets": [
+ {
+ "Id": "i-80c8dd94"
+ },
+ {
+ "Id": "i-ceddcd4d"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example registers the specified instances with the specified target group.",
+ "id": "elbv2-register-targets-1",
+ "title": "To register targets with a target group"
+ },
+ {
+ "input": {
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-new-targets/3bb63f11dfb0faf9",
+ "Targets": [
+ {
+ "Id": "i-80c8dd94",
+ "Port": 80
+ },
+ {
+ "Id": "i-80c8dd94",
+ "Port": 766
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example registers the specified instance with the specified target group using multiple ports. This enables you to register ECS containers on the same instance as targets in the target group.",
+ "id": "elbv2-register-targets-2",
+ "title": "To register targets with a target group using port overrides"
+ }
+ ],
+ "RemoveTags": [
+ {
+ "input": {
+ "ResourceArns": [
+ "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188"
+ ],
+ "TagKeys": [
+ "project",
+ "department"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example removes the specified tags from the specified load balancer.",
+ "id": "elbv2-remove-tags-1",
+ "title": "To remove tags from a load balancer"
+ }
+ ],
+ "SetRulePriorities": [
+ {
+ "input": {
+ "RulePriorities": [
+ {
+ "Priority": 5,
+ "RuleArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2/1291d13826f405c3"
+ }
+ ]
+ },
+ "output": {
+ "Rules": [
+ {
+ "Actions": [
+ {
+ "TargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067",
+ "Type": "forward"
+ }
+ ],
+ "Conditions": [
+ {
+ "Field": "path-pattern",
+ "Values": [
+ "/img/*"
+ ]
+ }
+ ],
+ "IsDefault": false,
+ "Priority": "5",
+ "RuleArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-load-balancer/50dc6c495c0c9188/f2f7dc8efc522ab2/1291d13826f405c3"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example sets the priority of the specified rule.",
+ "id": "elbv2-set-rule-priorities-1",
+ "title": "To set the rule priority"
+ }
+ ],
+ "SetSecurityGroups": [
+ {
+ "input": {
+ "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188",
+ "SecurityGroups": [
+ "sg-5943793c"
+ ]
+ },
+ "output": {
+ "SecurityGroupIds": [
+ "sg-5943793c"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example associates the specified security group with the specified load balancer.",
+ "id": "elbv2-set-security-groups-1",
+ "title": "To associate a security group with a load balancer"
+ }
+ ],
+ "SetSubnets": [
+ {
+ "input": {
+ "LoadBalancerArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188",
+ "Subnets": [
+ "subnet-8360a9e7",
+ "subnet-b7d581c0"
+ ]
+ },
+ "output": {
+ "AvailabilityZones": [
+ {
+ "SubnetId": "subnet-8360a9e7",
+ "ZoneName": "us-west-2a"
+ },
+ {
+ "SubnetId": "subnet-b7d581c0",
+ "ZoneName": "us-west-2b"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example enables the Availability Zones for the specified subnets for the specified load balancer.",
+ "id": "elbv2-set-subnets-1",
+ "title": "To enable Availability Zones for a load balancer"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elbv2/2015-12-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/elbv2/2015-12-01/paginators-1.json
new file mode 100644
index 00000000..4521f5c2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elbv2/2015-12-01/paginators-1.json
@@ -0,0 +1,46 @@
+{
+ "pagination": {
+ "DescribeLoadBalancers": {
+ "input_token": "Marker",
+ "output_token": "NextMarker",
+ "limit_key": "PageSize",
+ "result_key": "LoadBalancers"
+ },
+ "DescribeTargetGroups": {
+ "input_token": "Marker",
+ "output_token": "NextMarker",
+ "limit_key": "PageSize",
+ "result_key": "TargetGroups"
+ },
+ "DescribeListeners": {
+ "input_token": "Marker",
+ "output_token": "NextMarker",
+ "limit_key": "PageSize",
+ "result_key": "Listeners"
+ },
+ "DescribeAccountLimits": {
+ "input_token": "Marker",
+ "limit_key": "PageSize",
+ "output_token": "NextMarker",
+ "result_key": "Limits"
+ },
+ "DescribeListenerCertificates": {
+ "input_token": "Marker",
+ "limit_key": "PageSize",
+ "output_token": "NextMarker",
+ "result_key": "Certificates"
+ },
+ "DescribeRules": {
+ "input_token": "Marker",
+ "limit_key": "PageSize",
+ "output_token": "NextMarker",
+ "result_key": "Rules"
+ },
+ "DescribeSSLPolicies": {
+ "input_token": "Marker",
+ "limit_key": "PageSize",
+ "output_token": "NextMarker",
+ "result_key": "SslPolicies"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elbv2/2015-12-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/elbv2/2015-12-01/service-2.json.gz
new file mode 100644
index 00000000..0856f1f3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elbv2/2015-12-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/elbv2/2015-12-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/elbv2/2015-12-01/waiters-2.json
new file mode 100644
index 00000000..9f3d77d8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/elbv2/2015-12-01/waiters-2.json
@@ -0,0 +1,100 @@
+{
+ "version": 2,
+ "waiters": {
+ "LoadBalancerExists": {
+ "delay": 15,
+ "operation": "DescribeLoadBalancers",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "matcher": "status",
+ "expected": 200,
+ "state": "success"
+ },
+ {
+ "matcher": "error",
+ "expected": "LoadBalancerNotFound",
+ "state": "retry"
+ }
+ ]
+ },
+ "LoadBalancerAvailable": {
+ "delay": 15,
+ "operation": "DescribeLoadBalancers",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "LoadBalancers[].State.Code",
+ "expected": "active"
+ },
+ {
+ "state": "retry",
+ "matcher": "pathAny",
+ "argument": "LoadBalancers[].State.Code",
+ "expected": "provisioning"
+ },
+ {
+ "state": "retry",
+ "matcher": "error",
+ "expected": "LoadBalancerNotFound"
+ }
+ ]
+ },
+ "LoadBalancersDeleted": {
+ "delay": 15,
+ "operation": "DescribeLoadBalancers",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "state": "retry",
+ "matcher": "pathAll",
+ "argument": "LoadBalancers[].State.Code",
+ "expected": "active"
+ },
+ {
+ "matcher": "error",
+ "expected": "LoadBalancerNotFound",
+ "state": "success"
+ }
+ ]
+ },
+ "TargetInService":{
+ "delay":15,
+ "maxAttempts":40,
+ "operation":"DescribeTargetHealth",
+ "acceptors":[
+ {
+ "argument":"TargetHealthDescriptions[].TargetHealth.State",
+ "expected":"healthy",
+ "matcher":"pathAll",
+ "state":"success"
+ },
+ {
+ "matcher": "error",
+ "expected": "InvalidInstance",
+ "state": "retry"
+ }
+ ]
+ },
+ "TargetDeregistered": {
+ "delay": 15,
+ "maxAttempts": 40,
+ "operation": "DescribeTargetHealth",
+ "acceptors": [
+ {
+ "matcher": "error",
+ "expected": "InvalidTarget",
+ "state": "success"
+ },
+ {
+ "argument":"TargetHealthDescriptions[].TargetHealth.State",
+ "expected":"unused",
+ "matcher":"pathAll",
+ "state":"success"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/emr-containers/2020-10-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/emr-containers/2020-10-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b992df58
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/emr-containers/2020-10-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/emr-containers/2020-10-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/emr-containers/2020-10-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/emr-containers/2020-10-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/emr-containers/2020-10-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/emr-containers/2020-10-01/paginators-1.json
new file mode 100644
index 00000000..c21db2de
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/emr-containers/2020-10-01/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "ListJobRuns": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "jobRuns"
+ },
+ "ListManagedEndpoints": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "endpoints"
+ },
+ "ListVirtualClusters": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "virtualClusters"
+ },
+ "ListJobTemplates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "templates"
+ },
+ "ListSecurityConfigurations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "securityConfigurations"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/emr-containers/2020-10-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/emr-containers/2020-10-01/service-2.json.gz
new file mode 100644
index 00000000..fd2ec72e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/emr-containers/2020-10-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/emr-serverless/2021-07-13/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/emr-serverless/2021-07-13/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..f1ad45f1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/emr-serverless/2021-07-13/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/emr-serverless/2021-07-13/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/emr-serverless/2021-07-13/paginators-1.json
new file mode 100644
index 00000000..aa3966b1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/emr-serverless/2021-07-13/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListApplications": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "applications"
+ },
+ "ListJobRuns": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "jobRuns"
+ },
+ "ListJobRunAttempts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "jobRunAttempts"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/emr-serverless/2021-07-13/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/emr-serverless/2021-07-13/service-2.json.gz
new file mode 100644
index 00000000..6dabc887
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/emr-serverless/2021-07-13/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/emr/2009-03-31/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/emr/2009-03-31/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..c49816f9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/emr/2009-03-31/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/emr/2009-03-31/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/emr/2009-03-31/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/emr/2009-03-31/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/emr/2009-03-31/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/emr/2009-03-31/paginators-1.json
new file mode 100644
index 00000000..447759f1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/emr/2009-03-31/paginators-1.json
@@ -0,0 +1,54 @@
+{
+ "pagination": {
+ "ListBootstrapActions": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "result_key": "BootstrapActions"
+ },
+ "ListClusters": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "result_key": "Clusters"
+ },
+ "ListInstanceGroups": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "result_key": "InstanceGroups"
+ },
+ "ListInstances": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "result_key": "Instances"
+ },
+ "ListSteps": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "result_key": "Steps"
+ },
+ "ListInstanceFleets": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "result_key": "InstanceFleets"
+ },
+ "ListSecurityConfigurations": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "result_key": "SecurityConfigurations"
+ },
+ "ListNotebookExecutions": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "result_key": "NotebookExecutions"
+ },
+ "ListStudioSessionMappings": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "result_key": "SessionMappings"
+ },
+ "ListStudios": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "result_key": "Studios"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/emr/2009-03-31/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/emr/2009-03-31/service-2.json.gz
new file mode 100644
index 00000000..9fdf924b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/emr/2009-03-31/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/emr/2009-03-31/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/emr/2009-03-31/waiters-2.json
new file mode 100644
index 00000000..abba8c3c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/emr/2009-03-31/waiters-2.json
@@ -0,0 +1,86 @@
+{
+ "version": 2,
+ "waiters": {
+ "ClusterRunning": {
+ "delay": 30,
+ "operation": "DescribeCluster",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "Cluster.Status.State",
+ "expected": "RUNNING"
+ },
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "Cluster.Status.State",
+ "expected": "WAITING"
+ },
+ {
+ "state": "failure",
+ "matcher": "path",
+ "argument": "Cluster.Status.State",
+ "expected": "TERMINATING"
+ },
+ {
+ "state": "failure",
+ "matcher": "path",
+ "argument": "Cluster.Status.State",
+ "expected": "TERMINATED"
+ },
+ {
+ "state": "failure",
+ "matcher": "path",
+ "argument": "Cluster.Status.State",
+ "expected": "TERMINATED_WITH_ERRORS"
+ }
+ ]
+ },
+ "StepComplete": {
+ "delay": 30,
+ "operation": "DescribeStep",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "Step.Status.State",
+ "expected": "COMPLETED"
+ },
+ {
+ "state": "failure",
+ "matcher": "path",
+ "argument": "Step.Status.State",
+ "expected": "FAILED"
+ },
+ {
+ "state": "failure",
+ "matcher": "path",
+ "argument": "Step.Status.State",
+ "expected": "CANCELLED"
+ }
+ ]
+ },
+ "ClusterTerminated": {
+ "delay": 30,
+ "operation": "DescribeCluster",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "Cluster.Status.State",
+ "expected": "TERMINATED"
+ },
+ {
+ "state": "failure",
+ "matcher": "path",
+ "argument": "Cluster.Status.State",
+ "expected": "TERMINATED_WITH_ERRORS"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/endpoints.json b/.venv/lib/python3.12/site-packages/botocore/data/endpoints.json
new file mode 100644
index 00000000..ec61a669
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/endpoints.json
@@ -0,0 +1,37672 @@
+{
+ "partitions" : [ {
+ "defaults" : {
+ "hostname" : "{service}.{region}.{dnsSuffix}",
+ "protocols" : [ "https" ],
+ "signatureVersions" : [ "v4" ],
+ "variants" : [ {
+ "dnsSuffix" : "amazonaws.com",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ }, {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "{service}.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "dnsSuffix" : "amazonaws.com",
+ "partition" : "aws",
+ "partitionName" : "AWS Standard",
+ "regionRegex" : "^(us|eu|ap|sa|ca|me|af|il|mx)\\-\\w+\\-\\d+$",
+ "regions" : {
+ "af-south-1" : {
+ "description" : "Africa (Cape Town)"
+ },
+ "ap-east-1" : {
+ "description" : "Asia Pacific (Hong Kong)"
+ },
+ "ap-northeast-1" : {
+ "description" : "Asia Pacific (Tokyo)"
+ },
+ "ap-northeast-2" : {
+ "description" : "Asia Pacific (Seoul)"
+ },
+ "ap-northeast-3" : {
+ "description" : "Asia Pacific (Osaka)"
+ },
+ "ap-south-1" : {
+ "description" : "Asia Pacific (Mumbai)"
+ },
+ "ap-south-2" : {
+ "description" : "Asia Pacific (Hyderabad)"
+ },
+ "ap-southeast-1" : {
+ "description" : "Asia Pacific (Singapore)"
+ },
+ "ap-southeast-2" : {
+ "description" : "Asia Pacific (Sydney)"
+ },
+ "ap-southeast-3" : {
+ "description" : "Asia Pacific (Jakarta)"
+ },
+ "ap-southeast-4" : {
+ "description" : "Asia Pacific (Melbourne)"
+ },
+ "ap-southeast-5" : {
+ "description" : "Asia Pacific (Malaysia)"
+ },
+ "ap-southeast-7" : {
+ "description" : "Asia Pacific (Thailand)"
+ },
+ "ca-central-1" : {
+ "description" : "Canada (Central)"
+ },
+ "ca-west-1" : {
+ "description" : "Canada West (Calgary)"
+ },
+ "eu-central-1" : {
+ "description" : "Europe (Frankfurt)"
+ },
+ "eu-central-2" : {
+ "description" : "Europe (Zurich)"
+ },
+ "eu-north-1" : {
+ "description" : "Europe (Stockholm)"
+ },
+ "eu-south-1" : {
+ "description" : "Europe (Milan)"
+ },
+ "eu-south-2" : {
+ "description" : "Europe (Spain)"
+ },
+ "eu-west-1" : {
+ "description" : "Europe (Ireland)"
+ },
+ "eu-west-2" : {
+ "description" : "Europe (London)"
+ },
+ "eu-west-3" : {
+ "description" : "Europe (Paris)"
+ },
+ "il-central-1" : {
+ "description" : "Israel (Tel Aviv)"
+ },
+ "me-central-1" : {
+ "description" : "Middle East (UAE)"
+ },
+ "me-south-1" : {
+ "description" : "Middle East (Bahrain)"
+ },
+ "mx-central-1" : {
+ "description" : "Mexico (Central)"
+ },
+ "sa-east-1" : {
+ "description" : "South America (Sao Paulo)"
+ },
+ "us-east-1" : {
+ "description" : "US East (N. Virginia)"
+ },
+ "us-east-2" : {
+ "description" : "US East (Ohio)"
+ },
+ "us-west-1" : {
+ "description" : "US West (N. California)"
+ },
+ "us-west-2" : {
+ "description" : "US West (Oregon)"
+ }
+ },
+ "services" : {
+ "access-analyzer" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.ap-southeast-5.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-7" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.ap-southeast-7.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "access-analyzer-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "access-analyzer.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "access-analyzer-fips.ca-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "access-analyzer.ca-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "access-analyzer-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "access-analyzer-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "access-analyzer-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "access-analyzer-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "access-analyzer-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "access-analyzer-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "mx-central-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.mx-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "access-analyzer-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "access-analyzer.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "access-analyzer-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "access-analyzer.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "access-analyzer-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "access-analyzer.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "access-analyzer-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "access-analyzer.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "account" : {
+ "endpoints" : {
+ "aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "account.us-east-1.amazonaws.com"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-global"
+ },
+ "acm" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "acm-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "acm-fips.ca-central-1.amazonaws.com"
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "acm-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "acm-fips.ca-west-1.amazonaws.com"
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "acm-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "acm-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "acm-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "acm-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "acm-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "acm-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "acm-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "acm-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "acm-pca" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "acm-pca-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "acm-pca-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "acm-pca-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "acm-pca-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "acm-pca-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "acm-pca-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "acm-pca-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "acm-pca-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "acm-pca-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "acm-pca-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "acm-pca-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "acm-pca-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "agreement-marketplace" : {
+ "endpoints" : {
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "agreement-marketplace.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "airflow" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "amplify" : {
+ "endpoints" : {
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "amplifybackend" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "amplifyuibuilder" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "aoss" : {
+ "endpoints" : {
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "api.detective" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "detective.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "detective.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "detective.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "detective.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "detective.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "detective.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "detective.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "api.detective-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "detective-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "detective.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api.detective-fips.ca-central-1.amazonaws.com"
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "detective.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "detective.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "detective.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "detective.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "detective.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "detective.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "detective.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "detective.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "detective.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "api.detective-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "detective-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "detective.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api.detective-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "api.detective-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "detective-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "detective.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "api.detective-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "api.detective-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "detective-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "detective.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api.detective-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "api.detective-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "detective-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "detective.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "api.detective-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "api.ecr" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "ecr-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "af-south-1" : {
+ "credentialScope" : {
+ "region" : "af-south-1"
+ },
+ "hostname" : "api.ecr.af-south-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "credentialScope" : {
+ "region" : "ap-east-1"
+ },
+ "hostname" : "api.ecr.ap-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "hostname" : "api.ecr.ap-northeast-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "hostname" : "api.ecr.ap-northeast-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-3"
+ },
+ "hostname" : "api.ecr.ap-northeast-3.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "hostname" : "api.ecr.ap-south-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "credentialScope" : {
+ "region" : "ap-south-2"
+ },
+ "hostname" : "api.ecr.ap-south-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "hostname" : "api.ecr.ap-southeast-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "hostname" : "api.ecr.ap-southeast-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-3"
+ },
+ "hostname" : "api.ecr.ap-southeast-3.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-4"
+ },
+ "hostname" : "api.ecr.ap-southeast-4.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-5"
+ },
+ "hostname" : "api.ecr.ap-southeast-5.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.ap-southeast-5.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-7" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-7"
+ },
+ "hostname" : "api.ecr.ap-southeast-7.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.ap-southeast-7.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "hostname" : "api.ecr.ca-central-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "hostname" : "api.ecr.ca-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.ca-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "dkr-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "ecr-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "dkr-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "ecr-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "dkr-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "ecr-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "dkr-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "ecr-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "hostname" : "api.ecr.eu-central-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "credentialScope" : {
+ "region" : "eu-central-2"
+ },
+ "hostname" : "api.ecr.eu-central-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "credentialScope" : {
+ "region" : "eu-north-1"
+ },
+ "hostname" : "api.ecr.eu-north-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "credentialScope" : {
+ "region" : "eu-south-1"
+ },
+ "hostname" : "api.ecr.eu-south-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "credentialScope" : {
+ "region" : "eu-south-2"
+ },
+ "hostname" : "api.ecr.eu-south-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "hostname" : "api.ecr.eu-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "hostname" : "api.ecr.eu-west-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "credentialScope" : {
+ "region" : "eu-west-3"
+ },
+ "hostname" : "api.ecr.eu-west-3.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-dkr-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ecr-fips.us-east-1.amazonaws.com"
+ },
+ "fips-dkr-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ecr-fips.us-east-2.amazonaws.com"
+ },
+ "fips-dkr-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ecr-fips.us-west-1.amazonaws.com"
+ },
+ "fips-dkr-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ecr-fips.us-west-2.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ecr-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ecr-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ecr-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ecr-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "credentialScope" : {
+ "region" : "il-central-1"
+ },
+ "hostname" : "api.ecr.il-central-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "credentialScope" : {
+ "region" : "me-central-1"
+ },
+ "hostname" : "api.ecr.me-central-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "credentialScope" : {
+ "region" : "me-south-1"
+ },
+ "hostname" : "api.ecr.me-south-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "mx-central-1" : {
+ "credentialScope" : {
+ "region" : "mx-central-1"
+ },
+ "hostname" : "api.ecr.mx-central-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.mx-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "credentialScope" : {
+ "region" : "sa-east-1"
+ },
+ "hostname" : "api.ecr.sa-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "api.ecr.us-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ecr-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "ecr.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "hostname" : "api.ecr.us-east-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ecr-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "ecr.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "hostname" : "api.ecr.us-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ecr-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "ecr.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "api.ecr.us-west-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ecr-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "ecr.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "api.ecr-public" : {
+ "endpoints" : {
+ "us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "api.ecr-public.us-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr-public.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "api.ecr-public.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "api.fleethub.iot" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "api.fleethub.iot-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api.fleethub.iot-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api.fleethub.iot-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "api.fleethub.iot-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "api.fleethub.iot-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "api.fleethub.iot-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "api.fleethub.iot-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "api.fleethub.iot-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "api.iotdeviceadvisor" : {
+ "endpoints" : {
+ "ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "hostname" : "api.iotdeviceadvisor.ap-northeast-1.amazonaws.com"
+ },
+ "eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "hostname" : "api.iotdeviceadvisor.eu-west-1.amazonaws.com"
+ },
+ "us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "api.iotdeviceadvisor.us-east-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "api.iotdeviceadvisor.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "api.iotwireless" : {
+ "endpoints" : {
+ "ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "hostname" : "api.iotwireless.ap-northeast-1.amazonaws.com"
+ },
+ "ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "hostname" : "api.iotwireless.ap-southeast-2.amazonaws.com"
+ },
+ "eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "hostname" : "api.iotwireless.eu-central-1.amazonaws.com"
+ },
+ "eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "hostname" : "api.iotwireless.eu-west-1.amazonaws.com"
+ },
+ "sa-east-1" : {
+ "credentialScope" : {
+ "region" : "sa-east-1"
+ },
+ "hostname" : "api.iotwireless.sa-east-1.amazonaws.com"
+ },
+ "us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "api.iotwireless.us-east-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "api.iotwireless.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "api.mediatailor" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-3" : { },
+ "me-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "api.pricing" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "pricing"
+ }
+ },
+ "endpoints" : {
+ "ap-south-1" : { },
+ "eu-central-1" : { },
+ "us-east-1" : { }
+ }
+ },
+ "api.sagemaker" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "api-fips.sagemaker.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "api-fips.sagemaker.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api-fips.sagemaker.ca-central-1.amazonaws.com"
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "api-fips.sagemaker.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api-fips.sagemaker.ca-west-1.amazonaws.com"
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "api-fips.sagemaker.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api-fips.sagemaker.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "api-fips.sagemaker.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "api-fips.sagemaker.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "api-fips.sagemaker.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api-fips.sagemaker.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "api-fips.sagemaker.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "api-fips.sagemaker.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "api.tunneling.iot" : {
+ "defaults" : {
+ "variants" : [ {
+ "dnsSuffix" : "amazonaws.com",
+ "hostname" : "api.tunneling.iot-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ }, {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "api.iot-tunneling-fips.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "api.iot-tunneling.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "endpoints" : {
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "api.iot-tunneling.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "api.tunneling.iot-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api.tunneling.iot-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api.tunneling.iot-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "api.tunneling.iot-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api.tunneling.iot-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "api.tunneling.iot-fips.us-west-2.amazonaws.com"
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "api.iot-tunneling.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "api.tunneling.iot-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "api.iot-tunneling.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "api.tunneling.iot-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "api.iot-tunneling.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "api.tunneling.iot-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "api.iot-tunneling.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "api.tunneling.iot-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "apigateway" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "apigateway-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "apigateway-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "apigateway-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "apigateway-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "apigateway-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "apigateway-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "apigateway-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "apigateway-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "apigateway-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "apigateway-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "apigateway-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "apigateway-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "app-integrations" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "appconfig" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "appconfigdata" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "appflow" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "appflow-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "appflow-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "appflow-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "appflow-fips.us-west-2.amazonaws.com"
+ },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "appflow-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "appflow-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "appflow-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "appflow-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "application-autoscaling" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "applicationinsights" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "credentialScope" : {
+ "region" : "af-south-1"
+ },
+ "hostname" : "applicationinsights.af-south-1.amazonaws.com"
+ },
+ "ap-east-1" : {
+ "credentialScope" : {
+ "region" : "ap-east-1"
+ },
+ "hostname" : "applicationinsights.ap-east-1.amazonaws.com"
+ },
+ "ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "hostname" : "applicationinsights.ap-northeast-1.amazonaws.com"
+ },
+ "ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "hostname" : "applicationinsights.ap-northeast-2.amazonaws.com"
+ },
+ "ap-northeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-3"
+ },
+ "hostname" : "applicationinsights.ap-northeast-3.amazonaws.com"
+ },
+ "ap-south-1" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "hostname" : "applicationinsights.ap-south-1.amazonaws.com"
+ },
+ "ap-south-2" : {
+ "credentialScope" : {
+ "region" : "ap-south-2"
+ },
+ "hostname" : "applicationinsights.ap-south-2.amazonaws.com"
+ },
+ "ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "hostname" : "applicationinsights.ap-southeast-1.amazonaws.com"
+ },
+ "ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "hostname" : "applicationinsights.ap-southeast-2.amazonaws.com"
+ },
+ "ap-southeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-3"
+ },
+ "hostname" : "applicationinsights.ap-southeast-3.amazonaws.com"
+ },
+ "ap-southeast-4" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-4"
+ },
+ "hostname" : "applicationinsights.ap-southeast-4.amazonaws.com"
+ },
+ "ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "hostname" : "applicationinsights.ca-central-1.amazonaws.com"
+ },
+ "ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "hostname" : "applicationinsights.ca-west-1.amazonaws.com"
+ },
+ "eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "hostname" : "applicationinsights.eu-central-1.amazonaws.com"
+ },
+ "eu-central-2" : {
+ "credentialScope" : {
+ "region" : "eu-central-2"
+ },
+ "hostname" : "applicationinsights.eu-central-2.amazonaws.com"
+ },
+ "eu-north-1" : {
+ "credentialScope" : {
+ "region" : "eu-north-1"
+ },
+ "hostname" : "applicationinsights.eu-north-1.amazonaws.com"
+ },
+ "eu-south-1" : {
+ "credentialScope" : {
+ "region" : "eu-south-1"
+ },
+ "hostname" : "applicationinsights.eu-south-1.amazonaws.com"
+ },
+ "eu-south-2" : {
+ "credentialScope" : {
+ "region" : "eu-south-2"
+ },
+ "hostname" : "applicationinsights.eu-south-2.amazonaws.com"
+ },
+ "eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "hostname" : "applicationinsights.eu-west-1.amazonaws.com"
+ },
+ "eu-west-2" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "hostname" : "applicationinsights.eu-west-2.amazonaws.com"
+ },
+ "eu-west-3" : {
+ "credentialScope" : {
+ "region" : "eu-west-3"
+ },
+ "hostname" : "applicationinsights.eu-west-3.amazonaws.com"
+ },
+ "il-central-1" : {
+ "credentialScope" : {
+ "region" : "il-central-1"
+ },
+ "hostname" : "applicationinsights.il-central-1.amazonaws.com"
+ },
+ "me-central-1" : {
+ "credentialScope" : {
+ "region" : "me-central-1"
+ },
+ "hostname" : "applicationinsights.me-central-1.amazonaws.com"
+ },
+ "me-south-1" : {
+ "credentialScope" : {
+ "region" : "me-south-1"
+ },
+ "hostname" : "applicationinsights.me-south-1.amazonaws.com"
+ },
+ "sa-east-1" : {
+ "credentialScope" : {
+ "region" : "sa-east-1"
+ },
+ "hostname" : "applicationinsights.sa-east-1.amazonaws.com"
+ },
+ "us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "applicationinsights.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "hostname" : "applicationinsights.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "hostname" : "applicationinsights.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "applicationinsights.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "appmesh" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "appmesh.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "appmesh.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "appmesh.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "appmesh.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "appmesh.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "appmesh.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "appmesh.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "appmesh.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "appmesh.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "appmesh-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "appmesh-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "appmesh.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "appmesh-fips.ca-central-1.amazonaws.com"
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "appmesh.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "appmesh.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "appmesh.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "appmesh.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "appmesh.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "appmesh.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "appmesh.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "appmesh.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "appmesh.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "appmesh.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "appmesh.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "appmesh-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "appmesh-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "appmesh.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "appmesh-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "appmesh-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "appmesh-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "appmesh.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "appmesh-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "appmesh-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "appmesh-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "appmesh.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "appmesh-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "appmesh-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "appmesh-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "appmesh.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "appmesh-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "apprunner" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "apprunner-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "apprunner-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "apprunner-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "apprunner-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "apprunner-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "apprunner-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "appstream2" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "appstream"
+ },
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "appstream2-fips.us-west-2.amazonaws.com"
+ },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "appstream2-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "appstream2-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : { },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "appstream2-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "appstream2-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "appsync" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "apptest" : {
+ "endpoints" : {
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "fips-us-east-1" : {
+ "deprecated" : true
+ },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "aps" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "arc-zonal-shift" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "athena" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "athena.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "athena.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "athena.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "athena.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "athena.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "athena.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "athena.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "athena.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "athena.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "athena.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "athena.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "variants" : [ {
+ "hostname" : "athena.ap-southeast-5.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "athena-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "athena-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "athena.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "athena-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "athena-fips.ca-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "athena.ca-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "athena.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "athena.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "athena.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "athena.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "athena.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "athena.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "athena.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "athena.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "athena-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "athena-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "athena-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "athena-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "athena-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "athena-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "athena.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "athena.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "athena.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "athena.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "athena-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "athena-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "athena.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "athena-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "athena-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "athena.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "athena-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "athena-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "athena.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "athena-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "athena-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "athena.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "auditmanager" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "auditmanager-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "auditmanager-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "auditmanager-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "auditmanager-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "auditmanager-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "auditmanager-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "auditmanager-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "auditmanager-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "autoscaling" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "autoscaling-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "autoscaling-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "autoscaling-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "autoscaling-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "autoscaling-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "autoscaling-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "autoscaling-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "autoscaling-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "autoscaling-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "autoscaling-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "autoscaling-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "autoscaling-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "autoscaling-plans" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "backup" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "backup-gateway" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "batch" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "fips.batch.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fips.batch.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "fips.batch.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fips.batch.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "fips.batch.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "fips.batch.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "fips.batch.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "fips.batch.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "fips.batch.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "bedrock" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "bedrock-ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "hostname" : "bedrock.ap-northeast-1.amazonaws.com"
+ },
+ "bedrock-ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "hostname" : "bedrock.ap-northeast-2.amazonaws.com"
+ },
+ "bedrock-ap-northeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-3"
+ },
+ "hostname" : "bedrock.ap-northeast-3.amazonaws.com"
+ },
+ "bedrock-ap-south-1" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "hostname" : "bedrock.ap-south-1.amazonaws.com"
+ },
+ "bedrock-ap-south-2" : {
+ "credentialScope" : {
+ "region" : "ap-south-2"
+ },
+ "hostname" : "bedrock.ap-south-2.amazonaws.com"
+ },
+ "bedrock-ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "hostname" : "bedrock.ap-southeast-1.amazonaws.com"
+ },
+ "bedrock-ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "hostname" : "bedrock.ap-southeast-2.amazonaws.com"
+ },
+ "bedrock-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "hostname" : "bedrock.ca-central-1.amazonaws.com"
+ },
+ "bedrock-eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "hostname" : "bedrock.eu-central-1.amazonaws.com"
+ },
+ "bedrock-eu-central-2" : {
+ "credentialScope" : {
+ "region" : "eu-central-2"
+ },
+ "hostname" : "bedrock.eu-central-2.amazonaws.com"
+ },
+ "bedrock-eu-north-1" : {
+ "credentialScope" : {
+ "region" : "eu-north-1"
+ },
+ "hostname" : "bedrock.eu-north-1.amazonaws.com"
+ },
+ "bedrock-eu-south-1" : {
+ "credentialScope" : {
+ "region" : "eu-south-1"
+ },
+ "hostname" : "bedrock.eu-south-1.amazonaws.com"
+ },
+ "bedrock-eu-south-2" : {
+ "credentialScope" : {
+ "region" : "eu-south-2"
+ },
+ "hostname" : "bedrock.eu-south-2.amazonaws.com"
+ },
+ "bedrock-eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "hostname" : "bedrock.eu-west-1.amazonaws.com"
+ },
+ "bedrock-eu-west-2" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "hostname" : "bedrock.eu-west-2.amazonaws.com"
+ },
+ "bedrock-eu-west-3" : {
+ "credentialScope" : {
+ "region" : "eu-west-3"
+ },
+ "hostname" : "bedrock.eu-west-3.amazonaws.com"
+ },
+ "bedrock-fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "hostname" : "bedrock-fips.ca-central-1.amazonaws.com"
+ },
+ "bedrock-fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "bedrock-fips.us-east-1.amazonaws.com"
+ },
+ "bedrock-fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "hostname" : "bedrock-fips.us-east-2.amazonaws.com"
+ },
+ "bedrock-fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "bedrock-fips.us-west-2.amazonaws.com"
+ },
+ "bedrock-runtime-ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "hostname" : "bedrock-runtime.ap-northeast-1.amazonaws.com"
+ },
+ "bedrock-runtime-ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "hostname" : "bedrock-runtime.ap-northeast-2.amazonaws.com"
+ },
+ "bedrock-runtime-ap-northeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-3"
+ },
+ "hostname" : "bedrock-runtime.ap-northeast-3.amazonaws.com"
+ },
+ "bedrock-runtime-ap-south-1" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "hostname" : "bedrock-runtime.ap-south-1.amazonaws.com"
+ },
+ "bedrock-runtime-ap-south-2" : {
+ "credentialScope" : {
+ "region" : "ap-south-2"
+ },
+ "hostname" : "bedrock-runtime.ap-south-2.amazonaws.com"
+ },
+ "bedrock-runtime-ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "hostname" : "bedrock-runtime.ap-southeast-1.amazonaws.com"
+ },
+ "bedrock-runtime-ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "hostname" : "bedrock-runtime.ap-southeast-2.amazonaws.com"
+ },
+ "bedrock-runtime-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "hostname" : "bedrock-runtime.ca-central-1.amazonaws.com"
+ },
+ "bedrock-runtime-eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "hostname" : "bedrock-runtime.eu-central-1.amazonaws.com"
+ },
+ "bedrock-runtime-eu-central-2" : {
+ "credentialScope" : {
+ "region" : "eu-central-2"
+ },
+ "hostname" : "bedrock-runtime.eu-central-2.amazonaws.com"
+ },
+ "bedrock-runtime-eu-north-1" : {
+ "credentialScope" : {
+ "region" : "eu-north-1"
+ },
+ "hostname" : "bedrock-runtime.eu-north-1.amazonaws.com"
+ },
+ "bedrock-runtime-eu-south-1" : {
+ "credentialScope" : {
+ "region" : "eu-south-1"
+ },
+ "hostname" : "bedrock-runtime.eu-south-1.amazonaws.com"
+ },
+ "bedrock-runtime-eu-south-2" : {
+ "credentialScope" : {
+ "region" : "eu-south-2"
+ },
+ "hostname" : "bedrock-runtime.eu-south-2.amazonaws.com"
+ },
+ "bedrock-runtime-eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "hostname" : "bedrock-runtime.eu-west-1.amazonaws.com"
+ },
+ "bedrock-runtime-eu-west-2" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "hostname" : "bedrock-runtime.eu-west-2.amazonaws.com"
+ },
+ "bedrock-runtime-eu-west-3" : {
+ "credentialScope" : {
+ "region" : "eu-west-3"
+ },
+ "hostname" : "bedrock-runtime.eu-west-3.amazonaws.com"
+ },
+ "bedrock-runtime-fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "hostname" : "bedrock-runtime-fips.ca-central-1.amazonaws.com"
+ },
+ "bedrock-runtime-fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "bedrock-runtime-fips.us-east-1.amazonaws.com"
+ },
+ "bedrock-runtime-fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "hostname" : "bedrock-runtime-fips.us-east-2.amazonaws.com"
+ },
+ "bedrock-runtime-fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "bedrock-runtime-fips.us-west-2.amazonaws.com"
+ },
+ "bedrock-runtime-sa-east-1" : {
+ "credentialScope" : {
+ "region" : "sa-east-1"
+ },
+ "hostname" : "bedrock-runtime.sa-east-1.amazonaws.com"
+ },
+ "bedrock-runtime-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "bedrock-runtime.us-east-1.amazonaws.com"
+ },
+ "bedrock-runtime-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "hostname" : "bedrock-runtime.us-east-2.amazonaws.com"
+ },
+ "bedrock-runtime-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "bedrock-runtime.us-west-2.amazonaws.com"
+ },
+ "bedrock-sa-east-1" : {
+ "credentialScope" : {
+ "region" : "sa-east-1"
+ },
+ "hostname" : "bedrock.sa-east-1.amazonaws.com"
+ },
+ "bedrock-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "bedrock.us-east-1.amazonaws.com"
+ },
+ "bedrock-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "hostname" : "bedrock.us-east-2.amazonaws.com"
+ },
+ "bedrock-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "bedrock.us-west-2.amazonaws.com"
+ },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "billingconductor" : {
+ "endpoints" : {
+ "aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "billingconductor.us-east-1.amazonaws.com"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-global"
+ },
+ "braket" : {
+ "endpoints" : {
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "braket.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "braket.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "braket.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "braket.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "braket.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "budgets" : {
+ "endpoints" : {
+ "aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "budgets.amazonaws.com"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-global"
+ },
+ "cases" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-west-2" : { },
+ "fips-us-east-1" : {
+ "deprecated" : true
+ },
+ "fips-us-west-2" : {
+ "deprecated" : true
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "cassandra" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cassandra-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "cassandra-fips.us-west-2.amazonaws.com"
+ },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "cassandra-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "cassandra-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "catalog.marketplace" : {
+ "endpoints" : {
+ "us-east-1" : { }
+ }
+ },
+ "ce" : {
+ "endpoints" : {
+ "aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "ce.us-east-1.amazonaws.com"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-global"
+ },
+ "chime" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "chime.us-east-1.amazonaws.com",
+ "protocols" : [ "https" ]
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-global"
+ },
+ "cleanrooms" : {
+ "endpoints" : {
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "cleanrooms.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "cleanrooms.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "cleanrooms.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "cleanrooms.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "cleanrooms.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "cleanrooms.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "cleanrooms.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "cleanrooms.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cleanrooms-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "cleanrooms-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "cleanrooms-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "cleanrooms-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cleanrooms-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "cleanrooms.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "cleanrooms-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cleanrooms-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "cleanrooms.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "cleanrooms-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cleanrooms-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "cleanrooms.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "cloud9" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "cloud9-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cloud9-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cloud9-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cloud9-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "cloud9-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cloud9-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "cloud9-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "cloud9-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cloud9-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "cloud9-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cloud9-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "cloud9-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cloud9-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "cloud9-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cloud9-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ }
+ }
+ },
+ "cloudcontrolapi" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.ap-southeast-5.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-7" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.ap-southeast-7.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cloudcontrolapi-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "cloudcontrolapi.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cloudcontrolapi-fips.ca-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "cloudcontrolapi.ca-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudcontrolapi-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudcontrolapi-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudcontrolapi-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudcontrolapi-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudcontrolapi-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudcontrolapi-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "mx-central-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.mx-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cloudcontrolapi-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "cloudcontrolapi.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cloudcontrolapi-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "cloudcontrolapi.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cloudcontrolapi-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "cloudcontrolapi.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cloudcontrolapi-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "cloudcontrolapi.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "clouddirectory" : {
+ "endpoints" : {
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "cloudformation" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "cloudformation-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudformation-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "cloudformation-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudformation-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "cloudformation-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudformation-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "cloudformation-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudformation-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "cloudfront" : {
+ "endpoints" : {
+ "aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "cloudfront.amazonaws.com",
+ "protocols" : [ "http", "https" ]
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-global"
+ },
+ "cloudhsm" : {
+ "endpoints" : {
+ "us-east-1" : { }
+ }
+ },
+ "cloudhsmv2" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "cloudhsm"
+ }
+ },
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "cloudsearch" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "cloudtrail" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudtrail-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudtrail-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudtrail-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudtrail-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "cloudtrail-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "cloudtrail-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "cloudtrail-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "cloudtrail-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "cloudtrail-data" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "codeartifact" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "codebuild" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "codebuild-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "codebuild-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "codebuild-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "codebuild-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "codebuild-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "codebuild-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "codebuild-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "codebuild-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "codecatalyst" : {
+ "endpoints" : {
+ "aws-global" : {
+ "hostname" : "codecatalyst.global.api.aws"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-global"
+ },
+ "codecommit" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "codecommit-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "codecommit-fips.ca-central-1.amazonaws.com"
+ },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "codecommit-fips.ca-central-1.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "codecommit-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "codecommit-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "codecommit-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "codecommit-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "codecommit-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "codecommit-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "codecommit-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "codecommit-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "codedeploy" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "codedeploy-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "codedeploy-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "codedeploy-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "codedeploy-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "codedeploy-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "codedeploy-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "codedeploy-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "codedeploy-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "codeguru-reviewer" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "codepipeline" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "codepipeline-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "codepipeline-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "codepipeline-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "codepipeline-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "codepipeline-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "codepipeline-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "codepipeline-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "codepipeline-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "codepipeline-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "codepipeline-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "codestar-connections" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "codestar-notifications" : {
+ "endpoints" : {
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "cognito-identity" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.af-south-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.ap-east-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.ap-northeast-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.ap-northeast-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.ap-northeast-3.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.ap-south-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.ap-south-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.ap-southeast-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.ap-southeast-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.ap-southeast-3.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.ap-southeast-4.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.ap-southeast-5.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.ca-central-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.ca-west-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.eu-central-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.eu-central-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.eu-north-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.eu-south-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.eu-south-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.eu-west-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.eu-west-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.eu-west-3.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cognito-identity-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "cognito-identity-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cognito-identity-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "cognito-identity-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.il-central-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.me-central-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.me-south-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.sa-east-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity-fips.us-east-1.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "cognito-identity-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cognito-identity.us-east-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity-fips.us-east-2.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "cognito-identity-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cognito-identity.us-east-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity-fips.us-west-1.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "cognito-identity-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cognito-identity.us-west-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity-fips.us-west-2.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "cognito-identity-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cognito-identity.us-west-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "cognito-idp" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.af-south-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.ap-east-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.ap-northeast-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.ap-northeast-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.ap-northeast-3.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.ap-south-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.ap-south-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.ap-southeast-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.ap-southeast-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.ap-southeast-3.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.ap-southeast-4.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.ap-southeast-5.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.ca-central-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.ca-west-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.eu-central-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.eu-central-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.eu-north-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.eu-south-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.eu-south-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.eu-west-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.eu-west-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.eu-west-3.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cognito-idp-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "cognito-idp-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cognito-idp-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "cognito-idp-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.il-central-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.me-central-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.me-south-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.sa-east-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp-fips.us-east-1.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "cognito-idp-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cognito-idp.us-east-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp-fips.us-east-2.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "cognito-idp-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cognito-idp.us-east-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp-fips.us-west-1.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "cognito-idp-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cognito-idp.us-west-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp-fips.us-west-2.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "cognito-idp-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cognito-idp.us-west-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "cognito-sync" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "comprehend" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "comprehend-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "comprehend-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "comprehend-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "comprehend-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "comprehend-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "comprehend-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "comprehend-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "comprehend-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "comprehendmedical" : {
+ "endpoints" : {
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "comprehendmedical-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "comprehendmedical-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "comprehendmedical-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "comprehendmedical-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "comprehendmedical-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "comprehendmedical-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "comprehendmedical-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "comprehendmedical-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "compute-optimizer" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "credentialScope" : {
+ "region" : "af-south-1"
+ },
+ "hostname" : "compute-optimizer.af-south-1.amazonaws.com"
+ },
+ "ap-east-1" : {
+ "credentialScope" : {
+ "region" : "ap-east-1"
+ },
+ "hostname" : "compute-optimizer.ap-east-1.amazonaws.com"
+ },
+ "ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "hostname" : "compute-optimizer.ap-northeast-1.amazonaws.com"
+ },
+ "ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "hostname" : "compute-optimizer.ap-northeast-2.amazonaws.com"
+ },
+ "ap-northeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-3"
+ },
+ "hostname" : "compute-optimizer.ap-northeast-3.amazonaws.com"
+ },
+ "ap-south-1" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "hostname" : "compute-optimizer.ap-south-1.amazonaws.com"
+ },
+ "ap-south-2" : {
+ "credentialScope" : {
+ "region" : "ap-south-2"
+ },
+ "hostname" : "compute-optimizer.ap-south-2.amazonaws.com"
+ },
+ "ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "hostname" : "compute-optimizer.ap-southeast-1.amazonaws.com"
+ },
+ "ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "hostname" : "compute-optimizer.ap-southeast-2.amazonaws.com"
+ },
+ "ap-southeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-3"
+ },
+ "hostname" : "compute-optimizer.ap-southeast-3.amazonaws.com"
+ },
+ "ap-southeast-4" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-4"
+ },
+ "hostname" : "compute-optimizer.ap-southeast-4.amazonaws.com"
+ },
+ "ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "hostname" : "compute-optimizer.ca-central-1.amazonaws.com"
+ },
+ "eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "hostname" : "compute-optimizer.eu-central-1.amazonaws.com"
+ },
+ "eu-central-2" : {
+ "credentialScope" : {
+ "region" : "eu-central-2"
+ },
+ "hostname" : "compute-optimizer.eu-central-2.amazonaws.com"
+ },
+ "eu-north-1" : {
+ "credentialScope" : {
+ "region" : "eu-north-1"
+ },
+ "hostname" : "compute-optimizer.eu-north-1.amazonaws.com"
+ },
+ "eu-south-1" : {
+ "credentialScope" : {
+ "region" : "eu-south-1"
+ },
+ "hostname" : "compute-optimizer.eu-south-1.amazonaws.com"
+ },
+ "eu-south-2" : {
+ "credentialScope" : {
+ "region" : "eu-south-2"
+ },
+ "hostname" : "compute-optimizer.eu-south-2.amazonaws.com"
+ },
+ "eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "hostname" : "compute-optimizer.eu-west-1.amazonaws.com"
+ },
+ "eu-west-2" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "hostname" : "compute-optimizer.eu-west-2.amazonaws.com"
+ },
+ "eu-west-3" : {
+ "credentialScope" : {
+ "region" : "eu-west-3"
+ },
+ "hostname" : "compute-optimizer.eu-west-3.amazonaws.com"
+ },
+ "il-central-1" : {
+ "credentialScope" : {
+ "region" : "il-central-1"
+ },
+ "hostname" : "compute-optimizer.il-central-1.amazonaws.com"
+ },
+ "me-central-1" : {
+ "credentialScope" : {
+ "region" : "me-central-1"
+ },
+ "hostname" : "compute-optimizer.me-central-1.amazonaws.com"
+ },
+ "me-south-1" : {
+ "credentialScope" : {
+ "region" : "me-south-1"
+ },
+ "hostname" : "compute-optimizer.me-south-1.amazonaws.com"
+ },
+ "sa-east-1" : {
+ "credentialScope" : {
+ "region" : "sa-east-1"
+ },
+ "hostname" : "compute-optimizer.sa-east-1.amazonaws.com"
+ },
+ "us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "compute-optimizer.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "hostname" : "compute-optimizer.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "hostname" : "compute-optimizer.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "compute-optimizer.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "config" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "config-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "config-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "config-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "config-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "config-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "config-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "config-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "config-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "connect" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "connect-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-west-2" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "connect-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "connect-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "connect-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "connect-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "connect-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "connect-campaigns" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-west-2" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "connect-campaigns-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "connect-campaigns-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "connect-campaigns-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "connect-campaigns-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "contact-lens" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "controltower" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "controltower-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "controltower-fips.ca-central-1.amazonaws.com"
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "controltower-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "controltower-fips.ca-west-1.amazonaws.com"
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "controltower-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "controltower-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "controltower-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "controltower-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "controltower-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "controltower-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "controltower-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "controltower-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "cost-optimization-hub" : {
+ "endpoints" : {
+ "us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "cost-optimization-hub.us-east-1.amazonaws.com"
+ }
+ }
+ },
+ "cur" : {
+ "endpoints" : {
+ "us-east-1" : { }
+ }
+ },
+ "data-ats.iot" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "iotdata"
+ },
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "data.iot-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "service" : "iotdata"
+ },
+ "deprecated" : true,
+ "hostname" : "data.iot-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "service" : "iotdata"
+ },
+ "deprecated" : true,
+ "hostname" : "data.iot-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "service" : "iotdata"
+ },
+ "deprecated" : true,
+ "hostname" : "data.iot-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "service" : "iotdata"
+ },
+ "deprecated" : true,
+ "hostname" : "data.iot-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "service" : "iotdata"
+ },
+ "deprecated" : true,
+ "hostname" : "data.iot-fips.us-west-2.amazonaws.com"
+ },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "data.iot-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "data.iot-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "data.iot-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "data.iot-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "data.iot" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "iotdata"
+ },
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "data.iot-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "service" : "iotdata"
+ },
+ "deprecated" : true,
+ "hostname" : "data.iot-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "service" : "iotdata"
+ },
+ "deprecated" : true,
+ "hostname" : "data.iot-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "service" : "iotdata"
+ },
+ "deprecated" : true,
+ "hostname" : "data.iot-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "service" : "iotdata"
+ },
+ "deprecated" : true,
+ "hostname" : "data.iot-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "service" : "iotdata"
+ },
+ "deprecated" : true,
+ "hostname" : "data.iot-fips.us-west-2.amazonaws.com"
+ },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "data.iot-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "data.iot-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "data.iot-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "data.iot-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "data.jobs.iot" : {
+ "endpoints" : {
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "data.jobs.iot-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "data.jobs.iot-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "data.jobs.iot-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "data.jobs.iot-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "data.jobs.iot-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "data.jobs.iot-fips.us-west-2.amazonaws.com"
+ },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "data.jobs.iot-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "data.jobs.iot-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "data.jobs.iot-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "data.jobs.iot-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "data.mediastore" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "databrew" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "databrew-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "databrew-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "databrew-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "databrew-fips.us-west-2.amazonaws.com"
+ },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "databrew-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "databrew-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "databrew-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "databrew-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "dataexchange" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "datapipeline" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-west-1" : { },
+ "us-east-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "datasync" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "datasync.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "datasync.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "datasync.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "datasync.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "datasync.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "datasync.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "datasync.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "datasync.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "datasync.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "datasync.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "datasync.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "variants" : [ {
+ "hostname" : "datasync.ap-southeast-5.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-7" : {
+ "variants" : [ {
+ "hostname" : "datasync.ap-southeast-7.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "datasync-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "datasync-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "datasync.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "datasync-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "datasync-fips.ca-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "datasync.ca-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "datasync.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "datasync.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "datasync.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "datasync.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "datasync.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "datasync.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "datasync.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "datasync.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "datasync-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "datasync-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "datasync-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "datasync-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "datasync-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "datasync-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "datasync.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "datasync.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "datasync.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "mx-central-1" : {
+ "variants" : [ {
+ "hostname" : "datasync.mx-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "datasync.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "datasync-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "datasync-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "datasync.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "datasync-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "datasync-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "datasync.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "datasync-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "datasync-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "datasync.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "datasync-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "datasync-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "datasync.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "datazone" : {
+ "defaults" : {
+ "dnsSuffix" : "api.aws",
+ "variants" : [ {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "ap-northeast-1" : {
+ "hostname" : "datazone.ap-northeast-1.api.aws"
+ },
+ "ap-northeast-2" : {
+ "hostname" : "datazone.ap-northeast-2.api.aws"
+ },
+ "ap-northeast-3" : {
+ "hostname" : "datazone.ap-northeast-3.api.aws"
+ },
+ "ap-south-1" : {
+ "hostname" : "datazone.ap-south-1.api.aws"
+ },
+ "ap-south-2" : {
+ "hostname" : "datazone.ap-south-2.api.aws"
+ },
+ "ap-southeast-1" : {
+ "hostname" : "datazone.ap-southeast-1.api.aws"
+ },
+ "ap-southeast-2" : {
+ "hostname" : "datazone.ap-southeast-2.api.aws"
+ },
+ "ap-southeast-3" : {
+ "hostname" : "datazone.ap-southeast-3.api.aws"
+ },
+ "ap-southeast-4" : {
+ "hostname" : "datazone.ap-southeast-4.api.aws"
+ },
+ "ap-southeast-5" : {
+ "hostname" : "datazone.ap-southeast-5.api.aws"
+ },
+ "ap-southeast-7" : {
+ "hostname" : "datazone.ap-southeast-7.api.aws"
+ },
+ "ca-central-1" : {
+ "hostname" : "datazone.ca-central-1.api.aws",
+ "variants" : [ {
+ "hostname" : "datazone-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "hostname" : "datazone.ca-west-1.api.aws"
+ },
+ "eu-central-1" : {
+ "hostname" : "datazone.eu-central-1.api.aws"
+ },
+ "eu-north-1" : {
+ "hostname" : "datazone.eu-north-1.api.aws"
+ },
+ "eu-south-1" : {
+ "hostname" : "datazone.eu-south-1.api.aws"
+ },
+ "eu-west-1" : {
+ "hostname" : "datazone.eu-west-1.api.aws"
+ },
+ "eu-west-2" : {
+ "hostname" : "datazone.eu-west-2.api.aws"
+ },
+ "eu-west-3" : {
+ "hostname" : "datazone.eu-west-3.api.aws"
+ },
+ "il-central-1" : {
+ "hostname" : "datazone.il-central-1.api.aws"
+ },
+ "me-central-1" : {
+ "hostname" : "datazone.me-central-1.api.aws"
+ },
+ "me-south-1" : {
+ "hostname" : "datazone.me-south-1.api.aws"
+ },
+ "mx-central-1" : {
+ "hostname" : "datazone.mx-central-1.api.aws"
+ },
+ "sa-east-1" : {
+ "hostname" : "datazone.sa-east-1.api.aws"
+ },
+ "us-east-1" : {
+ "hostname" : "datazone.us-east-1.api.aws",
+ "variants" : [ {
+ "hostname" : "datazone-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "hostname" : "datazone.us-east-2.api.aws",
+ "variants" : [ {
+ "hostname" : "datazone-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "hostname" : "datazone.us-west-1.api.aws"
+ },
+ "us-west-2" : {
+ "hostname" : "datazone.us-west-2.api.aws",
+ "variants" : [ {
+ "hostname" : "datazone-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "dax" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "devicefarm" : {
+ "endpoints" : {
+ "us-west-2" : { }
+ }
+ },
+ "devops-guru" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "devops-guru-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "devops-guru-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "devops-guru-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "devops-guru-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "devops-guru-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "devops-guru-fips.us-west-2.amazonaws.com"
+ },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "devops-guru-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "devops-guru-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "devops-guru-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "devops-guru-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "directconnect" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "directconnect-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "directconnect-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "directconnect-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "directconnect-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "directconnect-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "directconnect-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "directconnect-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "directconnect-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "directconnect-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "directconnect-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "directconnect-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "directconnect-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "discovery" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "dlm" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "dlm.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "dlm.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "dlm.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "dlm.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "dlm.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "dlm.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "dlm.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "dlm.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "dlm.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "dlm.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "dlm.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "variants" : [ {
+ "hostname" : "dlm.ap-southeast-5.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-7" : {
+ "variants" : [ {
+ "hostname" : "dlm.ap-southeast-7.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "dlm-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "dlm.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "dlm-fips.ca-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "dlm.ca-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "dlm.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "dlm.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "dlm.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "dlm.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "dlm.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "dlm.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "dlm.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "dlm.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "dlm.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "dlm.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "dlm.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "mx-central-1" : {
+ "variants" : [ {
+ "hostname" : "dlm.mx-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "dlm.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "dlm-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "dlm.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "dlm-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "dlm.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "dlm-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "dlm.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "dlm-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "dlm.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "dms" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "dms" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "dms-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "dms-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dms-fips.us-west-1.amazonaws.com"
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "dms-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dms-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "dms-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "dms-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "dms-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dms-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "dms-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "dms-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "docdb" : {
+ "endpoints" : {
+ "ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "hostname" : "rds.ap-northeast-1.amazonaws.com"
+ },
+ "ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "hostname" : "rds.ap-northeast-2.amazonaws.com"
+ },
+ "ap-south-1" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "hostname" : "rds.ap-south-1.amazonaws.com"
+ },
+ "ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "hostname" : "rds.ap-southeast-1.amazonaws.com"
+ },
+ "ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "hostname" : "rds.ap-southeast-2.amazonaws.com"
+ },
+ "ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "hostname" : "rds.ca-central-1.amazonaws.com"
+ },
+ "eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "hostname" : "rds.eu-central-1.amazonaws.com"
+ },
+ "eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "hostname" : "rds.eu-west-1.amazonaws.com"
+ },
+ "eu-west-2" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "hostname" : "rds.eu-west-2.amazonaws.com"
+ },
+ "eu-west-3" : {
+ "credentialScope" : {
+ "region" : "eu-west-3"
+ },
+ "hostname" : "rds.eu-west-3.amazonaws.com"
+ },
+ "sa-east-1" : {
+ "credentialScope" : {
+ "region" : "sa-east-1"
+ },
+ "hostname" : "rds.sa-east-1.amazonaws.com"
+ },
+ "us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "rds.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "hostname" : "rds.us-east-2.amazonaws.com"
+ },
+ "us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "rds.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "drs" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "drs-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "drs-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "drs-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "drs-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "drs-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "drs-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "drs-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "drs-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "ds" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "ds-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "ds-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ds-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ds-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ds-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ds-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ds-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ds-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "ds-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "ds-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "ds-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "ds-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "dynamodb" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "dynamodb-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dynamodb-fips.ca-central-1.amazonaws.com"
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "dynamodb-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dynamodb-fips.ca-west-1.amazonaws.com"
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "local" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "localhost:8000",
+ "protocols" : [ "http" ]
+ },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "dynamodb-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dynamodb-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "dynamodb-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "dynamodb-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "dynamodb-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dynamodb-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "dynamodb-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "dynamodb-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "ebs" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "ebs-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "ebs-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ebs-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ebs-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ebs-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ebs-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ebs-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ebs-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "ebs-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "ebs-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "ebs-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "ebs-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "ec2" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "ec2.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "ec2.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "ec2.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "ec2.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : { },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "ec2.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : { },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "ec2.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "ec2.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "ec2-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ec2.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "ec2-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "ec2.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : { },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "ec2.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "ec2.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : { },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "ec2.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "ec2.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "ec2.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ec2-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ec2-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ec2-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ec2-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ec2-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ec2-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "ec2.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "mx-central-1" : { },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "ec2.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "ec2-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ec2.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "ec2-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ec2.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "ec2-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ec2.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "ec2-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ec2.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "ecs" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ecs-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ecs-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ecs-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ecs-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "ecs-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "ecs-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "ecs-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "ecs-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "edge.sagemaker" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "eks" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ],
+ "variants" : [ {
+ "hostname" : "fips.eks.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fips.eks.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "fips.eks.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fips.eks.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "fips.eks.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "fips.eks.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "fips.eks.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "fips.eks.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "fips.eks.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "eks-auth" : {
+ "defaults" : {
+ "dnsSuffix" : "api.aws",
+ "variants" : [ {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "af-south-1" : {
+ "hostname" : "eks-auth.af-south-1.api.aws"
+ },
+ "ap-east-1" : {
+ "hostname" : "eks-auth.ap-east-1.api.aws"
+ },
+ "ap-northeast-1" : {
+ "hostname" : "eks-auth.ap-northeast-1.api.aws"
+ },
+ "ap-northeast-2" : {
+ "hostname" : "eks-auth.ap-northeast-2.api.aws"
+ },
+ "ap-northeast-3" : {
+ "hostname" : "eks-auth.ap-northeast-3.api.aws"
+ },
+ "ap-south-1" : {
+ "hostname" : "eks-auth.ap-south-1.api.aws"
+ },
+ "ap-south-2" : {
+ "hostname" : "eks-auth.ap-south-2.api.aws"
+ },
+ "ap-southeast-1" : {
+ "hostname" : "eks-auth.ap-southeast-1.api.aws"
+ },
+ "ap-southeast-2" : {
+ "hostname" : "eks-auth.ap-southeast-2.api.aws"
+ },
+ "ap-southeast-3" : {
+ "hostname" : "eks-auth.ap-southeast-3.api.aws"
+ },
+ "ap-southeast-4" : {
+ "hostname" : "eks-auth.ap-southeast-4.api.aws"
+ },
+ "ap-southeast-5" : {
+ "hostname" : "eks-auth.ap-southeast-5.api.aws"
+ },
+ "ap-southeast-7" : {
+ "hostname" : "eks-auth.ap-southeast-7.api.aws"
+ },
+ "ca-central-1" : {
+ "hostname" : "eks-auth.ca-central-1.api.aws"
+ },
+ "ca-west-1" : {
+ "hostname" : "eks-auth.ca-west-1.api.aws"
+ },
+ "eu-central-1" : {
+ "hostname" : "eks-auth.eu-central-1.api.aws"
+ },
+ "eu-central-2" : {
+ "hostname" : "eks-auth.eu-central-2.api.aws"
+ },
+ "eu-north-1" : {
+ "hostname" : "eks-auth.eu-north-1.api.aws"
+ },
+ "eu-south-1" : {
+ "hostname" : "eks-auth.eu-south-1.api.aws"
+ },
+ "eu-south-2" : {
+ "hostname" : "eks-auth.eu-south-2.api.aws"
+ },
+ "eu-west-1" : {
+ "hostname" : "eks-auth.eu-west-1.api.aws"
+ },
+ "eu-west-2" : {
+ "hostname" : "eks-auth.eu-west-2.api.aws"
+ },
+ "eu-west-3" : {
+ "hostname" : "eks-auth.eu-west-3.api.aws"
+ },
+ "il-central-1" : {
+ "hostname" : "eks-auth.il-central-1.api.aws"
+ },
+ "me-central-1" : {
+ "hostname" : "eks-auth.me-central-1.api.aws"
+ },
+ "me-south-1" : {
+ "hostname" : "eks-auth.me-south-1.api.aws"
+ },
+ "mx-central-1" : {
+ "hostname" : "eks-auth.mx-central-1.api.aws"
+ },
+ "sa-east-1" : {
+ "hostname" : "eks-auth.sa-east-1.api.aws"
+ },
+ "us-east-1" : {
+ "hostname" : "eks-auth.us-east-1.api.aws"
+ },
+ "us-east-2" : {
+ "hostname" : "eks-auth.us-east-2.api.aws"
+ },
+ "us-west-1" : {
+ "hostname" : "eks-auth.us-west-1.api.aws"
+ },
+ "us-west-2" : {
+ "hostname" : "eks-auth.us-west-2.api.aws"
+ }
+ }
+ },
+ "elasticache" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticache-fips.us-west-1.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "elasticache-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticache-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "elasticache-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticache-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "elasticache-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticache-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "elasticache-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticache-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "elasticbeanstalk" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticbeanstalk-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticbeanstalk-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticbeanstalk-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticbeanstalk-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "elasticbeanstalk-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "elasticbeanstalk.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "elasticbeanstalk-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "elasticbeanstalk.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "elasticbeanstalk-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "elasticbeanstalk.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "elasticbeanstalk-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "elasticbeanstalk.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "elasticfilesystem" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.af-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.ap-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.ap-northeast-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.ap-northeast-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.ap-northeast-3.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.ap-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.ap-south-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.ap-southeast-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.ap-southeast-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.ap-southeast-3.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.ap-southeast-4.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.ap-southeast-5.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-7" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.ap-southeast-7.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.eu-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.eu-central-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.eu-north-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.eu-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.eu-south-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.eu-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.eu-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.eu-west-3.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "fips-af-south-1" : {
+ "credentialScope" : {
+ "region" : "af-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.af-south-1.amazonaws.com"
+ },
+ "fips-ap-east-1" : {
+ "credentialScope" : {
+ "region" : "ap-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.ap-east-1.amazonaws.com"
+ },
+ "fips-ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.ap-northeast-1.amazonaws.com"
+ },
+ "fips-ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.ap-northeast-2.amazonaws.com"
+ },
+ "fips-ap-northeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-3"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.ap-northeast-3.amazonaws.com"
+ },
+ "fips-ap-south-1" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.ap-south-1.amazonaws.com"
+ },
+ "fips-ap-south-2" : {
+ "credentialScope" : {
+ "region" : "ap-south-2"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.ap-south-2.amazonaws.com"
+ },
+ "fips-ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.ap-southeast-1.amazonaws.com"
+ },
+ "fips-ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.ap-southeast-2.amazonaws.com"
+ },
+ "fips-ap-southeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-3"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.ap-southeast-3.amazonaws.com"
+ },
+ "fips-ap-southeast-4" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-4"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.ap-southeast-4.amazonaws.com"
+ },
+ "fips-ap-southeast-5" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-5"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.ap-southeast-5.amazonaws.com"
+ },
+ "fips-ap-southeast-7" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-7"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.ap-southeast-7.amazonaws.com"
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.eu-central-1.amazonaws.com"
+ },
+ "fips-eu-central-2" : {
+ "credentialScope" : {
+ "region" : "eu-central-2"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.eu-central-2.amazonaws.com"
+ },
+ "fips-eu-north-1" : {
+ "credentialScope" : {
+ "region" : "eu-north-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.eu-north-1.amazonaws.com"
+ },
+ "fips-eu-south-1" : {
+ "credentialScope" : {
+ "region" : "eu-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.eu-south-1.amazonaws.com"
+ },
+ "fips-eu-south-2" : {
+ "credentialScope" : {
+ "region" : "eu-south-2"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.eu-south-2.amazonaws.com"
+ },
+ "fips-eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.eu-west-1.amazonaws.com"
+ },
+ "fips-eu-west-2" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.eu-west-2.amazonaws.com"
+ },
+ "fips-eu-west-3" : {
+ "credentialScope" : {
+ "region" : "eu-west-3"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.eu-west-3.amazonaws.com"
+ },
+ "fips-il-central-1" : {
+ "credentialScope" : {
+ "region" : "il-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.il-central-1.amazonaws.com"
+ },
+ "fips-me-central-1" : {
+ "credentialScope" : {
+ "region" : "me-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.me-central-1.amazonaws.com"
+ },
+ "fips-me-south-1" : {
+ "credentialScope" : {
+ "region" : "me-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.me-south-1.amazonaws.com"
+ },
+ "fips-mx-central-1" : {
+ "credentialScope" : {
+ "region" : "mx-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.mx-central-1.amazonaws.com"
+ },
+ "fips-sa-east-1" : {
+ "credentialScope" : {
+ "region" : "sa-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.sa-east-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.il-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.me-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.me-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "mx-central-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.mx-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.sa-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "elasticloadbalancing" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticloadbalancing-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticloadbalancing-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticloadbalancing-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticloadbalancing-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "elasticloadbalancing-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "elasticloadbalancing-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "elasticloadbalancing-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "elasticloadbalancing-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "elasticmapreduce" : {
+ "defaults" : {
+ "protocols" : [ "https" ],
+ "sslCommonName" : "{region}.{service}.{dnsSuffix}"
+ },
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "elasticmapreduce-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "elasticmapreduce-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "sslCommonName" : "{service}.{region}.{dnsSuffix}"
+ },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticmapreduce-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticmapreduce-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticmapreduce-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticmapreduce-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticmapreduce-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticmapreduce-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "sslCommonName" : "{service}.{region}.{dnsSuffix}",
+ "variants" : [ {
+ "hostname" : "elasticmapreduce-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "elasticmapreduce-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "elasticmapreduce.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "elasticmapreduce-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "elasticmapreduce-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "elastictranscoder" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-west-1" : { },
+ "us-east-1" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "email" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "email-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "email-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "email-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "email-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "email-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "email-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "email-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "email-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "email-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "email-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "emr-containers" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "emr-containers-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "emr-containers-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "emr-containers-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "emr-containers-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "emr-containers-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "emr-containers-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "emr-containers-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "emr-containers-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "emr-containers-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "emr-containers-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "emr-serverless" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "emr-serverless-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "emr-serverless-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "emr-serverless-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "emr-serverless-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "emr-serverless-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "emr-serverless-fips.us-west-2.amazonaws.com"
+ },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "emr-serverless-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "emr-serverless-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "emr-serverless-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "emr-serverless-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "entitlement.marketplace" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "aws-marketplace"
+ }
+ },
+ "endpoints" : {
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "entitlement-marketplace.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "es" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "aos.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "aos.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "aos.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "aos.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "aos.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "aos.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "aos.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "aos.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "aos.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "aos.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "aos.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "variants" : [ {
+ "hostname" : "aos.ap-southeast-5.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-7" : {
+ "variants" : [ {
+ "hostname" : "aos.ap-southeast-7.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "aos.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "aos.ca-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "aos.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "aos.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "aos.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "aos.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "aos.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "aos.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "aos.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "aos.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "es-fips.us-west-1.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "aos.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "aos.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "aos.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "mx-central-1" : {
+ "variants" : [ {
+ "hostname" : "aos.mx-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "aos.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "aos.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "es-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "es-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "aos.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "es-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "es-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "aos.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "es-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "es-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "aos.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "es-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "es-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "events" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "events-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "events-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "events-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "events-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "events-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "events-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "events-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "events-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "evidently" : {
+ "endpoints" : {
+ "ap-northeast-1" : {
+ "hostname" : "evidently.ap-northeast-1.amazonaws.com"
+ },
+ "ap-southeast-1" : {
+ "hostname" : "evidently.ap-southeast-1.amazonaws.com"
+ },
+ "ap-southeast-2" : {
+ "hostname" : "evidently.ap-southeast-2.amazonaws.com"
+ },
+ "eu-central-1" : {
+ "hostname" : "evidently.eu-central-1.amazonaws.com"
+ },
+ "eu-north-1" : {
+ "hostname" : "evidently.eu-north-1.amazonaws.com"
+ },
+ "eu-west-1" : {
+ "hostname" : "evidently.eu-west-1.amazonaws.com"
+ },
+ "us-east-1" : {
+ "hostname" : "evidently.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "hostname" : "evidently.us-east-2.amazonaws.com"
+ },
+ "us-west-2" : {
+ "hostname" : "evidently.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "finspace" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "finspace-api" : {
+ "endpoints" : {
+ "ca-central-1" : { },
+ "eu-west-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "firehose" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "firehose.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "firehose.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "firehose.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "firehose.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "firehose.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "firehose.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "firehose.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "firehose.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "firehose.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "firehose.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "firehose.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : {
+ "variants" : [ {
+ "hostname" : "firehose.ap-southeast-7.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "firehose.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "firehose.ca-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "firehose.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "firehose.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "firehose.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "firehose.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "firehose.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "firehose.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "firehose.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "firehose.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "firehose-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "firehose-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "firehose-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "firehose-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "firehose.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "firehose.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "firehose.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "mx-central-1" : {
+ "variants" : [ {
+ "hostname" : "firehose.mx-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "firehose.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "firehose-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "firehose-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "firehose.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "firehose-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "firehose-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "firehose.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "firehose-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "firehose-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "firehose.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "firehose-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "firehose-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "firehose.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "fms" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.af-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.ap-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.ap-northeast-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.ap-northeast-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-northeast-3" : { },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.ap-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-south-2" : { },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.ap-southeast-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.ap-southeast-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.eu-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.eu-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-south-2" : { },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.eu-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.eu-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.eu-west-3.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "fips-af-south-1" : {
+ "credentialScope" : {
+ "region" : "af-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.af-south-1.amazonaws.com"
+ },
+ "fips-ap-east-1" : {
+ "credentialScope" : {
+ "region" : "ap-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.ap-east-1.amazonaws.com"
+ },
+ "fips-ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.ap-northeast-1.amazonaws.com"
+ },
+ "fips-ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.ap-northeast-2.amazonaws.com"
+ },
+ "fips-ap-south-1" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.ap-south-1.amazonaws.com"
+ },
+ "fips-ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.ap-southeast-1.amazonaws.com"
+ },
+ "fips-ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.ap-southeast-2.amazonaws.com"
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.eu-central-1.amazonaws.com"
+ },
+ "fips-eu-south-1" : {
+ "credentialScope" : {
+ "region" : "eu-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.eu-south-1.amazonaws.com"
+ },
+ "fips-eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.eu-west-1.amazonaws.com"
+ },
+ "fips-eu-west-2" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.eu-west-2.amazonaws.com"
+ },
+ "fips-eu-west-3" : {
+ "credentialScope" : {
+ "region" : "eu-west-3"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.eu-west-3.amazonaws.com"
+ },
+ "fips-me-south-1" : {
+ "credentialScope" : {
+ "region" : "me-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.me-south-1.amazonaws.com"
+ },
+ "fips-sa-east-1" : {
+ "credentialScope" : {
+ "region" : "sa-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.sa-east-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.me-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "mx-central-1" : { },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.sa-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "forecast" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "forecast-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "forecast-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "forecast-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "forecast-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "forecast-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "forecast-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "forecastquery" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "forecastquery-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "forecastquery-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "forecastquery-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "forecastquery-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "forecastquery-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "forecastquery-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "frauddetector" : {
+ "endpoints" : {
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-west-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "fsx" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "fsx-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "fsx-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fsx-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fsx-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-prod-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fsx-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-prod-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fsx-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-prod-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fsx-fips.us-east-1.amazonaws.com"
+ },
+ "fips-prod-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "fsx-fips.us-east-2.amazonaws.com"
+ },
+ "fips-prod-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fsx-fips.us-west-1.amazonaws.com"
+ },
+ "fips-prod-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "fsx-fips.us-west-2.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fsx-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "fsx-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fsx-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "fsx-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "prod-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "fsx-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "prod-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "fsx-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "prod-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "fsx-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "prod-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "fsx-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "prod-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "fsx-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "prod-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "fsx-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "fsx-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "fsx-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "fsx-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "fsx-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "gamelift" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "gameliftstreams" : {
+ "defaults" : {
+ "dnsSuffix" : "api.aws",
+ "variants" : [ {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "af-south-1" : {
+ "hostname" : "gameliftstreams.af-south-1.api.aws"
+ },
+ "ap-east-1" : {
+ "hostname" : "gameliftstreams.ap-east-1.api.aws"
+ },
+ "ap-northeast-1" : {
+ "hostname" : "gameliftstreams.ap-northeast-1.api.aws"
+ },
+ "ap-northeast-2" : {
+ "hostname" : "gameliftstreams.ap-northeast-2.api.aws"
+ },
+ "ap-northeast-3" : {
+ "hostname" : "gameliftstreams.ap-northeast-3.api.aws"
+ },
+ "ap-south-1" : {
+ "hostname" : "gameliftstreams.ap-south-1.api.aws"
+ },
+ "ap-south-2" : {
+ "hostname" : "gameliftstreams.ap-south-2.api.aws"
+ },
+ "ap-southeast-1" : {
+ "hostname" : "gameliftstreams.ap-southeast-1.api.aws"
+ },
+ "ap-southeast-2" : {
+ "hostname" : "gameliftstreams.ap-southeast-2.api.aws"
+ },
+ "ap-southeast-3" : {
+ "hostname" : "gameliftstreams.ap-southeast-3.api.aws"
+ },
+ "ap-southeast-4" : {
+ "hostname" : "gameliftstreams.ap-southeast-4.api.aws"
+ },
+ "ap-southeast-5" : {
+ "hostname" : "gameliftstreams.ap-southeast-5.api.aws"
+ },
+ "ap-southeast-7" : {
+ "hostname" : "gameliftstreams.ap-southeast-7.api.aws"
+ },
+ "ca-central-1" : {
+ "hostname" : "gameliftstreams.ca-central-1.api.aws"
+ },
+ "ca-west-1" : {
+ "hostname" : "gameliftstreams.ca-west-1.api.aws"
+ },
+ "eu-central-1" : {
+ "hostname" : "gameliftstreams.eu-central-1.api.aws"
+ },
+ "eu-central-2" : {
+ "hostname" : "gameliftstreams.eu-central-2.api.aws"
+ },
+ "eu-north-1" : {
+ "hostname" : "gameliftstreams.eu-north-1.api.aws"
+ },
+ "eu-south-1" : {
+ "hostname" : "gameliftstreams.eu-south-1.api.aws"
+ },
+ "eu-south-2" : {
+ "hostname" : "gameliftstreams.eu-south-2.api.aws"
+ },
+ "eu-west-1" : {
+ "hostname" : "gameliftstreams.eu-west-1.api.aws"
+ },
+ "eu-west-2" : {
+ "hostname" : "gameliftstreams.eu-west-2.api.aws"
+ },
+ "eu-west-3" : {
+ "hostname" : "gameliftstreams.eu-west-3.api.aws"
+ },
+ "il-central-1" : {
+ "hostname" : "gameliftstreams.il-central-1.api.aws"
+ },
+ "me-central-1" : {
+ "hostname" : "gameliftstreams.me-central-1.api.aws"
+ },
+ "me-south-1" : {
+ "hostname" : "gameliftstreams.me-south-1.api.aws"
+ },
+ "mx-central-1" : {
+ "hostname" : "gameliftstreams.mx-central-1.api.aws"
+ },
+ "sa-east-1" : {
+ "hostname" : "gameliftstreams.sa-east-1.api.aws"
+ },
+ "us-east-1" : {
+ "hostname" : "gameliftstreams.us-east-1.api.aws"
+ },
+ "us-east-2" : {
+ "hostname" : "gameliftstreams.us-east-2.api.aws"
+ },
+ "us-west-1" : {
+ "hostname" : "gameliftstreams.us-west-1.api.aws"
+ },
+ "us-west-2" : {
+ "hostname" : "gameliftstreams.us-west-2.api.aws"
+ }
+ }
+ },
+ "geo" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-5" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "glacier" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "glacier-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "glacier-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "glacier-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "glacier-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "glacier-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "glacier-fips.us-west-2.amazonaws.com"
+ },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "glacier-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "glacier-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "glacier-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "glacier-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "globalaccelerator" : {
+ "endpoints" : {
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "globalaccelerator-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "glue" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "glue.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "glue.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "glue.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "glue.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "glue.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "glue.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "glue.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "glue.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "glue.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "glue.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "glue.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "variants" : [ {
+ "hostname" : "glue.ap-southeast-5.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-7" : {
+ "variants" : [ {
+ "hostname" : "glue.ap-southeast-7.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "glue.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "glue.ca-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "glue.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "glue.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "glue.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "glue.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "glue.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "glue.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "glue.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "glue.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "glue-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "glue-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "glue-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "glue-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "glue.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "glue.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "glue.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "mx-central-1" : {
+ "variants" : [ {
+ "hostname" : "glue.mx-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "glue.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "glue-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "glue-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "glue.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "glue-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "glue-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "glue.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "glue-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "glue-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "glue.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "glue-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "glue-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "glue.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "grafana" : {
+ "endpoints" : {
+ "ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "hostname" : "grafana.ap-northeast-1.amazonaws.com"
+ },
+ "ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "hostname" : "grafana.ap-northeast-2.amazonaws.com"
+ },
+ "ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "hostname" : "grafana.ap-southeast-1.amazonaws.com"
+ },
+ "ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "hostname" : "grafana.ap-southeast-2.amazonaws.com"
+ },
+ "eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "hostname" : "grafana.eu-central-1.amazonaws.com"
+ },
+ "eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "hostname" : "grafana.eu-west-1.amazonaws.com"
+ },
+ "eu-west-2" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "hostname" : "grafana.eu-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "grafana.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "hostname" : "grafana.us-east-2.amazonaws.com"
+ },
+ "us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "grafana.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "greengrass" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "greengrass-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "greengrass-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "greengrass-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "greengrass-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "greengrass-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "greengrass-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "greengrass-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "greengrass-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ },
+ "isRegionalized" : true
+ },
+ "groundstation" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "groundstation-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "groundstation-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "groundstation-fips.us-west-2.amazonaws.com"
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "groundstation-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "groundstation-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "groundstation-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "groundstation-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "groundstation-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "groundstation-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ }
+ }
+ },
+ "guardduty" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "guardduty-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "guardduty-fips.ca-west-1.amazonaws.com"
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "guardduty-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "guardduty-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "guardduty-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "guardduty-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "guardduty-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "guardduty-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "guardduty-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "guardduty-fips.us-west-2.amazonaws.com"
+ }
+ },
+ "isRegionalized" : true
+ },
+ "health" : {
+ "defaults" : {
+ "protocols" : [ "https" ],
+ "sslCommonName" : "health.us-east-1.amazonaws.com"
+ },
+ "endpoints" : {
+ "aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "global.health.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "health-fips.us-east-2.amazonaws.com"
+ },
+ "us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "health-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-global"
+ },
+ "healthlake" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "ap-south-1" : { },
+ "ap-southeast-2" : { },
+ "eu-west-2" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "iam" : {
+ "endpoints" : {
+ "aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "iam.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "iam-fips.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "iam.global.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "aws-global-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "iam-fips.amazonaws.com"
+ },
+ "iam" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "iam-fips.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "iam-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "iam-fips.amazonaws.com"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-global"
+ },
+ "identity-chime" : {
+ "endpoints" : {
+ "eu-central-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "identity-chime-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "identity-chime-fips.us-east-1.amazonaws.com"
+ }
+ }
+ },
+ "identitystore" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "importexport" : {
+ "endpoints" : {
+ "aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1",
+ "service" : "IngestionService"
+ },
+ "hostname" : "importexport.amazonaws.com",
+ "signatureVersions" : [ "v2", "v4" ]
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-global"
+ },
+ "ingest.timestream" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-south-1" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "ingest-fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ingest.timestream-fips.us-east-1.amazonaws.com"
+ },
+ "ingest-fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ingest.timestream-fips.us-east-2.amazonaws.com"
+ },
+ "ingest-fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ingest.timestream-fips.us-west-2.amazonaws.com"
+ },
+ "ingest-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "ingest.timestream-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ingest-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "ingest.timestream-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ingest-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "ingest.timestream-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "inspector" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "inspector-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "inspector-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "inspector-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "inspector-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "inspector-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "inspector-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "inspector-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "inspector-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "inspector2" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "inspector2-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "inspector2-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "inspector2-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "inspector2-fips.us-west-2.amazonaws.com"
+ },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "inspector2-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "inspector2-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "inspector2-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "inspector2-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "internetmonitor" : {
+ "defaults" : {
+ "dnsSuffix" : "api.aws",
+ "variants" : [ {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "af-south-1" : {
+ "hostname" : "internetmonitor.af-south-1.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "hostname" : "internetmonitor.ap-east-1.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "hostname" : "internetmonitor.ap-northeast-1.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "hostname" : "internetmonitor.ap-northeast-2.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "hostname" : "internetmonitor.ap-northeast-3.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "hostname" : "internetmonitor.ap-south-1.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "hostname" : "internetmonitor.ap-south-2.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "hostname" : "internetmonitor.ap-southeast-1.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "hostname" : "internetmonitor.ap-southeast-2.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "hostname" : "internetmonitor.ap-southeast-3.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "hostname" : "internetmonitor.ap-southeast-4.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "hostname" : "internetmonitor.ap-southeast-5.api.aws"
+ },
+ "ap-southeast-7" : {
+ "hostname" : "internetmonitor.ap-southeast-7.api.aws"
+ },
+ "ca-central-1" : {
+ "hostname" : "internetmonitor.ca-central-1.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "internetmonitor-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "internetmonitor.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "hostname" : "internetmonitor.ca-west-1.api.aws"
+ },
+ "eu-central-1" : {
+ "hostname" : "internetmonitor.eu-central-1.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "hostname" : "internetmonitor.eu-central-2.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "hostname" : "internetmonitor.eu-north-1.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "hostname" : "internetmonitor.eu-south-1.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "hostname" : "internetmonitor.eu-south-2.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "hostname" : "internetmonitor.eu-west-1.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "hostname" : "internetmonitor.eu-west-2.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "hostname" : "internetmonitor.eu-west-3.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "il-central-1" : {
+ "hostname" : "internetmonitor.il-central-1.api.aws"
+ },
+ "me-central-1" : {
+ "hostname" : "internetmonitor.me-central-1.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "hostname" : "internetmonitor.me-south-1.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "mx-central-1" : {
+ "hostname" : "internetmonitor.mx-central-1.api.aws"
+ },
+ "sa-east-1" : {
+ "hostname" : "internetmonitor.sa-east-1.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "hostname" : "internetmonitor.us-east-1.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "internetmonitor-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "internetmonitor.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "hostname" : "internetmonitor.us-east-2.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "internetmonitor-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "internetmonitor.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "hostname" : "internetmonitor.us-west-1.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "internetmonitor-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "internetmonitor.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "hostname" : "internetmonitor.us-west-2.api.aws",
+ "variants" : [ {
+ "hostname" : "internetmonitor-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "internetmonitor-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "internetmonitor.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "iot" : {
+ "endpoints" : {
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "iot-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "deprecated" : true,
+ "hostname" : "iot-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "deprecated" : true,
+ "hostname" : "iot-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "deprecated" : true,
+ "hostname" : "iot-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "deprecated" : true,
+ "hostname" : "iot-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "deprecated" : true,
+ "hostname" : "iot-fips.us-west-2.amazonaws.com"
+ },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "iot-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "iot-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "iot-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "iot-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "iotanalytics" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-south-1" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "iotevents" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "iotevents-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "iotevents-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "iotevents-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "iotevents-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "iotevents-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "iotevents-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "iotevents-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "iotevents-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "ioteventsdata" : {
+ "endpoints" : {
+ "ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "hostname" : "data.iotevents.ap-northeast-1.amazonaws.com"
+ },
+ "ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "hostname" : "data.iotevents.ap-northeast-2.amazonaws.com"
+ },
+ "ap-south-1" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "hostname" : "data.iotevents.ap-south-1.amazonaws.com"
+ },
+ "ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "hostname" : "data.iotevents.ap-southeast-1.amazonaws.com"
+ },
+ "ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "hostname" : "data.iotevents.ap-southeast-2.amazonaws.com"
+ },
+ "ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "hostname" : "data.iotevents.ca-central-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "data.iotevents-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "hostname" : "data.iotevents.eu-central-1.amazonaws.com"
+ },
+ "eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "hostname" : "data.iotevents.eu-west-1.amazonaws.com"
+ },
+ "eu-west-2" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "hostname" : "data.iotevents.eu-west-2.amazonaws.com"
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "data.iotevents-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "data.iotevents-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "data.iotevents-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "data.iotevents-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "data.iotevents.us-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "data.iotevents-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "hostname" : "data.iotevents.us-east-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "data.iotevents-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "data.iotevents.us-west-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "data.iotevents-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "iotfleetwise" : {
+ "endpoints" : {
+ "ap-south-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "iotsecuredtunneling" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "api.tunneling.iot-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "api.tunneling.iot-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api.tunneling.iot-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api.tunneling.iot-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "api.tunneling.iot-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api.tunneling.iot-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "api.tunneling.iot-fips.us-west-2.amazonaws.com"
+ },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "api.tunneling.iot-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "api.tunneling.iot-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "api.tunneling.iot-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "api.tunneling.iot-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "iotsitewise" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "iotsitewise-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "iotsitewise-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "iotsitewise-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "iotsitewise-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "iotsitewise-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "iotsitewise-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "iotsitewise-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "iotsitewise-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "iotthingsgraph" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "iotthingsgraph"
+ }
+ },
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-southeast-2" : { },
+ "eu-west-1" : { },
+ "us-east-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "iottwinmaker" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "api-ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "hostname" : "api.iottwinmaker.ap-northeast-1.amazonaws.com"
+ },
+ "api-ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "hostname" : "api.iottwinmaker.ap-northeast-2.amazonaws.com"
+ },
+ "api-ap-south-1" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "hostname" : "api.iottwinmaker.ap-south-1.amazonaws.com"
+ },
+ "api-ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "hostname" : "api.iottwinmaker.ap-southeast-1.amazonaws.com"
+ },
+ "api-ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "hostname" : "api.iottwinmaker.ap-southeast-2.amazonaws.com"
+ },
+ "api-eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "hostname" : "api.iottwinmaker.eu-central-1.amazonaws.com"
+ },
+ "api-eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "hostname" : "api.iottwinmaker.eu-west-1.amazonaws.com"
+ },
+ "api-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "api.iottwinmaker.us-east-1.amazonaws.com"
+ },
+ "api-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "api.iottwinmaker.us-west-2.amazonaws.com"
+ },
+ "data-ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "hostname" : "data.iottwinmaker.ap-northeast-1.amazonaws.com"
+ },
+ "data-ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "hostname" : "data.iottwinmaker.ap-northeast-2.amazonaws.com"
+ },
+ "data-ap-south-1" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "hostname" : "data.iottwinmaker.ap-south-1.amazonaws.com"
+ },
+ "data-ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "hostname" : "data.iottwinmaker.ap-southeast-1.amazonaws.com"
+ },
+ "data-ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "hostname" : "data.iottwinmaker.ap-southeast-2.amazonaws.com"
+ },
+ "data-eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "hostname" : "data.iottwinmaker.eu-central-1.amazonaws.com"
+ },
+ "data-eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "hostname" : "data.iottwinmaker.eu-west-1.amazonaws.com"
+ },
+ "data-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "data.iottwinmaker.us-east-1.amazonaws.com"
+ },
+ "data-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "data.iottwinmaker.us-west-2.amazonaws.com"
+ },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "fips-api-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "api.iottwinmaker-fips.us-east-1.amazonaws.com"
+ },
+ "fips-api-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "api.iottwinmaker-fips.us-west-2.amazonaws.com"
+ },
+ "fips-data-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "data.iottwinmaker-fips.us-east-1.amazonaws.com"
+ },
+ "fips-data-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "data.iottwinmaker-fips.us-west-2.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "iottwinmaker-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "iottwinmaker-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "iottwinmaker-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "iottwinmaker-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "iotwireless" : {
+ "endpoints" : {
+ "ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "hostname" : "api.iotwireless.ap-northeast-1.amazonaws.com"
+ },
+ "ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "hostname" : "api.iotwireless.ap-southeast-2.amazonaws.com"
+ },
+ "eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "hostname" : "api.iotwireless.eu-west-1.amazonaws.com"
+ },
+ "us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "api.iotwireless.us-east-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "api.iotwireless.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "ivs" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "us-east-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "ivschat" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "us-east-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "ivsrealtime" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "us-east-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "kafka" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "kafka-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "kafka-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kafka-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kafka-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kafka-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "kafka-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kafka-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "kafka-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "kafka-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "kafka-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "kafka-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "kafka-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "kafkaconnect" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "kendra" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "kendra-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kendra-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kendra-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "kendra-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "kendra-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "kendra-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "kendra-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "kendra-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "kendra-ranking" : {
+ "defaults" : {
+ "dnsSuffix" : "api.aws",
+ "variants" : [ {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "af-south-1" : {
+ "hostname" : "kendra-ranking.af-south-1.api.aws"
+ },
+ "ap-east-1" : {
+ "hostname" : "kendra-ranking.ap-east-1.api.aws"
+ },
+ "ap-northeast-1" : {
+ "hostname" : "kendra-ranking.ap-northeast-1.api.aws"
+ },
+ "ap-northeast-2" : {
+ "hostname" : "kendra-ranking.ap-northeast-2.api.aws"
+ },
+ "ap-northeast-3" : {
+ "hostname" : "kendra-ranking.ap-northeast-3.api.aws"
+ },
+ "ap-south-1" : {
+ "hostname" : "kendra-ranking.ap-south-1.api.aws"
+ },
+ "ap-south-2" : {
+ "hostname" : "kendra-ranking.ap-south-2.api.aws"
+ },
+ "ap-southeast-1" : {
+ "hostname" : "kendra-ranking.ap-southeast-1.api.aws"
+ },
+ "ap-southeast-2" : {
+ "hostname" : "kendra-ranking.ap-southeast-2.api.aws"
+ },
+ "ap-southeast-3" : {
+ "hostname" : "kendra-ranking.ap-southeast-3.api.aws"
+ },
+ "ap-southeast-4" : {
+ "hostname" : "kendra-ranking.ap-southeast-4.api.aws"
+ },
+ "ap-southeast-5" : {
+ "hostname" : "kendra-ranking.ap-southeast-5.api.aws"
+ },
+ "ap-southeast-7" : {
+ "hostname" : "kendra-ranking.ap-southeast-7.api.aws"
+ },
+ "ca-central-1" : {
+ "hostname" : "kendra-ranking.ca-central-1.api.aws",
+ "variants" : [ {
+ "hostname" : "kendra-ranking-fips.ca-central-1.api.aws",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "hostname" : "kendra-ranking.ca-west-1.api.aws"
+ },
+ "eu-central-2" : {
+ "hostname" : "kendra-ranking.eu-central-2.api.aws"
+ },
+ "eu-north-1" : {
+ "hostname" : "kendra-ranking.eu-north-1.api.aws"
+ },
+ "eu-south-1" : {
+ "hostname" : "kendra-ranking.eu-south-1.api.aws"
+ },
+ "eu-south-2" : {
+ "hostname" : "kendra-ranking.eu-south-2.api.aws"
+ },
+ "eu-west-1" : {
+ "hostname" : "kendra-ranking.eu-west-1.api.aws"
+ },
+ "eu-west-3" : {
+ "hostname" : "kendra-ranking.eu-west-3.api.aws"
+ },
+ "il-central-1" : {
+ "hostname" : "kendra-ranking.il-central-1.api.aws"
+ },
+ "me-central-1" : {
+ "hostname" : "kendra-ranking.me-central-1.api.aws"
+ },
+ "me-south-1" : {
+ "hostname" : "kendra-ranking.me-south-1.api.aws"
+ },
+ "mx-central-1" : {
+ "hostname" : "kendra-ranking.mx-central-1.api.aws"
+ },
+ "sa-east-1" : {
+ "hostname" : "kendra-ranking.sa-east-1.api.aws"
+ },
+ "us-east-1" : {
+ "hostname" : "kendra-ranking.us-east-1.api.aws",
+ "variants" : [ {
+ "hostname" : "kendra-ranking-fips.us-east-1.api.aws",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "hostname" : "kendra-ranking.us-east-2.api.aws",
+ "variants" : [ {
+ "hostname" : "kendra-ranking-fips.us-east-2.api.aws",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "hostname" : "kendra-ranking.us-west-1.api.aws"
+ },
+ "us-west-2" : {
+ "hostname" : "kendra-ranking.us-west-2.api.aws",
+ "variants" : [ {
+ "hostname" : "kendra-ranking-fips.us-west-2.api.aws",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "kinesis" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kinesis-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "kinesis-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kinesis-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "kinesis-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "kinesis-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "kinesis-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "kinesis-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "kinesis-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "kinesisanalytics" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "kinesisanalytics-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "kinesisanalytics-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kinesisanalytics-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kinesisanalytics-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kinesisanalytics-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "kinesisanalytics-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kinesisanalytics-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "kinesisanalytics-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "kinesisanalytics-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "kinesisanalytics-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "kinesisanalytics-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "kinesisanalytics-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "kinesisvideo" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "kms" : {
+ "endpoints" : {
+ "ProdFips" : {
+ "credentialScope" : {
+ "region" : "eu-central-2"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.eu-central-2.amazonaws.com"
+ },
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.af-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "af-south-1-fips" : {
+ "credentialScope" : {
+ "region" : "af-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.af-south-1.amazonaws.com"
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.ap-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "ap-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.ap-east-1.amazonaws.com"
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.ap-northeast-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-northeast-1-fips" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.ap-northeast-1.amazonaws.com"
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.ap-northeast-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-northeast-2-fips" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.ap-northeast-2.amazonaws.com"
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.ap-northeast-3.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-northeast-3-fips" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-3"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.ap-northeast-3.amazonaws.com"
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.ap-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-south-1-fips" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.ap-south-1.amazonaws.com"
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.ap-south-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-south-2-fips" : {
+ "credentialScope" : {
+ "region" : "ap-south-2"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.ap-south-2.amazonaws.com"
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.ap-southeast-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-1-fips" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.ap-southeast-1.amazonaws.com"
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.ap-southeast-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-2-fips" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.ap-southeast-2.amazonaws.com"
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.ap-southeast-3.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-3-fips" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-3"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.ap-southeast-3.amazonaws.com"
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.ap-southeast-4.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-4-fips" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-4"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.ap-southeast-4.amazonaws.com"
+ },
+ "ap-southeast-5" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.ap-southeast-5.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-5-fips" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-5"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.ap-southeast-5.amazonaws.com"
+ },
+ "ap-southeast-7" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.ap-southeast-7.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-7-fips" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-7"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.ap-southeast-7.amazonaws.com"
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.ca-central-1.amazonaws.com"
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.ca-west-1.amazonaws.com"
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.eu-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.eu-central-1.amazonaws.com"
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.eu-central-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-2-fips" : {
+ "credentialScope" : {
+ "region" : "eu-central-2"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.eu-central-2.amazonaws.com"
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.eu-north-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-north-1-fips" : {
+ "credentialScope" : {
+ "region" : "eu-north-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.eu-north-1.amazonaws.com"
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.eu-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-south-1-fips" : {
+ "credentialScope" : {
+ "region" : "eu-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.eu-south-1.amazonaws.com"
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.eu-south-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-south-2-fips" : {
+ "credentialScope" : {
+ "region" : "eu-south-2"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.eu-south-2.amazonaws.com"
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.eu-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.eu-west-1.amazonaws.com"
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.eu-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.eu-west-2.amazonaws.com"
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.eu-west-3.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-west-3-fips" : {
+ "credentialScope" : {
+ "region" : "eu-west-3"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.eu-west-3.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.il-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "il-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "il-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.il-central-1.amazonaws.com"
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.me-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "me-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "me-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.me-central-1.amazonaws.com"
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.me-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "me-south-1-fips" : {
+ "credentialScope" : {
+ "region" : "me-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.me-south-1.amazonaws.com"
+ },
+ "mx-central-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.mx-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "mx-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "mx-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.mx-central-1.amazonaws.com"
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.sa-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "sa-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "sa-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.sa-east-1.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "lakeformation" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.ap-southeast-5.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.ca-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "lakeformation-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "lakeformation-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "lakeformation-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "lakeformation-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "lakeformation-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "lakeformation-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "lakeformation.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "lakeformation-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "lakeformation-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "lakeformation.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "lakeformation-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "lakeformation-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "lakeformation.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "lakeformation-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "lakeformation-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "lakeformation.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "lambda" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "lambda.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "lambda.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "lambda.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "lambda.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "lambda.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "lambda.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "lambda.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "lambda.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "lambda.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "lambda.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "lambda.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "variants" : [ {
+ "hostname" : "lambda.ap-southeast-5.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-7" : {
+ "variants" : [ {
+ "hostname" : "lambda.ap-southeast-7.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "lambda.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "lambda.ca-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "lambda.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "lambda.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "lambda.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "lambda.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "lambda.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "lambda.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "lambda.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "lambda.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "lambda-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "lambda-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "lambda-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "lambda-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "lambda.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "lambda.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "lambda.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "mx-central-1" : {
+ "variants" : [ {
+ "hostname" : "lambda.mx-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "lambda.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "lambda-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "lambda.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "lambda-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "lambda.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "lambda-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "lambda.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "lambda-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "lambda.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "license-manager" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "license-manager-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "license-manager-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "license-manager-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "license-manager-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "license-manager-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "license-manager-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "license-manager-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "license-manager-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "license-manager-linux-subscriptions" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "license-manager-linux-subscriptions-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "license-manager-linux-subscriptions-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "license-manager-linux-subscriptions-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "license-manager-linux-subscriptions-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "license-manager-linux-subscriptions-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "license-manager-linux-subscriptions-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "license-manager-linux-subscriptions-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "license-manager-linux-subscriptions-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "license-manager-user-subscriptions" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "license-manager-user-subscriptions-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "license-manager-user-subscriptions-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "license-manager-user-subscriptions-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "license-manager-user-subscriptions-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "license-manager-user-subscriptions-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "license-manager-user-subscriptions-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "license-manager-user-subscriptions-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "license-manager-user-subscriptions-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "lightsail" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "logs" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "logs.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "logs.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "logs.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "logs.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "logs.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "logs.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "logs.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "logs.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "logs.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "logs.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "logs.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "logs-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "logs.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "logs-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "logs.ca-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "logs.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "logs.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "logs.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "logs.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "logs.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "logs.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "logs.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "logs.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "logs-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "logs-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "logs-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "logs-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "logs-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "logs-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "logs.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "logs.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "logs.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "mx-central-1" : { },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "logs.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "logs-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "logs.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "logs-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "logs.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "logs-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "logs.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "logs-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "logs.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "lookoutequipment" : {
+ "endpoints" : {
+ "ap-northeast-2" : { },
+ "eu-west-1" : { },
+ "us-east-1" : { }
+ }
+ },
+ "lookoutmetrics" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "lookoutvision" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "m2" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "deprecated" : true
+ },
+ "fips-us-east-1" : {
+ "deprecated" : true
+ },
+ "fips-us-east-2" : {
+ "deprecated" : true
+ },
+ "fips-us-west-1" : {
+ "deprecated" : true
+ },
+ "fips-us-west-2" : {
+ "deprecated" : true
+ },
+ "il-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "machinelearning" : {
+ "endpoints" : {
+ "eu-west-1" : { },
+ "us-east-1" : { }
+ }
+ },
+ "macie2" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "macie2.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "macie2.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "macie2.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "macie2.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "macie2.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "macie2.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "macie2.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "macie2.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "macie2.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "macie2.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "macie2.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "macie2.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "macie2.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "macie2.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "macie2.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "macie2-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "macie2-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "macie2-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "macie2-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "macie2.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "macie2.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "macie2.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "macie2-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "macie2-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "macie2.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "macie2-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "macie2-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "macie2.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "macie2-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "macie2-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "macie2.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "macie2-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "macie2-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "macie2.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "managedblockchain" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-southeast-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : { }
+ }
+ },
+ "managedblockchain-query" : {
+ "endpoints" : {
+ "us-east-1" : { }
+ }
+ },
+ "marketplacecommerceanalytics" : {
+ "endpoints" : {
+ "us-east-1" : { }
+ }
+ },
+ "media-pipelines-chime" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "media-pipelines-chime-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "media-pipelines-chime-fips.us-east-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "media-pipelines-chime-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "media-pipelines-chime-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "mediaconnect" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "me-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "mediaconvert" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "mediaconvert-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "mediaconvert.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "mediaconvert-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "mediaconvert-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "mediaconvert-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "mediaconvert-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "mediaconvert-fips.us-west-2.amazonaws.com"
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "mediaconvert-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "mediaconvert.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "mediaconvert-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "mediaconvert.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "mediaconvert-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "mediaconvert.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "mediaconvert-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "mediaconvert.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "medialive" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "medialive-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "medialive-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "medialive-fips.us-west-2.amazonaws.com"
+ },
+ "me-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "medialive-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "medialive-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "medialive-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "mediapackage" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "mediapackage-vod" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "me-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "mediapackagev2" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "me-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "mediastore" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "meetings-chime" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "meetings-chime-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "meetings-chime-fips.ca-central-1.amazonaws.com"
+ },
+ "eu-central-1" : { },
+ "eu-west-2" : { },
+ "il-central-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "meetings-chime-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "meetings-chime-fips.us-east-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "meetings-chime-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "meetings-chime-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "memory-db" : {
+ "endpoints" : {
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "hostname" : "memory-db-fips.us-west-1.amazonaws.com"
+ },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "messaging-chime" : {
+ "endpoints" : {
+ "eu-central-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "messaging-chime-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "messaging-chime-fips.us-east-1.amazonaws.com"
+ }
+ }
+ },
+ "metering.marketplace" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "aws-marketplace"
+ }
+ },
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "metrics.sagemaker" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "metrics-fips.sagemaker.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "metrics-fips.sagemaker.ca-central-1.amazonaws.com"
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "metrics-fips.sagemaker.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "metrics-fips.sagemaker.ca-west-1.amazonaws.com"
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "metrics-fips.sagemaker.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "metrics-fips.sagemaker.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "metrics-fips.sagemaker.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "metrics-fips.sagemaker.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "metrics-fips.sagemaker.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "metrics-fips.sagemaker.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "metrics-fips.sagemaker.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "metrics-fips.sagemaker.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "mgh" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "mgn" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "mgn-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "mgn-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "mgn-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "mgn-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "mgn-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "mgn-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "mgn-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "mgn-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "migrationhub-orchestrator" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "migrationhub-strategy" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "mobileanalytics" : {
+ "endpoints" : {
+ "us-east-1" : { }
+ }
+ },
+ "models-v2-lex" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "models.lex" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "lex"
+ },
+ "variants" : [ {
+ "hostname" : "models-fips.lex.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "models-fips.lex.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "models-fips.lex.us-east-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "models-fips.lex.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "models-fips.lex.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "monitoring" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "monitoring-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "monitoring-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "monitoring-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "monitoring-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "monitoring-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "monitoring-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "monitoring-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "monitoring-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "mq" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "mq-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "mq-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "mq-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "mq-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "mq-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "mq-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "mq-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "mq-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "mturk-requester" : {
+ "endpoints" : {
+ "sandbox" : {
+ "hostname" : "mturk-requester-sandbox.us-east-1.amazonaws.com"
+ },
+ "us-east-1" : { }
+ },
+ "isRegionalized" : false
+ },
+ "neptune" : {
+ "endpoints" : {
+ "ap-east-1" : {
+ "credentialScope" : {
+ "region" : "ap-east-1"
+ },
+ "hostname" : "rds.ap-east-1.amazonaws.com"
+ },
+ "ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "hostname" : "rds.ap-northeast-1.amazonaws.com"
+ },
+ "ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "hostname" : "rds.ap-northeast-2.amazonaws.com"
+ },
+ "ap-south-1" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "hostname" : "rds.ap-south-1.amazonaws.com"
+ },
+ "ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "hostname" : "rds.ap-southeast-1.amazonaws.com"
+ },
+ "ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "hostname" : "rds.ap-southeast-2.amazonaws.com"
+ },
+ "ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "hostname" : "rds.ca-central-1.amazonaws.com"
+ },
+ "eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "hostname" : "rds.eu-central-1.amazonaws.com"
+ },
+ "eu-north-1" : {
+ "credentialScope" : {
+ "region" : "eu-north-1"
+ },
+ "hostname" : "rds.eu-north-1.amazonaws.com"
+ },
+ "eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "hostname" : "rds.eu-west-1.amazonaws.com"
+ },
+ "eu-west-2" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "hostname" : "rds.eu-west-2.amazonaws.com"
+ },
+ "eu-west-3" : {
+ "credentialScope" : {
+ "region" : "eu-west-3"
+ },
+ "hostname" : "rds.eu-west-3.amazonaws.com"
+ },
+ "me-south-1" : {
+ "credentialScope" : {
+ "region" : "me-south-1"
+ },
+ "hostname" : "rds.me-south-1.amazonaws.com"
+ },
+ "sa-east-1" : {
+ "credentialScope" : {
+ "region" : "sa-east-1"
+ },
+ "hostname" : "rds.sa-east-1.amazonaws.com"
+ },
+ "us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "rds.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "hostname" : "rds.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "hostname" : "rds.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "rds.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "network-firewall" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "network-firewall-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "network-firewall-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "network-firewall-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "network-firewall-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "network-firewall-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "network-firewall-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "network-firewall-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "network-firewall-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "network-firewall-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "network-firewall-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "networkmanager" : {
+ "endpoints" : {
+ "aws-global" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "networkmanager.us-west-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "networkmanager-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "fips-aws-global" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "networkmanager-fips.us-west-2.amazonaws.com"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-global"
+ },
+ "notifications" : {
+ "defaults" : {
+ "dnsSuffix" : "api.aws",
+ "variants" : [ {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "af-south-1" : {
+ "hostname" : "notifications.af-south-1.api.aws"
+ },
+ "ap-east-1" : {
+ "hostname" : "notifications.ap-east-1.api.aws"
+ },
+ "ap-northeast-1" : {
+ "hostname" : "notifications.ap-northeast-1.api.aws"
+ },
+ "ap-northeast-2" : {
+ "hostname" : "notifications.ap-northeast-2.api.aws"
+ },
+ "ap-northeast-3" : {
+ "hostname" : "notifications.ap-northeast-3.api.aws"
+ },
+ "ap-south-1" : {
+ "hostname" : "notifications.ap-south-1.api.aws"
+ },
+ "ap-south-2" : {
+ "hostname" : "notifications.ap-south-2.api.aws"
+ },
+ "ap-southeast-1" : {
+ "hostname" : "notifications.ap-southeast-1.api.aws"
+ },
+ "ap-southeast-2" : {
+ "hostname" : "notifications.ap-southeast-2.api.aws"
+ },
+ "ap-southeast-3" : {
+ "hostname" : "notifications.ap-southeast-3.api.aws"
+ },
+ "ap-southeast-4" : {
+ "hostname" : "notifications.ap-southeast-4.api.aws"
+ },
+ "ap-southeast-5" : {
+ "hostname" : "notifications.ap-southeast-5.api.aws"
+ },
+ "ap-southeast-7" : {
+ "hostname" : "notifications.ap-southeast-7.api.aws"
+ },
+ "ca-central-1" : {
+ "hostname" : "notifications.ca-central-1.api.aws"
+ },
+ "ca-west-1" : {
+ "hostname" : "notifications.ca-west-1.api.aws"
+ },
+ "eu-central-1" : {
+ "hostname" : "notifications.eu-central-1.api.aws"
+ },
+ "eu-central-2" : {
+ "hostname" : "notifications.eu-central-2.api.aws"
+ },
+ "eu-north-1" : {
+ "hostname" : "notifications.eu-north-1.api.aws"
+ },
+ "eu-south-1" : {
+ "hostname" : "notifications.eu-south-1.api.aws"
+ },
+ "eu-south-2" : {
+ "hostname" : "notifications.eu-south-2.api.aws"
+ },
+ "eu-west-1" : {
+ "hostname" : "notifications.eu-west-1.api.aws"
+ },
+ "eu-west-2" : {
+ "hostname" : "notifications.eu-west-2.api.aws"
+ },
+ "eu-west-3" : {
+ "hostname" : "notifications.eu-west-3.api.aws"
+ },
+ "il-central-1" : {
+ "hostname" : "notifications.il-central-1.api.aws"
+ },
+ "me-central-1" : {
+ "hostname" : "notifications.me-central-1.api.aws"
+ },
+ "me-south-1" : {
+ "hostname" : "notifications.me-south-1.api.aws"
+ },
+ "mx-central-1" : {
+ "hostname" : "notifications.mx-central-1.api.aws"
+ },
+ "sa-east-1" : {
+ "hostname" : "notifications.sa-east-1.api.aws"
+ },
+ "us-east-1" : {
+ "hostname" : "notifications.us-east-1.api.aws"
+ },
+ "us-east-2" : {
+ "hostname" : "notifications.us-east-2.api.aws"
+ },
+ "us-west-1" : {
+ "hostname" : "notifications.us-west-1.api.aws"
+ },
+ "us-west-2" : {
+ "hostname" : "notifications.us-west-2.api.aws"
+ }
+ }
+ },
+ "notifications-contacts" : {
+ "endpoints" : {
+ "aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "notifications-contacts.us-east-1.api.aws"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-global"
+ },
+ "oam" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "oidc" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "credentialScope" : {
+ "region" : "af-south-1"
+ },
+ "hostname" : "oidc.af-south-1.amazonaws.com"
+ },
+ "ap-east-1" : {
+ "credentialScope" : {
+ "region" : "ap-east-1"
+ },
+ "hostname" : "oidc.ap-east-1.amazonaws.com"
+ },
+ "ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "hostname" : "oidc.ap-northeast-1.amazonaws.com"
+ },
+ "ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "hostname" : "oidc.ap-northeast-2.amazonaws.com"
+ },
+ "ap-northeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-3"
+ },
+ "hostname" : "oidc.ap-northeast-3.amazonaws.com"
+ },
+ "ap-south-1" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "hostname" : "oidc.ap-south-1.amazonaws.com"
+ },
+ "ap-south-2" : {
+ "credentialScope" : {
+ "region" : "ap-south-2"
+ },
+ "hostname" : "oidc.ap-south-2.amazonaws.com"
+ },
+ "ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "hostname" : "oidc.ap-southeast-1.amazonaws.com"
+ },
+ "ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "hostname" : "oidc.ap-southeast-2.amazonaws.com"
+ },
+ "ap-southeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-3"
+ },
+ "hostname" : "oidc.ap-southeast-3.amazonaws.com"
+ },
+ "ap-southeast-4" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-4"
+ },
+ "hostname" : "oidc.ap-southeast-4.amazonaws.com"
+ },
+ "ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "hostname" : "oidc.ca-central-1.amazonaws.com"
+ },
+ "ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "hostname" : "oidc.ca-west-1.amazonaws.com"
+ },
+ "eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "hostname" : "oidc.eu-central-1.amazonaws.com"
+ },
+ "eu-central-2" : {
+ "credentialScope" : {
+ "region" : "eu-central-2"
+ },
+ "hostname" : "oidc.eu-central-2.amazonaws.com"
+ },
+ "eu-north-1" : {
+ "credentialScope" : {
+ "region" : "eu-north-1"
+ },
+ "hostname" : "oidc.eu-north-1.amazonaws.com"
+ },
+ "eu-south-1" : {
+ "credentialScope" : {
+ "region" : "eu-south-1"
+ },
+ "hostname" : "oidc.eu-south-1.amazonaws.com"
+ },
+ "eu-south-2" : {
+ "credentialScope" : {
+ "region" : "eu-south-2"
+ },
+ "hostname" : "oidc.eu-south-2.amazonaws.com"
+ },
+ "eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "hostname" : "oidc.eu-west-1.amazonaws.com"
+ },
+ "eu-west-2" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "hostname" : "oidc.eu-west-2.amazonaws.com"
+ },
+ "eu-west-3" : {
+ "credentialScope" : {
+ "region" : "eu-west-3"
+ },
+ "hostname" : "oidc.eu-west-3.amazonaws.com"
+ },
+ "il-central-1" : {
+ "credentialScope" : {
+ "region" : "il-central-1"
+ },
+ "hostname" : "oidc.il-central-1.amazonaws.com"
+ },
+ "me-central-1" : {
+ "credentialScope" : {
+ "region" : "me-central-1"
+ },
+ "hostname" : "oidc.me-central-1.amazonaws.com"
+ },
+ "me-south-1" : {
+ "credentialScope" : {
+ "region" : "me-south-1"
+ },
+ "hostname" : "oidc.me-south-1.amazonaws.com"
+ },
+ "sa-east-1" : {
+ "credentialScope" : {
+ "region" : "sa-east-1"
+ },
+ "hostname" : "oidc.sa-east-1.amazonaws.com"
+ },
+ "us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "oidc.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "hostname" : "oidc.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "hostname" : "oidc.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "oidc.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "omics" : {
+ "endpoints" : {
+ "ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "hostname" : "omics.ap-southeast-1.amazonaws.com"
+ },
+ "eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "hostname" : "omics.eu-central-1.amazonaws.com"
+ },
+ "eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "hostname" : "omics.eu-west-1.amazonaws.com"
+ },
+ "eu-west-2" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "hostname" : "omics.eu-west-2.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "omics-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "omics-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "credentialScope" : {
+ "region" : "il-central-1"
+ },
+ "hostname" : "omics.il-central-1.amazonaws.com"
+ },
+ "us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "omics.us-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "omics-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "omics.us-west-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "omics-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "opsworks" : {
+ "endpoints" : {
+ "ap-southeast-1" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "us-east-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "opsworks-cm" : {
+ "endpoints" : {
+ "ap-southeast-2" : { },
+ "eu-west-1" : { },
+ "us-east-1" : { }
+ }
+ },
+ "organizations" : {
+ "endpoints" : {
+ "aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "organizations.us-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "organizations-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "fips-aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "organizations-fips.us-east-1.amazonaws.com"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-global"
+ },
+ "osis" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "outposts" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "outposts-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "outposts-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "outposts-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "outposts-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "outposts-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "outposts-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "outposts-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "outposts-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "outposts-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "outposts-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "participant.connect" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-west-2" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "participant.connect-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "participant.connect-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "participant.connect-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "participant.connect-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "personalize" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "pi" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.ap-southeast-5.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-7" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.ap-southeast-7.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "pi-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "pi.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "pi-fips.ca-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "pi.ca-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "pi-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "pi-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "pi-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "pi-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "pi-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "pi-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "mx-central-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.mx-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "pi-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "pi.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "pi-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "pi.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "pi-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "pi.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "pi-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "pi.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "pinpoint" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "mobiletargeting"
+ }
+ },
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "hostname" : "pinpoint.ca-central-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "pinpoint-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "pinpoint-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "pinpoint-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "pinpoint-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "pinpoint-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "pinpoint.us-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "pinpoint-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "hostname" : "pinpoint.us-east-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "pinpoint-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "pinpoint.us-west-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "pinpoint-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "pipes" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "polly" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "polly.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "polly.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "polly.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "polly.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "polly.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "polly.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "polly.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "polly.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "polly-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "polly-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "polly.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "polly.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "polly.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "polly.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "polly.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "polly.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "polly.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "polly-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "polly-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "polly-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "polly-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "polly-fips.us-west-2.amazonaws.com"
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "polly.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "polly.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "polly-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "polly-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "polly.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "polly-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "polly-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "polly.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "polly-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "polly-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "polly.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "polly-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "polly-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "polly.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "portal.sso" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "credentialScope" : {
+ "region" : "af-south-1"
+ },
+ "hostname" : "portal.sso.af-south-1.amazonaws.com"
+ },
+ "ap-east-1" : {
+ "credentialScope" : {
+ "region" : "ap-east-1"
+ },
+ "hostname" : "portal.sso.ap-east-1.amazonaws.com"
+ },
+ "ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "hostname" : "portal.sso.ap-northeast-1.amazonaws.com"
+ },
+ "ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "hostname" : "portal.sso.ap-northeast-2.amazonaws.com"
+ },
+ "ap-northeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-3"
+ },
+ "hostname" : "portal.sso.ap-northeast-3.amazonaws.com"
+ },
+ "ap-south-1" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "hostname" : "portal.sso.ap-south-1.amazonaws.com"
+ },
+ "ap-south-2" : {
+ "credentialScope" : {
+ "region" : "ap-south-2"
+ },
+ "hostname" : "portal.sso.ap-south-2.amazonaws.com"
+ },
+ "ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "hostname" : "portal.sso.ap-southeast-1.amazonaws.com"
+ },
+ "ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "hostname" : "portal.sso.ap-southeast-2.amazonaws.com"
+ },
+ "ap-southeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-3"
+ },
+ "hostname" : "portal.sso.ap-southeast-3.amazonaws.com"
+ },
+ "ap-southeast-4" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-4"
+ },
+ "hostname" : "portal.sso.ap-southeast-4.amazonaws.com"
+ },
+ "ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "hostname" : "portal.sso.ca-central-1.amazonaws.com"
+ },
+ "ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "hostname" : "portal.sso.ca-west-1.amazonaws.com"
+ },
+ "eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "hostname" : "portal.sso.eu-central-1.amazonaws.com"
+ },
+ "eu-central-2" : {
+ "credentialScope" : {
+ "region" : "eu-central-2"
+ },
+ "hostname" : "portal.sso.eu-central-2.amazonaws.com"
+ },
+ "eu-north-1" : {
+ "credentialScope" : {
+ "region" : "eu-north-1"
+ },
+ "hostname" : "portal.sso.eu-north-1.amazonaws.com"
+ },
+ "eu-south-1" : {
+ "credentialScope" : {
+ "region" : "eu-south-1"
+ },
+ "hostname" : "portal.sso.eu-south-1.amazonaws.com"
+ },
+ "eu-south-2" : {
+ "credentialScope" : {
+ "region" : "eu-south-2"
+ },
+ "hostname" : "portal.sso.eu-south-2.amazonaws.com"
+ },
+ "eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "hostname" : "portal.sso.eu-west-1.amazonaws.com"
+ },
+ "eu-west-2" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "hostname" : "portal.sso.eu-west-2.amazonaws.com"
+ },
+ "eu-west-3" : {
+ "credentialScope" : {
+ "region" : "eu-west-3"
+ },
+ "hostname" : "portal.sso.eu-west-3.amazonaws.com"
+ },
+ "il-central-1" : {
+ "credentialScope" : {
+ "region" : "il-central-1"
+ },
+ "hostname" : "portal.sso.il-central-1.amazonaws.com"
+ },
+ "me-central-1" : {
+ "credentialScope" : {
+ "region" : "me-central-1"
+ },
+ "hostname" : "portal.sso.me-central-1.amazonaws.com"
+ },
+ "me-south-1" : {
+ "credentialScope" : {
+ "region" : "me-south-1"
+ },
+ "hostname" : "portal.sso.me-south-1.amazonaws.com"
+ },
+ "sa-east-1" : {
+ "credentialScope" : {
+ "region" : "sa-east-1"
+ },
+ "hostname" : "portal.sso.sa-east-1.amazonaws.com"
+ },
+ "us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "portal.sso.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "hostname" : "portal.sso.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "hostname" : "portal.sso.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "portal.sso.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "private-networks" : {
+ "endpoints" : {
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "profile" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "profile-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-west-2" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "profile-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "profile-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "profile-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "profile-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "profile-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "proton" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "qbusiness" : {
+ "defaults" : {
+ "dnsSuffix" : "api.aws",
+ "variants" : [ {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "af-south-1" : {
+ "hostname" : "qbusiness.af-south-1.api.aws"
+ },
+ "ap-east-1" : {
+ "hostname" : "qbusiness.ap-east-1.api.aws"
+ },
+ "ap-northeast-1" : {
+ "hostname" : "qbusiness.ap-northeast-1.api.aws"
+ },
+ "ap-northeast-2" : {
+ "hostname" : "qbusiness.ap-northeast-2.api.aws"
+ },
+ "ap-northeast-3" : {
+ "hostname" : "qbusiness.ap-northeast-3.api.aws"
+ },
+ "ap-south-1" : {
+ "hostname" : "qbusiness.ap-south-1.api.aws"
+ },
+ "ap-south-2" : {
+ "hostname" : "qbusiness.ap-south-2.api.aws"
+ },
+ "ap-southeast-1" : {
+ "hostname" : "qbusiness.ap-southeast-1.api.aws"
+ },
+ "ap-southeast-2" : {
+ "hostname" : "qbusiness.ap-southeast-2.api.aws"
+ },
+ "ap-southeast-3" : {
+ "hostname" : "qbusiness.ap-southeast-3.api.aws"
+ },
+ "ap-southeast-4" : {
+ "hostname" : "qbusiness.ap-southeast-4.api.aws"
+ },
+ "ap-southeast-5" : {
+ "hostname" : "qbusiness.ap-southeast-5.api.aws"
+ },
+ "ap-southeast-7" : {
+ "hostname" : "qbusiness.ap-southeast-7.api.aws"
+ },
+ "ca-central-1" : {
+ "hostname" : "qbusiness.ca-central-1.api.aws"
+ },
+ "ca-west-1" : {
+ "hostname" : "qbusiness.ca-west-1.api.aws"
+ },
+ "eu-central-1" : {
+ "hostname" : "qbusiness.eu-central-1.api.aws"
+ },
+ "eu-central-2" : {
+ "hostname" : "qbusiness.eu-central-2.api.aws"
+ },
+ "eu-north-1" : {
+ "hostname" : "qbusiness.eu-north-1.api.aws"
+ },
+ "eu-south-1" : {
+ "hostname" : "qbusiness.eu-south-1.api.aws"
+ },
+ "eu-south-2" : {
+ "hostname" : "qbusiness.eu-south-2.api.aws"
+ },
+ "eu-west-1" : {
+ "hostname" : "qbusiness.eu-west-1.api.aws"
+ },
+ "eu-west-2" : {
+ "hostname" : "qbusiness.eu-west-2.api.aws"
+ },
+ "eu-west-3" : {
+ "hostname" : "qbusiness.eu-west-3.api.aws"
+ },
+ "il-central-1" : {
+ "hostname" : "qbusiness.il-central-1.api.aws"
+ },
+ "me-central-1" : {
+ "hostname" : "qbusiness.me-central-1.api.aws"
+ },
+ "me-south-1" : {
+ "hostname" : "qbusiness.me-south-1.api.aws"
+ },
+ "mx-central-1" : {
+ "hostname" : "qbusiness.mx-central-1.api.aws"
+ },
+ "sa-east-1" : {
+ "hostname" : "qbusiness.sa-east-1.api.aws"
+ },
+ "us-east-1" : {
+ "hostname" : "qbusiness.us-east-1.api.aws"
+ },
+ "us-east-2" : {
+ "hostname" : "qbusiness.us-east-2.api.aws"
+ },
+ "us-west-1" : {
+ "hostname" : "qbusiness.us-west-1.api.aws"
+ },
+ "us-west-2" : {
+ "hostname" : "qbusiness.us-west-2.api.aws"
+ }
+ }
+ },
+ "qldb" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "qldb-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "qldb-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "qldb-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "qldb-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "qldb-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "qldb-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "qldb-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "qldb-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "quicksight" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "ram" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-7" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "ram-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ram-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "ram-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ram-fips.ca-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ram-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ram-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ram-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ram-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ram-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ram-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "mx-central-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "ram-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ram-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "ram-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ram-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "ram-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ram-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "ram-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ram-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ }
+ }
+ },
+ "rbin" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "rbin.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "rbin.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "rbin.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "rbin.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "rbin.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "rbin.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "rbin.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "rbin.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "rbin.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "rbin.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "rbin.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "variants" : [ {
+ "hostname" : "rbin.ap-southeast-5.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "rbin-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "rbin-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "rbin.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "rbin-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "rbin-fips.ca-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "rbin.ca-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "rbin.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "rbin.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "rbin.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "rbin.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "rbin.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "rbin.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "rbin.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "rbin.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rbin-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rbin-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rbin-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "rbin-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rbin-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "rbin-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "rbin.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "rbin.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "rbin.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "mx-central-1" : { },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "rbin.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "rbin-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "rbin-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "rbin.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "rbin-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "rbin-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "rbin.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "rbin-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "rbin-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "rbin.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "rbin-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "rbin-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "rbin.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "rds" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "rds-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rds-fips.ca-central-1.amazonaws.com"
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "rds-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rds-fips.ca-west-1.amazonaws.com"
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "rds-fips.ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rds-fips.ca-central-1.amazonaws.com"
+ },
+ "rds-fips.ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rds-fips.ca-west-1.amazonaws.com"
+ },
+ "rds-fips.us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rds-fips.us-east-1.amazonaws.com"
+ },
+ "rds-fips.us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "rds-fips.us-east-2.amazonaws.com"
+ },
+ "rds-fips.us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rds-fips.us-west-1.amazonaws.com"
+ },
+ "rds-fips.us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "rds-fips.us-west-2.amazonaws.com"
+ },
+ "rds.ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "rds-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "rds.ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "rds-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "rds.us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "rds-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "rds.us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "rds-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "rds.us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "rds-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "rds.us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "rds-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "sslCommonName" : "{service}.{dnsSuffix}",
+ "variants" : [ {
+ "hostname" : "rds-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rds-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "rds-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "rds-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "rds-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rds-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "rds-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "rds-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "rds-data" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rds-data-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "rds-data-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rds-data-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "rds-data-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "rds-data-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "rds-data-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "rds-data-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "rds-data-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "redshift" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "redshift-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "redshift-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "redshift-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "redshift-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "redshift-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "redshift-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "redshift-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "redshift-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "redshift-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "redshift-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "redshift-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "redshift-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "redshift-serverless" : {
+ "endpoints" : {
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "redshift-serverless-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "redshift-serverless-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "redshift-serverless-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "redshift-serverless-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "redshift-serverless-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "redshift-serverless-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "redshift-serverless-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "redshift-serverless-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "redshift-serverless-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "redshift-serverless-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "rekognition" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "rekognition-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rekognition-fips.ca-central-1.amazonaws.com"
+ },
+ "eu-central-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "il-central-1" : { },
+ "rekognition-fips.ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rekognition-fips.ca-central-1.amazonaws.com"
+ },
+ "rekognition-fips.us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rekognition-fips.us-east-1.amazonaws.com"
+ },
+ "rekognition-fips.us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "rekognition-fips.us-east-2.amazonaws.com"
+ },
+ "rekognition-fips.us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rekognition-fips.us-west-1.amazonaws.com"
+ },
+ "rekognition-fips.us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "rekognition-fips.us-west-2.amazonaws.com"
+ },
+ "rekognition.ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "rekognition-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "rekognition.us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "rekognition-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "rekognition.us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "rekognition-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "rekognition.us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "rekognition-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "rekognition.us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "rekognition-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "rekognition-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rekognition-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "rekognition-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "rekognition-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "rekognition-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rekognition-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "rekognition-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "rekognition-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "resiliencehub" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "resource-explorer-2" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "resource-explorer-2-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "resource-explorer-2-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "resource-explorer-2-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "resource-explorer-2-fips.ca-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "resource-explorer-2-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "resource-explorer-2-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "resource-explorer-2-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "resource-explorer-2-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "resource-explorer-2-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "resource-explorer-2-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "resource-explorer-2-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "resource-explorer-2-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "resource-explorer-2-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "resource-explorer-2-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "resource-explorer-2-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "resource-explorer-2-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "resource-explorer-2-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "resource-explorer-2-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ }
+ }
+ },
+ "resource-groups" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "resource-groups-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "resource-groups-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "resource-groups-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "resource-groups-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "resource-groups-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "resource-groups-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "resource-groups-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "resource-groups-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "robomaker" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-southeast-1" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "rolesanywhere" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rolesanywhere-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "rolesanywhere-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rolesanywhere-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "rolesanywhere-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "rolesanywhere-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "rolesanywhere-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "rolesanywhere-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "rolesanywhere-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "route53" : {
+ "endpoints" : {
+ "aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "route53.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "route53-fips.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "fips-aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "route53-fips.amazonaws.com"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-global"
+ },
+ "route53-recovery-control-config" : {
+ "endpoints" : {
+ "aws-global" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "route53-recovery-control-config.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "route53domains" : {
+ "endpoints" : {
+ "us-east-1" : { }
+ }
+ },
+ "route53profiles" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "route53profiles-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "route53profiles.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "route53profiles-fips.ca-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "route53profiles.ca-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "route53profiles.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "route53profiles-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "route53profiles.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "route53profiles-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "route53profiles.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "route53profiles-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "route53profiles.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "route53profiles-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "route53profiles.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "route53resolver" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "route53resolver-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "route53resolver-fips.ca-central-1.amazonaws.com"
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "route53resolver-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "route53resolver-fips.ca-west-1.amazonaws.com"
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "route53resolver-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "route53resolver-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "route53resolver-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "route53resolver-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "route53resolver-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "route53resolver-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "route53resolver-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "route53resolver-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "rum" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "runtime-v2-lex" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "runtime.lex" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "lex"
+ },
+ "variants" : [ {
+ "hostname" : "runtime-fips.lex.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "runtime-fips.lex.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "runtime-fips.lex.us-east-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "runtime-fips.lex.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "runtime-fips.lex.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "runtime.sagemaker" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "runtime-fips.sagemaker.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "runtime-fips.sagemaker.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "runtime-fips.sagemaker.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "runtime-fips.sagemaker.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "runtime-fips.sagemaker.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "runtime-fips.sagemaker.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "runtime-fips.sagemaker.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "runtime-fips.sagemaker.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "runtime-fips.sagemaker.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "s3" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ],
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "dnsSuffix" : "amazonaws.com",
+ "hostname" : "{service}-fips.dualstack.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "dnsSuffix" : "amazonaws.com",
+ "hostname" : "{service}.dualstack.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.af-south-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.ap-east-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "hostname" : "s3.ap-northeast-1.amazonaws.com",
+ "signatureVersions" : [ "s3", "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3.dualstack.ap-northeast-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.ap-northeast-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.ap-northeast-3.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.ap-south-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.ap-south-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "hostname" : "s3.ap-southeast-1.amazonaws.com",
+ "signatureVersions" : [ "s3", "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3.dualstack.ap-southeast-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "hostname" : "s3.ap-southeast-2.amazonaws.com",
+ "signatureVersions" : [ "s3", "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3.dualstack.ap-southeast-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.ap-southeast-3.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.ap-southeast-4.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.ap-southeast-5.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-7" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.ap-southeast-7.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "s3.amazonaws.com",
+ "signatureVersions" : [ "s3", "s3v4" ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "s3-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "s3-fips.dualstack.ca-central-1.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "s3.dualstack.ca-central-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "s3-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "s3-fips.dualstack.ca-west-1.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "s3.dualstack.ca-west-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.eu-central-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.eu-central-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.eu-north-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.eu-south-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.eu-south-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "hostname" : "s3.eu-west-1.amazonaws.com",
+ "signatureVersions" : [ "s3", "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3.dualstack.eu-west-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.eu-west-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.eu-west-3.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.il-central-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.me-central-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.me-south-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "mx-central-1" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.mx-central-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "s3-external-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "s3-external-1.amazonaws.com",
+ "signatureVersions" : [ "s3", "s3v4" ]
+ },
+ "sa-east-1" : {
+ "hostname" : "s3.sa-east-1.amazonaws.com",
+ "signatureVersions" : [ "s3", "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3.dualstack.sa-east-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "hostname" : "s3.us-east-1.amazonaws.com",
+ "signatureVersions" : [ "s3", "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-fips.dualstack.us-east-1.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "s3-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "s3.dualstack.us-east-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "s3-fips.dualstack.us-east-2.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "s3-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "s3.dualstack.us-east-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "hostname" : "s3.us-west-1.amazonaws.com",
+ "signatureVersions" : [ "s3", "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-fips.dualstack.us-west-1.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "s3-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "s3.dualstack.us-west-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "hostname" : "s3.us-west-2.amazonaws.com",
+ "signatureVersions" : [ "s3", "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-fips.dualstack.us-west-2.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "s3-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "s3.dualstack.us-west-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ },
+ "isRegionalized" : true,
+ "partitionEndpoint" : "aws-global"
+ },
+ "s3-control" : {
+ "defaults" : {
+ "protocols" : [ "https" ],
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "dnsSuffix" : "amazonaws.com",
+ "hostname" : "{service}-fips.dualstack.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "dnsSuffix" : "amazonaws.com",
+ "hostname" : "{service}.dualstack.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "endpoints" : {
+ "af-south-1" : {
+ "credentialScope" : {
+ "region" : "af-south-1"
+ },
+ "hostname" : "s3-control.af-south-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.af-south-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "credentialScope" : {
+ "region" : "ap-east-1"
+ },
+ "hostname" : "s3-control.ap-east-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.ap-east-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "hostname" : "s3-control.ap-northeast-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.ap-northeast-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "hostname" : "s3-control.ap-northeast-2.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.ap-northeast-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-3"
+ },
+ "hostname" : "s3-control.ap-northeast-3.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.ap-northeast-3.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "hostname" : "s3-control.ap-south-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.ap-south-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "credentialScope" : {
+ "region" : "ap-south-2"
+ },
+ "hostname" : "s3-control.ap-south-2.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.ap-south-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "hostname" : "s3-control.ap-southeast-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.ap-southeast-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "hostname" : "s3-control.ap-southeast-2.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.ap-southeast-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-3"
+ },
+ "hostname" : "s3-control.ap-southeast-3.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.ap-southeast-3.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-4"
+ },
+ "hostname" : "s3-control.ap-southeast-4.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.ap-southeast-4.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "hostname" : "s3-control.ca-central-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "s3-control-fips.dualstack.ca-central-1.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "s3-control.dualstack.ca-central-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-control-fips.ca-central-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ]
+ },
+ "ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "hostname" : "s3-control.ca-west-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "s3-control-fips.dualstack.ca-west-1.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "s3-control.dualstack.ca-west-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-control-fips.ca-west-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ]
+ },
+ "eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "hostname" : "s3-control.eu-central-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.eu-central-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "credentialScope" : {
+ "region" : "eu-central-2"
+ },
+ "hostname" : "s3-control.eu-central-2.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.eu-central-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "credentialScope" : {
+ "region" : "eu-north-1"
+ },
+ "hostname" : "s3-control.eu-north-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.eu-north-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "credentialScope" : {
+ "region" : "eu-south-1"
+ },
+ "hostname" : "s3-control.eu-south-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.eu-south-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "credentialScope" : {
+ "region" : "eu-south-2"
+ },
+ "hostname" : "s3-control.eu-south-2.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.eu-south-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "hostname" : "s3-control.eu-west-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.eu-west-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "hostname" : "s3-control.eu-west-2.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.eu-west-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "credentialScope" : {
+ "region" : "eu-west-3"
+ },
+ "hostname" : "s3-control.eu-west-3.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.eu-west-3.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "il-central-1" : {
+ "credentialScope" : {
+ "region" : "il-central-1"
+ },
+ "hostname" : "s3-control.il-central-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.il-central-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "credentialScope" : {
+ "region" : "me-central-1"
+ },
+ "hostname" : "s3-control.me-central-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.me-central-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "credentialScope" : {
+ "region" : "me-south-1"
+ },
+ "hostname" : "s3-control.me-south-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.me-south-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "credentialScope" : {
+ "region" : "sa-east-1"
+ },
+ "hostname" : "s3-control.sa-east-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.sa-east-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "s3-control.us-east-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control-fips.dualstack.us-east-1.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "s3-control-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "s3-control.dualstack.us-east-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-control-fips.us-east-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ]
+ },
+ "us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "hostname" : "s3-control.us-east-2.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control-fips.dualstack.us-east-2.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "s3-control-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "s3-control.dualstack.us-east-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-control-fips.us-east-2.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ]
+ },
+ "us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "hostname" : "s3-control.us-west-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control-fips.dualstack.us-west-1.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "s3-control-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "s3-control.dualstack.us-west-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-control-fips.us-west-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ]
+ },
+ "us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "s3-control.us-west-2.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control-fips.dualstack.us-west-2.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "s3-control-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "s3-control.dualstack.us-west-2.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-control-fips.us-west-2.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ]
+ }
+ }
+ },
+ "s3-outposts" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-ca-central-1" : {
+ "deprecated" : true
+ },
+ "fips-us-east-1" : {
+ "deprecated" : true
+ },
+ "fips-us-east-2" : {
+ "deprecated" : true
+ },
+ "fips-us-west-1" : {
+ "deprecated" : true
+ },
+ "fips-us-west-2" : {
+ "deprecated" : true
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "sagemaker-geospatial" : {
+ "endpoints" : {
+ "us-west-2" : { }
+ }
+ },
+ "savingsplans" : {
+ "endpoints" : {
+ "aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "savingsplans.amazonaws.com"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-global"
+ },
+ "scheduler" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "schemas" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "sdb" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ],
+ "signatureVersions" : [ "v2" ]
+ },
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-west-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "hostname" : "sdb.amazonaws.com"
+ },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "secretsmanager" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-7" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-central-1-fips" : {
+ "deprecated" : true
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1-fips" : {
+ "deprecated" : true
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "mx-central-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "deprecated" : true
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "deprecated" : true
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "deprecated" : true
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "deprecated" : true
+ }
+ }
+ },
+ "securityhub" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "securityhub.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "securityhub.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "securityhub.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "securityhub.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "securityhub.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "securityhub.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "securityhub.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "securityhub.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "securityhub.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "securityhub.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "securityhub.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "variants" : [ {
+ "hostname" : "securityhub.ap-southeast-5.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-7" : {
+ "variants" : [ {
+ "hostname" : "securityhub.ap-southeast-7.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "securityhub.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "securityhub.ca-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "securityhub.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "securityhub.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "securityhub.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "securityhub.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "securityhub.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "securityhub.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "securityhub.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "securityhub.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "securityhub-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "securityhub-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "securityhub-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "securityhub-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "securityhub.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "securityhub.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "securityhub.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "mx-central-1" : {
+ "variants" : [ {
+ "hostname" : "securityhub.mx-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "securityhub.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "securityhub-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "securityhub.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "securityhub-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "securityhub.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "securityhub-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "securityhub.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "securityhub-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "securityhub.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "securitylake" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "securitylake-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "securitylake-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "securitylake-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "securitylake-fips.us-west-2.amazonaws.com"
+ },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "securitylake-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "securitylake-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "securitylake-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "securitylake-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "serverlessrepo" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "ap-east-1" : {
+ "protocols" : [ "https" ]
+ },
+ "ap-northeast-1" : {
+ "protocols" : [ "https" ]
+ },
+ "ap-northeast-2" : {
+ "protocols" : [ "https" ]
+ },
+ "ap-south-1" : {
+ "protocols" : [ "https" ]
+ },
+ "ap-southeast-1" : {
+ "protocols" : [ "https" ]
+ },
+ "ap-southeast-2" : {
+ "protocols" : [ "https" ]
+ },
+ "ca-central-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "serverlessrepo-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "serverlessrepo-fips.ca-central-1.amazonaws.com"
+ },
+ "eu-central-1" : {
+ "protocols" : [ "https" ]
+ },
+ "eu-north-1" : {
+ "protocols" : [ "https" ]
+ },
+ "eu-west-1" : {
+ "protocols" : [ "https" ]
+ },
+ "eu-west-2" : {
+ "protocols" : [ "https" ]
+ },
+ "eu-west-3" : {
+ "protocols" : [ "https" ]
+ },
+ "me-south-1" : {
+ "protocols" : [ "https" ]
+ },
+ "sa-east-1" : {
+ "protocols" : [ "https" ]
+ },
+ "us-east-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "serverlessrepo-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "serverlessrepo-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "serverlessrepo-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "serverlessrepo-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "serverlessrepo-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "serverlessrepo-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "serverlessrepo-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "serverlessrepo-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "servicecatalog" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "servicecatalog-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "servicecatalog-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "servicecatalog-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "servicecatalog-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "servicecatalog-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "servicecatalog-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "servicecatalog-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "servicecatalog-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "servicecatalog-appregistry" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "servicecatalog-appregistry-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "servicecatalog-appregistry-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "servicecatalog-appregistry-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "servicecatalog-appregistry-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "servicecatalog-appregistry-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "servicecatalog-appregistry-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "servicecatalog-appregistry-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "servicecatalog-appregistry-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "servicecatalog-appregistry-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "servicecatalog-appregistry-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "servicediscovery" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.ap-southeast-5.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-7" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.ap-southeast-7.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "servicediscovery-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "servicediscovery.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "servicediscovery-fips.ca-central-1.amazonaws.com"
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "servicediscovery-fips.ca-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "servicediscovery.ca-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "servicediscovery-fips.ca-west-1.amazonaws.com"
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "mx-central-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.mx-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "servicediscovery-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "servicediscovery.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "servicediscovery-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "servicediscovery-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "servicediscovery.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "servicediscovery-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "servicediscovery-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "servicediscovery.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "servicediscovery-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "servicediscovery-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "servicediscovery.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "servicediscovery-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "servicequotas" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "session.qldb" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "session.qldb-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "session.qldb-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "session.qldb-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "session.qldb-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "session.qldb-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "session.qldb-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "shield" : {
+ "defaults" : {
+ "protocols" : [ "https" ],
+ "sslCommonName" : "shield.us-east-1.amazonaws.com"
+ },
+ "endpoints" : {
+ "aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "shield.us-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "shield-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "fips-aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "shield-fips.us-east-1.amazonaws.com"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-global"
+ },
+ "signer" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "signer-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "signer-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "signer-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "signer-fips.us-west-2.amazonaws.com"
+ },
+ "fips-verification-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "verification.signer-fips.us-east-1.amazonaws.com"
+ },
+ "fips-verification-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "hostname" : "verification.signer-fips.us-east-2.amazonaws.com"
+ },
+ "fips-verification-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "hostname" : "verification.signer-fips.us-west-1.amazonaws.com"
+ },
+ "fips-verification-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "verification.signer-fips.us-west-2.amazonaws.com"
+ },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "signer-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "signer-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "signer-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "signer-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "verification-af-south-1" : {
+ "credentialScope" : {
+ "region" : "af-south-1"
+ },
+ "hostname" : "verification.signer.af-south-1.amazonaws.com"
+ },
+ "verification-ap-east-1" : {
+ "credentialScope" : {
+ "region" : "ap-east-1"
+ },
+ "hostname" : "verification.signer.ap-east-1.amazonaws.com"
+ },
+ "verification-ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "hostname" : "verification.signer.ap-northeast-1.amazonaws.com"
+ },
+ "verification-ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "hostname" : "verification.signer.ap-northeast-2.amazonaws.com"
+ },
+ "verification-ap-south-1" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "hostname" : "verification.signer.ap-south-1.amazonaws.com"
+ },
+ "verification-ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "hostname" : "verification.signer.ap-southeast-1.amazonaws.com"
+ },
+ "verification-ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "hostname" : "verification.signer.ap-southeast-2.amazonaws.com"
+ },
+ "verification-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "hostname" : "verification.signer.ca-central-1.amazonaws.com"
+ },
+ "verification-eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "hostname" : "verification.signer.eu-central-1.amazonaws.com"
+ },
+ "verification-eu-north-1" : {
+ "credentialScope" : {
+ "region" : "eu-north-1"
+ },
+ "hostname" : "verification.signer.eu-north-1.amazonaws.com"
+ },
+ "verification-eu-south-1" : {
+ "credentialScope" : {
+ "region" : "eu-south-1"
+ },
+ "hostname" : "verification.signer.eu-south-1.amazonaws.com"
+ },
+ "verification-eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "hostname" : "verification.signer.eu-west-1.amazonaws.com"
+ },
+ "verification-eu-west-2" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "hostname" : "verification.signer.eu-west-2.amazonaws.com"
+ },
+ "verification-eu-west-3" : {
+ "credentialScope" : {
+ "region" : "eu-west-3"
+ },
+ "hostname" : "verification.signer.eu-west-3.amazonaws.com"
+ },
+ "verification-me-south-1" : {
+ "credentialScope" : {
+ "region" : "me-south-1"
+ },
+ "hostname" : "verification.signer.me-south-1.amazonaws.com"
+ },
+ "verification-sa-east-1" : {
+ "credentialScope" : {
+ "region" : "sa-east-1"
+ },
+ "hostname" : "verification.signer.sa-east-1.amazonaws.com"
+ },
+ "verification-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "verification.signer.us-east-1.amazonaws.com"
+ },
+ "verification-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "hostname" : "verification.signer.us-east-2.amazonaws.com"
+ },
+ "verification-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "hostname" : "verification.signer.us-west-1.amazonaws.com"
+ },
+ "verification-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "verification.signer.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "simspaceweaver" : {
+ "endpoints" : {
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-2" : { }
+ }
+ },
+ "sms" : {
+ "endpoints" : {
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "sms-fips.us-west-2.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "sms-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "sms-voice" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "sms-voice-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "sms-voice-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sms-voice-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sms-voice-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sms-voice-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "sms-voice-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sms-voice-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "sms-voice-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "sms-voice-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "sms-voice-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "sms-voice-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "sms-voice-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "snowball" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.af-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.af-south-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.ap-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.ap-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.ap-northeast-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.ap-northeast-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.ap-northeast-3.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.ap-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.ap-south-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.ap-southeast-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.ap-southeast-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.ap-southeast-3.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.eu-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.eu-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.eu-north-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.eu-north-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.eu-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.eu-south-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.eu-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.eu-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.eu-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.eu-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.eu-west-3.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.eu-west-3.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-af-south-1" : {
+ "credentialScope" : {
+ "region" : "af-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.af-south-1.amazonaws.com"
+ },
+ "fips-ap-east-1" : {
+ "credentialScope" : {
+ "region" : "ap-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.ap-east-1.amazonaws.com"
+ },
+ "fips-ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.ap-northeast-1.amazonaws.com"
+ },
+ "fips-ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.ap-northeast-2.amazonaws.com"
+ },
+ "fips-ap-northeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-3"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.ap-northeast-3.amazonaws.com"
+ },
+ "fips-ap-south-1" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.ap-south-1.amazonaws.com"
+ },
+ "fips-ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.ap-southeast-1.amazonaws.com"
+ },
+ "fips-ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.ap-southeast-2.amazonaws.com"
+ },
+ "fips-ap-southeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-3"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.ap-southeast-3.amazonaws.com"
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.eu-central-1.amazonaws.com"
+ },
+ "fips-eu-north-1" : {
+ "credentialScope" : {
+ "region" : "eu-north-1"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.eu-north-1.amazonaws.com"
+ },
+ "fips-eu-south-1" : {
+ "credentialScope" : {
+ "region" : "eu-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.eu-south-1.amazonaws.com"
+ },
+ "fips-eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.eu-west-1.amazonaws.com"
+ },
+ "fips-eu-west-2" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.eu-west-2.amazonaws.com"
+ },
+ "fips-eu-west-3" : {
+ "credentialScope" : {
+ "region" : "eu-west-3"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.eu-west-3.amazonaws.com"
+ },
+ "fips-il-central-1" : {
+ "credentialScope" : {
+ "region" : "il-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.il-central-1.amazonaws.com"
+ },
+ "fips-me-central-1" : {
+ "credentialScope" : {
+ "region" : "me-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.me-central-1.amazonaws.com"
+ },
+ "fips-sa-east-1" : {
+ "credentialScope" : {
+ "region" : "sa-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.sa-east-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.il-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.il-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.me-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.me-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.sa-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.sa-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "sns" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "sns.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "sns.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "sns.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "sns.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "sns.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "sns.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "sns.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "sns.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "sns.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "sns.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "sns.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "variants" : [ {
+ "hostname" : "sns.ap-southeast-5.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-7" : {
+ "variants" : [ {
+ "hostname" : "sns.ap-southeast-7.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "sns.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "sns-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "sns.ca-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "sns.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "sns.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "sns.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "sns.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "sns.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "sns.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "sns.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "sns.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sns-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sns-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "sns-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sns-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "sns-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "sns.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "sns.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "sns.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "mx-central-1" : {
+ "variants" : [ {
+ "hostname" : "sns.mx-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "sns.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "sns-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "sns.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "sns-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "sns.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "sns-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "sns.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "sns-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "sns.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "sqs" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ],
+ "sslCommonName" : "{region}.queue.{dnsSuffix}"
+ },
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "sqs-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "sqs-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sqs-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sqs-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sqs-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "sqs-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sqs-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "sqs-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "sslCommonName" : "queue.{dnsSuffix}",
+ "variants" : [ {
+ "hostname" : "sqs-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "sqs-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "sqs-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "sqs-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "ssm" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "ssm-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "ssm-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "ssm-contacts" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-contacts-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-contacts-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-contacts-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-contacts-fips.us-west-2.amazonaws.com"
+ },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-contacts-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "ssm-contacts-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-contacts-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "ssm-contacts-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "ssm-incidents" : {
+ "endpoints" : {
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-incidents.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "ssm-incidents.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-incidents.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-incidents.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "ssm-incidents.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-incidents-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ssm-incidents-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "ssm-incidents.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-incidents.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-incidents.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-incidents.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "ssm-incidents.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "ssm-incidents.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-incidents-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-incidents-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-incidents-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-incidents-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-incidents-fips.us-west-2.amazonaws.com"
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-incidents.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-incidents-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ssm-incidents-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "ssm-incidents.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "ssm-incidents-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ssm-incidents-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "ssm-incidents.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-incidents-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ssm-incidents-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "ssm-incidents.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "ssm-incidents-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ssm-incidents-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "ssm-incidents.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "ssm-quicksetup" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-quicksetup-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-quicksetup-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-quicksetup-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-quicksetup-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-quicksetup-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-quicksetup-fips.us-west-2.amazonaws.com"
+ },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-quicksetup-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "ssm-quicksetup-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-quicksetup-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "ssm-quicksetup-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "ssm-sap" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ssm-sap-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "ssm-sap.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-sap-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-sap-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-sap-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-sap-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm-sap-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ssm-sap-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "ssm-sap.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ssm-sap-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "ssm-sap.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ssm-sap-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "ssm-sap.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "ssm-sap-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ssm-sap-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "ssm-sap.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "sso" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "states" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "states-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "states-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "states-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "states-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "states-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "states-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "states-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "states-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "states-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "states-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "states-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "states-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "storagegateway" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "storagegateway-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "storagegateway-fips.ca-central-1.amazonaws.com"
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "storagegateway-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "storagegateway-fips.ca-west-1.amazonaws.com"
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "storagegateway-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "storagegateway-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "storagegateway-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "storagegateway-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "storagegateway-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "storagegateway-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "storagegateway-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "storagegateway-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "streams.dynamodb" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "dynamodb"
+ },
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "local" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "localhost:8000",
+ "protocols" : [ "http" ]
+ },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "sts" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "sts.amazonaws.com"
+ },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "sts-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sts-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "sts-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "sts-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "sts-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sts-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "sts-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "sts-fips.us-west-2.amazonaws.com"
+ }
+ },
+ "partitionEndpoint" : "aws-global"
+ },
+ "support" : {
+ "endpoints" : {
+ "aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "support.us-east-1.amazonaws.com"
+ }
+ },
+ "partitionEndpoint" : "aws-global"
+ },
+ "supportapp" : {
+ "endpoints" : {
+ "eu-west-1" : { },
+ "us-east-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "swf" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "swf-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "swf-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "swf-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "swf-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "swf-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "swf-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "swf-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "swf-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "swf-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "swf-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "swf-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "swf-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "synthetics" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "synthetics.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "variants" : [ {
+ "hostname" : "synthetics.ap-northeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "variants" : [ {
+ "hostname" : "synthetics.ap-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "synthetics.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "variants" : [ {
+ "hostname" : "synthetics.ap-southeast-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "variants" : [ {
+ "hostname" : "synthetics.ap-southeast-4.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "variants" : [ {
+ "hostname" : "synthetics.ap-southeast-5.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-7" : {
+ "variants" : [ {
+ "hostname" : "synthetics.ap-southeast-7.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "synthetics-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "synthetics.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "synthetics-fips.ca-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "synthetics.ca-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "variants" : [ {
+ "hostname" : "synthetics.eu-central-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics.eu-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "synthetics.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "synthetics.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "synthetics.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "synthetics-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "synthetics-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "synthetics-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "synthetics-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "synthetics-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "synthetics-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics.il-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-central-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics.me-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "mx-central-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics.mx-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "synthetics-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "synthetics.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "synthetics-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "synthetics-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "synthetics.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "synthetics-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "synthetics.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "synthetics-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "synthetics-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "synthetics.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "tagging" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "tax" : {
+ "endpoints" : {
+ "aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "tax.us-east-1.amazonaws.com"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-global"
+ },
+ "textract" : {
+ "endpoints" : {
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "textract.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "textract.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "textract.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "textract.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "textract-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "textract-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "textract.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "textract.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "variants" : [ {
+ "hostname" : "textract.eu-south-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "textract.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "textract.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "textract.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "textract-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "textract-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "textract-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "textract-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "textract-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "textract-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "textract-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "textract.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "textract-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "textract-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "textract.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "textract-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "textract-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "textract.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "textract-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "textract-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "textract.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "thinclient" : {
+ "endpoints" : {
+ "ap-south-1" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "tnb" : {
+ "endpoints" : {
+ "ap-northeast-2" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-south-2" : { },
+ "eu-west-3" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "transcribe" : {
+ "defaults" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "fips.transcribe.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "af-south-1" : {
+ "variants" : [ {
+ "hostname" : "transcribe.af-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "transcribe.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "transcribe.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "transcribe.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "transcribe.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "transcribe.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "transcribe.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "fips.transcribe.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "transcribe-fips.ca-central-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "transcribe.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "transcribe.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "transcribe.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "transcribe.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "transcribe.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "transcribe.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fips.transcribe.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fips.transcribe.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "fips.transcribe.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fips.transcribe.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "fips.transcribe.us-west-2.amazonaws.com"
+ },
+ "me-south-1" : {
+ "variants" : [ {
+ "hostname" : "transcribe.me-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "variants" : [ {
+ "hostname" : "transcribe.sa-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "fips.transcribe.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "transcribe-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "transcribe.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "fips.transcribe.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "transcribe-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "transcribe.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "fips.transcribe.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "transcribe-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "transcribe.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "fips.transcribe.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "transcribe-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "transcribe.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "transcribestreaming" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "transcribestreaming-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "transcribestreaming-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "transcribestreaming-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "transcribestreaming-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "transcribestreaming-fips.us-west-2.amazonaws.com"
+ },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "transcribestreaming-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "transcribestreaming-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "transcribestreaming-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "transfer" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "transfer-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "transfer-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "transfer-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "transfer-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "transfer-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "transfer-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "transfer-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "transfer-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "transfer-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "transfer-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "transfer-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "transfer-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "translate" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "ap-east-1" : {
+ "variants" : [ {
+ "hostname" : "translate.ap-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "variants" : [ {
+ "hostname" : "translate.ap-northeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "variants" : [ {
+ "hostname" : "translate.ap-northeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "variants" : [ {
+ "hostname" : "translate.ap-south-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "variants" : [ {
+ "hostname" : "translate.ap-southeast-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "variants" : [ {
+ "hostname" : "translate.ap-southeast-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "translate.ca-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "variants" : [ {
+ "hostname" : "translate.eu-central-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "variants" : [ {
+ "hostname" : "translate.eu-north-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "variants" : [ {
+ "hostname" : "translate.eu-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "variants" : [ {
+ "hostname" : "translate.eu-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "variants" : [ {
+ "hostname" : "translate.eu-west-3.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "translate-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "translate-fips.us-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "translate.us-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "translate-fips.us-east-1.amazonaws.com"
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "translate-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "translate-fips.us-east-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "translate.us-east-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-east-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "translate-fips.us-east-2.amazonaws.com"
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "translate-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "translate-fips.us-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "translate.us-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "translate-fips.us-west-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "translate-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "translate-fips.us-west-2.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "translate.us-west-2.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "translate-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "trustedadvisor" : {
+ "endpoints" : {
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "trustedadvisor-fips.us-east-1.api.aws"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "hostname" : "trustedadvisor-fips.us-east-2.api.aws"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "trustedadvisor-fips.us-west-2.api.aws"
+ }
+ }
+ },
+ "verifiedpermissions" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "verifiedpermissions-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "variants" : [ {
+ "hostname" : "verifiedpermissions-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "verifiedpermissions-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "verifiedpermissions-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "verifiedpermissions-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "verifiedpermissions-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "verifiedpermissions-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "verifiedpermissions-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "verifiedpermissions-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "verifiedpermissions-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "verifiedpermissions-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "verifiedpermissions-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "voice-chime" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "voice-chime-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-central-1-fips" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "voice-chime-fips.ca-central-1.amazonaws.com"
+ },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "voice-chime-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "voice-chime-fips.us-east-1.amazonaws.com"
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "voice-chime-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2-fips" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "voice-chime-fips.us-west-2.amazonaws.com"
+ }
+ }
+ },
+ "voiceid" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "hostname" : "voiceid-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-west-2" : { },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "voiceid-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "voiceid-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "voiceid-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "voiceid-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "voiceid-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "vpc-lattice" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "waf" : {
+ "endpoints" : {
+ "aws" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "waf-fips.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "aws-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-fips.amazonaws.com"
+ },
+ "aws-global" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "waf.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-fips.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "aws-global-fips" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-fips.amazonaws.com"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-global"
+ },
+ "waf-regional" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "credentialScope" : {
+ "region" : "af-south-1"
+ },
+ "hostname" : "waf-regional.af-south-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.af-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "credentialScope" : {
+ "region" : "ap-east-1"
+ },
+ "hostname" : "waf-regional.ap-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.ap-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "hostname" : "waf-regional.ap-northeast-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.ap-northeast-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "hostname" : "waf-regional.ap-northeast-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.ap-northeast-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-3"
+ },
+ "hostname" : "waf-regional.ap-northeast-3.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.ap-northeast-3.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "hostname" : "waf-regional.ap-south-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.ap-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "credentialScope" : {
+ "region" : "ap-south-2"
+ },
+ "hostname" : "waf-regional.ap-south-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.ap-south-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "hostname" : "waf-regional.ap-southeast-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.ap-southeast-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "hostname" : "waf-regional.ap-southeast-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.ap-southeast-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-3"
+ },
+ "hostname" : "waf-regional.ap-southeast-3.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.ap-southeast-3.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-4"
+ },
+ "hostname" : "waf-regional.ap-southeast-4.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.ap-southeast-4.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "hostname" : "waf-regional.ca-central-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "hostname" : "waf-regional.eu-central-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.eu-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "credentialScope" : {
+ "region" : "eu-central-2"
+ },
+ "hostname" : "waf-regional.eu-central-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.eu-central-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "credentialScope" : {
+ "region" : "eu-north-1"
+ },
+ "hostname" : "waf-regional.eu-north-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.eu-north-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "credentialScope" : {
+ "region" : "eu-south-1"
+ },
+ "hostname" : "waf-regional.eu-south-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.eu-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "credentialScope" : {
+ "region" : "eu-south-2"
+ },
+ "hostname" : "waf-regional.eu-south-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.eu-south-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "hostname" : "waf-regional.eu-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.eu-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "hostname" : "waf-regional.eu-west-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.eu-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "credentialScope" : {
+ "region" : "eu-west-3"
+ },
+ "hostname" : "waf-regional.eu-west-3.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.eu-west-3.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "fips-af-south-1" : {
+ "credentialScope" : {
+ "region" : "af-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.af-south-1.amazonaws.com"
+ },
+ "fips-ap-east-1" : {
+ "credentialScope" : {
+ "region" : "ap-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.ap-east-1.amazonaws.com"
+ },
+ "fips-ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.ap-northeast-1.amazonaws.com"
+ },
+ "fips-ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.ap-northeast-2.amazonaws.com"
+ },
+ "fips-ap-northeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-3"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.ap-northeast-3.amazonaws.com"
+ },
+ "fips-ap-south-1" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.ap-south-1.amazonaws.com"
+ },
+ "fips-ap-south-2" : {
+ "credentialScope" : {
+ "region" : "ap-south-2"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.ap-south-2.amazonaws.com"
+ },
+ "fips-ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.ap-southeast-1.amazonaws.com"
+ },
+ "fips-ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.ap-southeast-2.amazonaws.com"
+ },
+ "fips-ap-southeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-3"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.ap-southeast-3.amazonaws.com"
+ },
+ "fips-ap-southeast-4" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-4"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.ap-southeast-4.amazonaws.com"
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.eu-central-1.amazonaws.com"
+ },
+ "fips-eu-central-2" : {
+ "credentialScope" : {
+ "region" : "eu-central-2"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.eu-central-2.amazonaws.com"
+ },
+ "fips-eu-north-1" : {
+ "credentialScope" : {
+ "region" : "eu-north-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.eu-north-1.amazonaws.com"
+ },
+ "fips-eu-south-1" : {
+ "credentialScope" : {
+ "region" : "eu-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.eu-south-1.amazonaws.com"
+ },
+ "fips-eu-south-2" : {
+ "credentialScope" : {
+ "region" : "eu-south-2"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.eu-south-2.amazonaws.com"
+ },
+ "fips-eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.eu-west-1.amazonaws.com"
+ },
+ "fips-eu-west-2" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.eu-west-2.amazonaws.com"
+ },
+ "fips-eu-west-3" : {
+ "credentialScope" : {
+ "region" : "eu-west-3"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.eu-west-3.amazonaws.com"
+ },
+ "fips-il-central-1" : {
+ "credentialScope" : {
+ "region" : "il-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.il-central-1.amazonaws.com"
+ },
+ "fips-me-central-1" : {
+ "credentialScope" : {
+ "region" : "me-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.me-central-1.amazonaws.com"
+ },
+ "fips-me-south-1" : {
+ "credentialScope" : {
+ "region" : "me-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.me-south-1.amazonaws.com"
+ },
+ "fips-sa-east-1" : {
+ "credentialScope" : {
+ "region" : "sa-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.sa-east-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "credentialScope" : {
+ "region" : "il-central-1"
+ },
+ "hostname" : "waf-regional.il-central-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.il-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "me-central-1" : {
+ "credentialScope" : {
+ "region" : "me-central-1"
+ },
+ "hostname" : "waf-regional.me-central-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.me-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "me-south-1" : {
+ "credentialScope" : {
+ "region" : "me-south-1"
+ },
+ "hostname" : "waf-regional.me-south-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.me-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "credentialScope" : {
+ "region" : "sa-east-1"
+ },
+ "hostname" : "waf-regional.sa-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.sa-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "waf-regional.us-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "hostname" : "waf-regional.us-east-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "hostname" : "waf-regional.us-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "waf-regional.us-west-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "wafv2" : {
+ "endpoints" : {
+ "af-south-1" : {
+ "credentialScope" : {
+ "region" : "af-south-1"
+ },
+ "hostname" : "wafv2.af-south-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.af-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-east-1" : {
+ "credentialScope" : {
+ "region" : "ap-east-1"
+ },
+ "hostname" : "wafv2.ap-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.ap-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "hostname" : "wafv2.ap-northeast-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.ap-northeast-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "hostname" : "wafv2.ap-northeast-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.ap-northeast-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-northeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-3"
+ },
+ "hostname" : "wafv2.ap-northeast-3.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.ap-northeast-3.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-south-1" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "hostname" : "wafv2.ap-south-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.ap-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-south-2" : {
+ "credentialScope" : {
+ "region" : "ap-south-2"
+ },
+ "hostname" : "wafv2.ap-south-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.ap-south-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "hostname" : "wafv2.ap-southeast-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.ap-southeast-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "hostname" : "wafv2.ap-southeast-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.ap-southeast-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-3"
+ },
+ "hostname" : "wafv2.ap-southeast-3.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.ap-southeast-3.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-4" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-4"
+ },
+ "hostname" : "wafv2.ap-southeast-4.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.ap-southeast-4.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-5" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-5"
+ },
+ "hostname" : "wafv2.ap-southeast-5.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.ap-southeast-5.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ap-southeast-7" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-7"
+ },
+ "hostname" : "wafv2.ap-southeast-7.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.ap-southeast-7.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "hostname" : "wafv2.ca-central-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.ca-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "hostname" : "wafv2.ca-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.ca-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "hostname" : "wafv2.eu-central-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.eu-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-2" : {
+ "credentialScope" : {
+ "region" : "eu-central-2"
+ },
+ "hostname" : "wafv2.eu-central-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.eu-central-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-north-1" : {
+ "credentialScope" : {
+ "region" : "eu-north-1"
+ },
+ "hostname" : "wafv2.eu-north-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.eu-north-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-south-1" : {
+ "credentialScope" : {
+ "region" : "eu-south-1"
+ },
+ "hostname" : "wafv2.eu-south-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.eu-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-south-2" : {
+ "credentialScope" : {
+ "region" : "eu-south-2"
+ },
+ "hostname" : "wafv2.eu-south-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.eu-south-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "hostname" : "wafv2.eu-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.eu-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-west-2" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "hostname" : "wafv2.eu-west-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.eu-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-west-3" : {
+ "credentialScope" : {
+ "region" : "eu-west-3"
+ },
+ "hostname" : "wafv2.eu-west-3.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.eu-west-3.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "fips-af-south-1" : {
+ "credentialScope" : {
+ "region" : "af-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.af-south-1.amazonaws.com"
+ },
+ "fips-ap-east-1" : {
+ "credentialScope" : {
+ "region" : "ap-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.ap-east-1.amazonaws.com"
+ },
+ "fips-ap-northeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.ap-northeast-1.amazonaws.com"
+ },
+ "fips-ap-northeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-2"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.ap-northeast-2.amazonaws.com"
+ },
+ "fips-ap-northeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-northeast-3"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.ap-northeast-3.amazonaws.com"
+ },
+ "fips-ap-south-1" : {
+ "credentialScope" : {
+ "region" : "ap-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.ap-south-1.amazonaws.com"
+ },
+ "fips-ap-south-2" : {
+ "credentialScope" : {
+ "region" : "ap-south-2"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.ap-south-2.amazonaws.com"
+ },
+ "fips-ap-southeast-1" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.ap-southeast-1.amazonaws.com"
+ },
+ "fips-ap-southeast-2" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-2"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.ap-southeast-2.amazonaws.com"
+ },
+ "fips-ap-southeast-3" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-3"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.ap-southeast-3.amazonaws.com"
+ },
+ "fips-ap-southeast-4" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-4"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.ap-southeast-4.amazonaws.com"
+ },
+ "fips-ap-southeast-5" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-5"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.ap-southeast-5.amazonaws.com"
+ },
+ "fips-ap-southeast-7" : {
+ "credentialScope" : {
+ "region" : "ap-southeast-7"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.ap-southeast-7.amazonaws.com"
+ },
+ "fips-ca-central-1" : {
+ "credentialScope" : {
+ "region" : "ca-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.ca-central-1.amazonaws.com"
+ },
+ "fips-ca-west-1" : {
+ "credentialScope" : {
+ "region" : "ca-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.ca-west-1.amazonaws.com"
+ },
+ "fips-eu-central-1" : {
+ "credentialScope" : {
+ "region" : "eu-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.eu-central-1.amazonaws.com"
+ },
+ "fips-eu-central-2" : {
+ "credentialScope" : {
+ "region" : "eu-central-2"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.eu-central-2.amazonaws.com"
+ },
+ "fips-eu-north-1" : {
+ "credentialScope" : {
+ "region" : "eu-north-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.eu-north-1.amazonaws.com"
+ },
+ "fips-eu-south-1" : {
+ "credentialScope" : {
+ "region" : "eu-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.eu-south-1.amazonaws.com"
+ },
+ "fips-eu-south-2" : {
+ "credentialScope" : {
+ "region" : "eu-south-2"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.eu-south-2.amazonaws.com"
+ },
+ "fips-eu-west-1" : {
+ "credentialScope" : {
+ "region" : "eu-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.eu-west-1.amazonaws.com"
+ },
+ "fips-eu-west-2" : {
+ "credentialScope" : {
+ "region" : "eu-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.eu-west-2.amazonaws.com"
+ },
+ "fips-eu-west-3" : {
+ "credentialScope" : {
+ "region" : "eu-west-3"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.eu-west-3.amazonaws.com"
+ },
+ "fips-il-central-1" : {
+ "credentialScope" : {
+ "region" : "il-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.il-central-1.amazonaws.com"
+ },
+ "fips-me-central-1" : {
+ "credentialScope" : {
+ "region" : "me-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.me-central-1.amazonaws.com"
+ },
+ "fips-me-south-1" : {
+ "credentialScope" : {
+ "region" : "me-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.me-south-1.amazonaws.com"
+ },
+ "fips-mx-central-1" : {
+ "credentialScope" : {
+ "region" : "mx-central-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.mx-central-1.amazonaws.com"
+ },
+ "fips-sa-east-1" : {
+ "credentialScope" : {
+ "region" : "sa-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.sa-east-1.amazonaws.com"
+ },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : {
+ "credentialScope" : {
+ "region" : "il-central-1"
+ },
+ "hostname" : "wafv2.il-central-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.il-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "me-central-1" : {
+ "credentialScope" : {
+ "region" : "me-central-1"
+ },
+ "hostname" : "wafv2.me-central-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.me-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "me-south-1" : {
+ "credentialScope" : {
+ "region" : "me-south-1"
+ },
+ "hostname" : "wafv2.me-south-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.me-south-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "mx-central-1" : {
+ "credentialScope" : {
+ "region" : "mx-central-1"
+ },
+ "hostname" : "wafv2.mx-central-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.mx-central-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "sa-east-1" : {
+ "credentialScope" : {
+ "region" : "sa-east-1"
+ },
+ "hostname" : "wafv2.sa-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.sa-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "hostname" : "wafv2.us-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "hostname" : "wafv2.us-east-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "hostname" : "wafv2.us-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "hostname" : "wafv2.us-west-2.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "wellarchitected" : {
+ "endpoints" : {
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-north-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "me-south-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : { },
+ "us-east-2" : { },
+ "us-west-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "wisdom" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : {
+ "variants" : [ {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "eu-central-1" : { },
+ "eu-west-2" : { },
+ "fips-ca-central-1" : {
+ "deprecated" : true
+ },
+ "fips-us-east-1" : {
+ "deprecated" : true
+ },
+ "fips-us-west-2" : {
+ "deprecated" : true
+ },
+ "ui-ap-northeast-1" : { },
+ "ui-ap-northeast-2" : { },
+ "ui-ap-southeast-1" : { },
+ "ui-ap-southeast-2" : { },
+ "ui-ca-central-1" : { },
+ "ui-eu-central-1" : { },
+ "ui-eu-west-2" : { },
+ "ui-us-east-1" : { },
+ "ui-us-west-2" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "workdocs" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "eu-west-1" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "workdocs-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "workdocs-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "workdocs-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "workdocs-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "workmail" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "eu-west-1" : { },
+ "us-east-1" : { },
+ "us-west-2" : { }
+ }
+ },
+ "workspaces" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "workspaces-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "workspaces-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "workspaces-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "workspaces-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "workspaces-web" : {
+ "endpoints" : {
+ "ap-northeast-1" : { },
+ "ap-south-1" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ca-central-1" : { },
+ "eu-central-1" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "workspaces-web-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "workspaces-web-fips.us-west-2.amazonaws.com"
+ },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "workspaces-web-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "workspaces-web-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "xray" : {
+ "endpoints" : {
+ "af-south-1" : { },
+ "ap-east-1" : { },
+ "ap-northeast-1" : { },
+ "ap-northeast-2" : { },
+ "ap-northeast-3" : { },
+ "ap-south-1" : { },
+ "ap-south-2" : { },
+ "ap-southeast-1" : { },
+ "ap-southeast-2" : { },
+ "ap-southeast-3" : { },
+ "ap-southeast-4" : { },
+ "ap-southeast-5" : { },
+ "ap-southeast-7" : { },
+ "ca-central-1" : { },
+ "ca-west-1" : { },
+ "eu-central-1" : { },
+ "eu-central-2" : { },
+ "eu-north-1" : { },
+ "eu-south-1" : { },
+ "eu-south-2" : { },
+ "eu-west-1" : { },
+ "eu-west-2" : { },
+ "eu-west-3" : { },
+ "fips-us-east-1" : {
+ "credentialScope" : {
+ "region" : "us-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "xray-fips.us-east-1.amazonaws.com"
+ },
+ "fips-us-east-2" : {
+ "credentialScope" : {
+ "region" : "us-east-2"
+ },
+ "deprecated" : true,
+ "hostname" : "xray-fips.us-east-2.amazonaws.com"
+ },
+ "fips-us-west-1" : {
+ "credentialScope" : {
+ "region" : "us-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "xray-fips.us-west-1.amazonaws.com"
+ },
+ "fips-us-west-2" : {
+ "credentialScope" : {
+ "region" : "us-west-2"
+ },
+ "deprecated" : true,
+ "hostname" : "xray-fips.us-west-2.amazonaws.com"
+ },
+ "il-central-1" : { },
+ "me-central-1" : { },
+ "me-south-1" : { },
+ "mx-central-1" : { },
+ "sa-east-1" : { },
+ "us-east-1" : {
+ "variants" : [ {
+ "hostname" : "xray-fips.us-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-east-2" : {
+ "variants" : [ {
+ "hostname" : "xray-fips.us-east-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-1" : {
+ "variants" : [ {
+ "hostname" : "xray-fips.us-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-west-2" : {
+ "variants" : [ {
+ "hostname" : "xray-fips.us-west-2.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ }
+ }
+ }, {
+ "defaults" : {
+ "hostname" : "{service}.{region}.{dnsSuffix}",
+ "protocols" : [ "https" ],
+ "signatureVersions" : [ "v4" ],
+ "variants" : [ {
+ "dnsSuffix" : "amazonaws.com.cn",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ }, {
+ "dnsSuffix" : "api.amazonwebservices.com.cn",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "dnsSuffix" : "api.amazonwebservices.com.cn",
+ "hostname" : "{service}.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "dnsSuffix" : "amazonaws.com.cn",
+ "partition" : "aws-cn",
+ "partitionName" : "AWS China",
+ "regionRegex" : "^cn\\-\\w+\\-\\d+$",
+ "regions" : {
+ "cn-north-1" : {
+ "description" : "China (Beijing)"
+ },
+ "cn-northwest-1" : {
+ "description" : "China (Ningxia)"
+ }
+ },
+ "services" : {
+ "access-analyzer" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "account" : {
+ "endpoints" : {
+ "aws-cn-global" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "hostname" : "account.cn-northwest-1.amazonaws.com.cn"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-cn-global"
+ },
+ "acm" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "acm-pca" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "airflow" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "api.ecr" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "credentialScope" : {
+ "region" : "cn-north-1"
+ },
+ "hostname" : "api.ecr.cn-north-1.amazonaws.com.cn",
+ "variants" : [ {
+ "hostname" : "ecr.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "hostname" : "api.ecr.cn-northwest-1.amazonaws.com.cn",
+ "variants" : [ {
+ "hostname" : "ecr.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "api.pricing" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "pricing"
+ }
+ },
+ "endpoints" : {
+ "cn-northwest-1" : { }
+ }
+ },
+ "api.sagemaker" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "api.tunneling.iot" : {
+ "defaults" : {
+ "variants" : [ {
+ "dnsSuffix" : "amazonaws.com.cn",
+ "hostname" : "api.tunneling.iot-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ }, {
+ "dnsSuffix" : "api.amazonwebservices.com.cn",
+ "hostname" : "api.iot-tunneling-fips.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "dnsSuffix" : "api.amazonwebservices.com.cn",
+ "hostname" : "api.iot-tunneling.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "apigateway" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "appconfig" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "appconfigdata" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "application-autoscaling" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "applicationinsights" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "credentialScope" : {
+ "region" : "cn-north-1"
+ },
+ "hostname" : "applicationinsights.cn-north-1.amazonaws.com.cn"
+ },
+ "cn-northwest-1" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "hostname" : "applicationinsights.cn-northwest-1.amazonaws.com.cn"
+ }
+ }
+ },
+ "appmesh" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "appmesh.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "appmesh.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "appsync" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "arc-zonal-shift" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "athena" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "athena.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "athena.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "autoscaling" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "autoscaling-plans" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "backup" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "batch" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "budgets" : {
+ "endpoints" : {
+ "aws-cn-global" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "hostname" : "budgets.amazonaws.com.cn"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-cn-global"
+ },
+ "cassandra" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "ce" : {
+ "endpoints" : {
+ "aws-cn-global" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "hostname" : "ce.cn-northwest-1.amazonaws.com.cn"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-cn-global"
+ },
+ "cloudcontrolapi" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "cloudformation" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "cloudfront" : {
+ "endpoints" : {
+ "aws-cn-global" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "hostname" : "cloudfront.cn-northwest-1.amazonaws.com.cn",
+ "protocols" : [ "http", "https" ]
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-cn-global"
+ },
+ "cloudtrail" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "codebuild" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "codecommit" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "codedeploy" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "codepipeline" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "cognito-identity" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.cn-north-1.amazonaws.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "compute-optimizer" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "credentialScope" : {
+ "region" : "cn-north-1"
+ },
+ "hostname" : "compute-optimizer.cn-north-1.amazonaws.com.cn"
+ },
+ "cn-northwest-1" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "hostname" : "compute-optimizer.cn-northwest-1.amazonaws.com.cn"
+ }
+ }
+ },
+ "config" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "cur" : {
+ "endpoints" : {
+ "cn-northwest-1" : { }
+ }
+ },
+ "data-ats.iot" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "iotdata"
+ },
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : {
+ "hostname" : "data.ats.iot.cn-north-1.amazonaws.com.cn",
+ "protocols" : [ "https" ]
+ },
+ "cn-northwest-1" : { }
+ }
+ },
+ "data.iot" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "iotdata"
+ },
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "data.jobs.iot" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "databrew" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "datasync" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "datasync.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "datasync.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "datazone" : {
+ "defaults" : {
+ "dnsSuffix" : "api.amazonwebservices.com.cn",
+ "variants" : [ {
+ "dnsSuffix" : "api.amazonwebservices.com.cn",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "cn-north-1" : {
+ "hostname" : "datazone.cn-north-1.api.amazonwebservices.com.cn"
+ },
+ "cn-northwest-1" : {
+ "hostname" : "datazone.cn-northwest-1.api.amazonwebservices.com.cn"
+ }
+ }
+ },
+ "dax" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "directconnect" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "dlm" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "dlm.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "dlm.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "dms" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "docdb" : {
+ "endpoints" : {
+ "cn-northwest-1" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "hostname" : "rds.cn-northwest-1.amazonaws.com.cn"
+ }
+ }
+ },
+ "ds" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "dynamodb" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "ebs" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "ec2" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "ecs" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "eks" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "eks-auth" : {
+ "defaults" : {
+ "dnsSuffix" : "api.amazonwebservices.com.cn",
+ "variants" : [ {
+ "dnsSuffix" : "api.amazonwebservices.com.cn",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "cn-north-1" : {
+ "hostname" : "eks-auth.cn-north-1.api.amazonwebservices.com.cn"
+ },
+ "cn-northwest-1" : {
+ "hostname" : "eks-auth.cn-northwest-1.api.amazonwebservices.com.cn"
+ }
+ }
+ },
+ "elasticache" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "elasticbeanstalk" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "elasticfilesystem" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.cn-north-1.amazonaws.com.cn",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.cn-northwest-1.amazonaws.com.cn",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "fips-cn-north-1" : {
+ "credentialScope" : {
+ "region" : "cn-north-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.cn-north-1.amazonaws.com.cn"
+ },
+ "fips-cn-northwest-1" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.cn-northwest-1.amazonaws.com.cn"
+ }
+ }
+ },
+ "elasticloadbalancing" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "elasticmapreduce" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "elasticmapreduce.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "elasticmapreduce.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "emr-containers" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "emr-serverless" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "entitlement.marketplace" : {
+ "endpoints" : {
+ "cn-northwest-1" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "hostname" : "entitlement-marketplace.cn-northwest-1.amazonaws.com.cn",
+ "protocols" : [ "https" ]
+ }
+ }
+ },
+ "es" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "aos.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "aos.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "events" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "firehose" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "firehose.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "firehose.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "fms" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "fsx" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "gamelift" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "gameliftstreams" : {
+ "defaults" : {
+ "dnsSuffix" : "api.amazonwebservices.com.cn",
+ "variants" : [ {
+ "dnsSuffix" : "api.amazonwebservices.com.cn",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "cn-north-1" : {
+ "hostname" : "gameliftstreams.cn-north-1.api.amazonwebservices.com.cn"
+ },
+ "cn-northwest-1" : {
+ "hostname" : "gameliftstreams.cn-northwest-1.api.amazonwebservices.com.cn"
+ }
+ }
+ },
+ "glacier" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "glue" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "glue.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "glue.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "greengrass" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : { }
+ },
+ "isRegionalized" : true
+ },
+ "guardduty" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ },
+ "isRegionalized" : true
+ },
+ "health" : {
+ "defaults" : {
+ "protocols" : [ "https" ],
+ "sslCommonName" : "health.cn-northwest-1.amazonaws.com.cn"
+ },
+ "endpoints" : {
+ "aws-cn-global" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "hostname" : "global.health.amazonaws.com.cn"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-cn-global"
+ },
+ "iam" : {
+ "endpoints" : {
+ "aws-cn-global" : {
+ "credentialScope" : {
+ "region" : "cn-north-1"
+ },
+ "hostname" : "iam.cn-north-1.amazonaws.com.cn"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-cn-global"
+ },
+ "identitystore" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "inspector2" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "internetmonitor" : {
+ "defaults" : {
+ "dnsSuffix" : "api.amazonwebservices.com.cn",
+ "variants" : [ {
+ "dnsSuffix" : "api.amazonwebservices.com.cn",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "cn-north-1" : {
+ "hostname" : "internetmonitor.cn-north-1.api.amazonwebservices.com.cn"
+ },
+ "cn-northwest-1" : {
+ "hostname" : "internetmonitor.cn-northwest-1.api.amazonwebservices.com.cn"
+ }
+ }
+ },
+ "iot" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "iotanalytics" : {
+ "endpoints" : {
+ "cn-north-1" : { }
+ }
+ },
+ "iotevents" : {
+ "endpoints" : {
+ "cn-north-1" : { }
+ }
+ },
+ "ioteventsdata" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "credentialScope" : {
+ "region" : "cn-north-1"
+ },
+ "hostname" : "data.iotevents.cn-north-1.amazonaws.com.cn"
+ }
+ }
+ },
+ "iotsecuredtunneling" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "iotsitewise" : {
+ "endpoints" : {
+ "cn-north-1" : { }
+ }
+ },
+ "iottwinmaker" : {
+ "endpoints" : {
+ "api-cn-north-1" : {
+ "credentialScope" : {
+ "region" : "cn-north-1"
+ },
+ "hostname" : "api.iottwinmaker.cn-north-1.amazonaws.com.cn"
+ },
+ "cn-north-1" : { },
+ "data-cn-north-1" : {
+ "credentialScope" : {
+ "region" : "cn-north-1"
+ },
+ "hostname" : "data.iottwinmaker.cn-north-1.amazonaws.com.cn"
+ }
+ }
+ },
+ "kafka" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "kendra-ranking" : {
+ "defaults" : {
+ "dnsSuffix" : "api.amazonwebservices.com.cn",
+ "variants" : [ {
+ "dnsSuffix" : "api.amazonwebservices.com.cn",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "cn-north-1" : {
+ "hostname" : "kendra-ranking.cn-north-1.api.amazonwebservices.com.cn"
+ },
+ "cn-northwest-1" : {
+ "hostname" : "kendra-ranking.cn-northwest-1.api.amazonwebservices.com.cn"
+ }
+ }
+ },
+ "kinesis" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "kinesisanalytics" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "kinesisvideo" : {
+ "endpoints" : {
+ "cn-north-1" : { }
+ }
+ },
+ "kms" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "lakeformation" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "lakeformation.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "lambda" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "lambda.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "lambda.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "license-manager" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "license-manager-linux-subscriptions" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "logs" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "logs.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "logs.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "mediaconvert" : {
+ "endpoints" : {
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "memory-db" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "metering.marketplace" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "aws-marketplace"
+ }
+ },
+ "endpoints" : {
+ "cn-northwest-1" : { }
+ }
+ },
+ "metrics.sagemaker" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "monitoring" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "mq" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "neptune" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "credentialScope" : {
+ "region" : "cn-north-1"
+ },
+ "hostname" : "rds.cn-north-1.amazonaws.com.cn"
+ },
+ "cn-northwest-1" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "hostname" : "rds.cn-northwest-1.amazonaws.com.cn"
+ }
+ }
+ },
+ "network-firewall" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "notifications" : {
+ "defaults" : {
+ "dnsSuffix" : "api.amazonwebservices.com.cn",
+ "variants" : [ {
+ "dnsSuffix" : "api.amazonwebservices.com.cn",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "cn-north-1" : {
+ "hostname" : "notifications.cn-north-1.api.amazonwebservices.com.cn"
+ },
+ "cn-northwest-1" : {
+ "hostname" : "notifications.cn-northwest-1.api.amazonwebservices.com.cn"
+ }
+ }
+ },
+ "oam" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "oidc" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "credentialScope" : {
+ "region" : "cn-north-1"
+ },
+ "hostname" : "oidc.cn-north-1.amazonaws.com.cn"
+ },
+ "cn-northwest-1" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "hostname" : "oidc.cn-northwest-1.amazonaws.com.cn"
+ }
+ }
+ },
+ "organizations" : {
+ "endpoints" : {
+ "aws-cn-global" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "hostname" : "organizations.cn-northwest-1.amazonaws.com.cn"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-cn-global"
+ },
+ "personalize" : {
+ "endpoints" : {
+ "cn-north-1" : { }
+ }
+ },
+ "pi" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "pipes" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "polly" : {
+ "endpoints" : {
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "polly.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "portal.sso" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "credentialScope" : {
+ "region" : "cn-north-1"
+ },
+ "hostname" : "portal.sso.cn-north-1.amazonaws.com.cn"
+ },
+ "cn-northwest-1" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "hostname" : "portal.sso.cn-northwest-1.amazonaws.com.cn"
+ }
+ }
+ },
+ "qbusiness" : {
+ "defaults" : {
+ "dnsSuffix" : "api.amazonwebservices.com.cn",
+ "variants" : [ {
+ "dnsSuffix" : "api.amazonwebservices.com.cn",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "cn-north-1" : {
+ "hostname" : "qbusiness.cn-north-1.api.amazonwebservices.com.cn"
+ },
+ "cn-northwest-1" : {
+ "hostname" : "qbusiness.cn-northwest-1.api.amazonwebservices.com.cn"
+ }
+ }
+ },
+ "quicksight" : {
+ "endpoints" : {
+ "cn-north-1" : { }
+ }
+ },
+ "ram" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "rbin" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "rbin.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "rbin.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "rds" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "redshift" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "redshift-serverless" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "resource-groups" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "rolesanywhere" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "route53" : {
+ "endpoints" : {
+ "aws-cn-global" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "hostname" : "route53.amazonaws.com.cn"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-cn-global"
+ },
+ "route53resolver" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "runtime.sagemaker" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "s3" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ],
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "dnsSuffix" : "amazonaws.com.cn",
+ "hostname" : "{service}.dualstack.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.cn-north-1.amazonaws.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "s3.dualstack.cn-northwest-1.amazonaws.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "s3-control" : {
+ "defaults" : {
+ "protocols" : [ "https" ],
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "dnsSuffix" : "amazonaws.com.cn",
+ "hostname" : "{service}.dualstack.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "endpoints" : {
+ "cn-north-1" : {
+ "credentialScope" : {
+ "region" : "cn-north-1"
+ },
+ "hostname" : "s3-control.cn-north-1.amazonaws.com.cn",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.cn-north-1.amazonaws.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "hostname" : "s3-control.cn-northwest-1.amazonaws.com.cn",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control.dualstack.cn-northwest-1.amazonaws.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "savingsplans" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "credentialScope" : {
+ "region" : "cn-north-1"
+ },
+ "hostname" : "savingsplans.cn-north-1.amazonaws.com.cn"
+ },
+ "cn-northwest-1" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "hostname" : "savingsplans.cn-northwest-1.amazonaws.com.cn"
+ }
+ },
+ "isRegionalized" : true
+ },
+ "schemas" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "secretsmanager" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "securityhub" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "serverlessrepo" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : {
+ "protocols" : [ "https" ]
+ },
+ "cn-northwest-1" : {
+ "protocols" : [ "https" ]
+ }
+ }
+ },
+ "servicecatalog" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "servicediscovery" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "servicequotas" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "signer" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { },
+ "verification-cn-north-1" : {
+ "credentialScope" : {
+ "region" : "cn-north-1"
+ },
+ "hostname" : "verification.signer.cn-north-1.amazonaws.com.cn"
+ },
+ "verification-cn-northwest-1" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "hostname" : "verification.signer.cn-northwest-1.amazonaws.com.cn"
+ }
+ }
+ },
+ "sms" : {
+ "endpoints" : {
+ "cn-north-1" : { }
+ }
+ },
+ "snowball" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.cn-north-1.amazonaws.com.cn",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.cn-northwest-1.amazonaws.com.cn",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "fips-cn-north-1" : {
+ "credentialScope" : {
+ "region" : "cn-north-1"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.cn-north-1.amazonaws.com.cn"
+ },
+ "fips-cn-northwest-1" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.cn-northwest-1.amazonaws.com.cn"
+ }
+ }
+ },
+ "sns" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "sns.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "sns.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "sqs" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ],
+ "sslCommonName" : "{region}.queue.{dnsSuffix}"
+ },
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "ssm" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "sso" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "states" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "states.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "states.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "storagegateway" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "streams.dynamodb" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "dynamodb"
+ },
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "sts" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "support" : {
+ "endpoints" : {
+ "aws-cn-global" : {
+ "credentialScope" : {
+ "region" : "cn-north-1"
+ },
+ "hostname" : "support.cn-north-1.amazonaws.com.cn"
+ }
+ },
+ "partitionEndpoint" : "aws-cn-global"
+ },
+ "swf" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "synthetics" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "tagging" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "transcribe" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "cn-north-1" : {
+ "credentialScope" : {
+ "region" : "cn-north-1"
+ },
+ "hostname" : "cn.transcribe.cn-north-1.amazonaws.com.cn",
+ "variants" : [ {
+ "hostname" : "transcribe.cn-north-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "hostname" : "cn.transcribe.cn-northwest-1.amazonaws.com.cn",
+ "variants" : [ {
+ "hostname" : "transcribe.cn-northwest-1.api.amazonwebservices.com.cn",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "transcribestreaming" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "transfer" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ },
+ "waf-regional" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "credentialScope" : {
+ "region" : "cn-north-1"
+ },
+ "hostname" : "waf-regional.cn-north-1.amazonaws.com.cn",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.cn-north-1.amazonaws.com.cn",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "hostname" : "waf-regional.cn-northwest-1.amazonaws.com.cn",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.cn-northwest-1.amazonaws.com.cn",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "fips-cn-north-1" : {
+ "credentialScope" : {
+ "region" : "cn-north-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.cn-north-1.amazonaws.com.cn"
+ },
+ "fips-cn-northwest-1" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.cn-northwest-1.amazonaws.com.cn"
+ }
+ }
+ },
+ "wafv2" : {
+ "endpoints" : {
+ "cn-north-1" : {
+ "credentialScope" : {
+ "region" : "cn-north-1"
+ },
+ "hostname" : "wafv2.cn-north-1.amazonaws.com.cn",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.cn-north-1.amazonaws.com.cn",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "cn-northwest-1" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "hostname" : "wafv2.cn-northwest-1.amazonaws.com.cn",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.cn-northwest-1.amazonaws.com.cn",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "fips-cn-north-1" : {
+ "credentialScope" : {
+ "region" : "cn-north-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.cn-north-1.amazonaws.com.cn"
+ },
+ "fips-cn-northwest-1" : {
+ "credentialScope" : {
+ "region" : "cn-northwest-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.cn-northwest-1.amazonaws.com.cn"
+ }
+ }
+ },
+ "workspaces" : {
+ "endpoints" : {
+ "cn-northwest-1" : { }
+ }
+ },
+ "xray" : {
+ "endpoints" : {
+ "cn-north-1" : { },
+ "cn-northwest-1" : { }
+ }
+ }
+ }
+ }, {
+ "defaults" : {
+ "hostname" : "{service}.{region}.{dnsSuffix}",
+ "protocols" : [ "https" ],
+ "signatureVersions" : [ "v4" ],
+ "variants" : [ {
+ "dnsSuffix" : "amazonaws.com",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ }, {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "{service}.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "dnsSuffix" : "amazonaws.com",
+ "partition" : "aws-us-gov",
+ "partitionName" : "AWS GovCloud (US)",
+ "regionRegex" : "^us\\-gov\\-\\w+\\-\\d+$",
+ "regions" : {
+ "us-gov-east-1" : {
+ "description" : "AWS GovCloud (US-East)"
+ },
+ "us-gov-west-1" : {
+ "description" : "AWS GovCloud (US-West)"
+ }
+ },
+ "services" : {
+ "access-analyzer" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "access-analyzer.us-gov-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "access-analyzer.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "access-analyzer.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "access-analyzer.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "access-analyzer.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "access-analyzer.us-gov-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "access-analyzer.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "access-analyzer.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "access-analyzer.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "access-analyzer.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "acm" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "acm.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "acm.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "acm.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "acm-pca" : {
+ "defaults" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "acm-pca.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "acm-pca.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "acm-pca.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "acm-pca.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "acm-pca.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "aoss" : {
+ "endpoints" : {
+ "us-gov-east-1" : { },
+ "us-gov-west-1" : { }
+ }
+ },
+ "api.detective" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "api.detective-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "detective-fips.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "detective.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api.detective-fips.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "api.detective-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "detective-fips.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "detective.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api.detective-fips.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "api.ecr" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "ecr-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "dkr-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "ecr-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "dkr-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "ecr-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "fips-dkr-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ecr-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-dkr-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ecr-fips.us-gov-west-1.amazonaws.com"
+ },
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ecr-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ecr-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "api.ecr.us-gov-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ecr-fips.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "ecr.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "api.ecr.us-gov-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ecr-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ecr-fips.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "ecr.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "api.sagemaker" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "api-fips.sagemaker.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "api-fips.sagemaker.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api-fips.sagemaker.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "api-fips.sagemaker.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api-fips.sagemaker.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-west-1-fips-secondary" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api.sagemaker.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-west-1-secondary" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "api.sagemaker.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "api.tunneling.iot" : {
+ "defaults" : {
+ "variants" : [ {
+ "dnsSuffix" : "amazonaws.com",
+ "hostname" : "api.tunneling.iot-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ }, {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "api.iot-tunneling-fips.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "api.iot-tunneling.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api.tunneling.iot-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api.tunneling.iot-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling-fips.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "api.iot-tunneling.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "api.tunneling.iot-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "api.iot-tunneling-fips.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "api.iot-tunneling.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "api.tunneling.iot-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "apigateway" : {
+ "endpoints" : {
+ "us-gov-east-1" : { },
+ "us-gov-west-1" : { }
+ }
+ },
+ "appconfig" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "appconfig.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "appconfig.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "appconfig.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "appconfig.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "appconfigdata" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "appconfigdata.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "appconfigdata.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "appconfigdata.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "appconfigdata.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "application-autoscaling" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "hostname" : "application-autoscaling.us-gov-east-1.amazonaws.com",
+ "protocols" : [ "http", "https" ],
+ "variants" : [ {
+ "hostname" : "application-autoscaling.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "deprecated" : true,
+ "hostname" : "application-autoscaling.us-gov-east-1.amazonaws.com",
+ "protocols" : [ "http", "https" ]
+ },
+ "us-gov-west-1" : {
+ "hostname" : "application-autoscaling.us-gov-west-1.amazonaws.com",
+ "protocols" : [ "http", "https" ],
+ "variants" : [ {
+ "hostname" : "application-autoscaling.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "deprecated" : true,
+ "hostname" : "application-autoscaling.us-gov-west-1.amazonaws.com",
+ "protocols" : [ "http", "https" ]
+ }
+ }
+ },
+ "applicationinsights" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "applicationinsights.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "applicationinsights.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "appstream2" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "appstream"
+ },
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "appstream2-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "appstream2-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "appstream2-fips.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "appstream2-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "appstream2-fips.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "arc-zonal-shift" : {
+ "endpoints" : {
+ "us-gov-east-1" : { },
+ "us-gov-west-1" : { }
+ }
+ },
+ "athena" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "athena-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "athena-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "athena-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "athena-fips.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "athena.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "athena-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "athena-fips.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "athena.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "autoscaling" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "autoscaling.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "us-gov-west-1" : {
+ "protocols" : [ "http", "https" ]
+ }
+ }
+ },
+ "autoscaling-plans" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "autoscaling-plans.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "deprecated" : true,
+ "hostname" : "autoscaling-plans.us-gov-east-1.amazonaws.com",
+ "protocols" : [ "http", "https" ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "autoscaling-plans.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "deprecated" : true,
+ "hostname" : "autoscaling-plans.us-gov-west-1.amazonaws.com",
+ "protocols" : [ "http", "https" ]
+ }
+ }
+ },
+ "backup" : {
+ "endpoints" : {
+ "us-gov-east-1" : { },
+ "us-gov-west-1" : { }
+ }
+ },
+ "backup-gateway" : {
+ "endpoints" : {
+ "us-gov-east-1" : { },
+ "us-gov-west-1" : { }
+ }
+ },
+ "batch" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "batch.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "batch.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "batch.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "batch.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "batch.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "bedrock" : {
+ "endpoints" : {
+ "bedrock-fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "bedrock-fips.us-gov-east-1.amazonaws.com"
+ },
+ "bedrock-fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "bedrock-fips.us-gov-west-1.amazonaws.com"
+ },
+ "bedrock-runtime-fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "bedrock-runtime-fips.us-gov-east-1.amazonaws.com"
+ },
+ "bedrock-runtime-fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "bedrock-runtime-fips.us-gov-west-1.amazonaws.com"
+ },
+ "bedrock-runtime-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "bedrock-runtime.us-gov-east-1.amazonaws.com"
+ },
+ "bedrock-runtime-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "bedrock-runtime.us-gov-west-1.amazonaws.com"
+ },
+ "bedrock-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "bedrock.us-gov-east-1.amazonaws.com"
+ },
+ "bedrock-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "bedrock.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : { },
+ "us-gov-west-1" : { }
+ }
+ },
+ "cassandra" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "cassandra.us-gov-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "cassandra.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cassandra.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "cassandra.us-gov-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "cassandra.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cassandra.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "cloudcontrolapi" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudcontrolapi-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudcontrolapi-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cloudcontrolapi-fips.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "cloudcontrolapi.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "cloudcontrolapi-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cloudcontrolapi-fips.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "cloudcontrolapi.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "clouddirectory" : {
+ "endpoints" : {
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "clouddirectory.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "clouddirectory.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "cloudformation" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "cloudformation.us-gov-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "cloudformation.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudformation.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "cloudformation.us-gov-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "cloudformation.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudformation.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "cloudhsm" : {
+ "endpoints" : {
+ "us-gov-west-1" : { }
+ }
+ },
+ "cloudhsmv2" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "cloudhsm"
+ }
+ },
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "cloudhsmv2.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "cloudtrail" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "cloudtrail.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudtrail.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudtrail.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "cloudtrail.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "cloudtrail.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "codebuild" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "codebuild-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "codebuild-fips.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "codebuild-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "codebuild-fips.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "codecommit" : {
+ "endpoints" : {
+ "fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "codecommit-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "codecommit-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "codecommit-fips.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "codecommit-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "codecommit-fips.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "codedeploy" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "codedeploy-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "codedeploy-fips.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "codedeploy-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "codedeploy-fips.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "codepipeline" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "codepipeline-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "codepipeline-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "codepipeline-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "codepipeline-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "codestar-connections" : {
+ "endpoints" : {
+ "us-gov-east-1" : { }
+ }
+ },
+ "cognito-identity" : {
+ "endpoints" : {
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cognito-identity-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity.us-gov-east-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-identity-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "cognito-identity-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cognito-identity.us-gov-west-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "cognito-idp" : {
+ "endpoints" : {
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cognito-idp-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp.us-gov-east-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "cognito-idp-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "cognito-idp-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "cognito-idp.us-gov-west-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "comprehend" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "comprehend-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "comprehend-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "comprehendmedical" : {
+ "endpoints" : {
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "comprehendmedical-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "comprehendmedical-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "compute-optimizer" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "compute-optimizer-fips.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "compute-optimizer-fips.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "config" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "config.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "config.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "config.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "config.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "config.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "connect" : {
+ "endpoints" : {
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "connect.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "connect.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "controltower" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "controltower-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "controltower-fips.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "controltower-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "controltower-fips.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "data-ats.iot" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "iotdata"
+ },
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "service" : "iotdata"
+ },
+ "deprecated" : true,
+ "hostname" : "data.iot-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "service" : "iotdata"
+ },
+ "deprecated" : true,
+ "hostname" : "data.iot-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "data.iot-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "data.iot-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "data.iot" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "iotdata"
+ },
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "service" : "iotdata"
+ },
+ "deprecated" : true,
+ "hostname" : "data.iot-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "service" : "iotdata"
+ },
+ "deprecated" : true,
+ "hostname" : "data.iot-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "data.iot-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "data.iot-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "data.jobs.iot" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "data.jobs.iot-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "data.jobs.iot-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "data.jobs.iot-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "data.jobs.iot-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "databrew" : {
+ "endpoints" : {
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "databrew.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "databrew.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "datasync" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "datasync-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "datasync-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "datasync-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "datasync-fips.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "datasync.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "datasync-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "datasync-fips.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "datasync.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "datazone" : {
+ "defaults" : {
+ "dnsSuffix" : "api.aws",
+ "variants" : [ {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "hostname" : "datazone.us-gov-east-1.api.aws"
+ },
+ "us-gov-west-1" : {
+ "hostname" : "datazone.us-gov-west-1.api.aws"
+ }
+ }
+ },
+ "directconnect" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "directconnect-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "directconnect-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "directconnect-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "directconnect-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "dlm" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "dlm-fips.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "dlm.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "dlm.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dlm.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "dlm-fips.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "dlm.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "dlm.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dlm.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "dms" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "dms.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "dms" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "dms.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "dms-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dms.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "dms.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dms.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "dms.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dms.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "docdb" : {
+ "endpoints" : {
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "rds.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "drs" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "drs-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "drs-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "drs-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "drs-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "ds" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ds-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ds-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "ds-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "ds-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "dynamodb" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "dynamodb.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "dynamodb-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dynamodb-fips.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "dynamodb-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dynamodb-fips.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "ebs" : {
+ "endpoints" : {
+ "us-gov-east-1" : { },
+ "us-gov-west-1" : { }
+ }
+ },
+ "ec2" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "ec2.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "ec2.us-gov-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ec2.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "ec2.us-gov-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "ec2.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "ecs" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ecs-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ecs-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "ecs-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "ecs-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "eks" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ],
+ "variants" : [ {
+ "hostname" : "eks.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "eks.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "eks.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "eks.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "eks.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "eks-auth" : {
+ "defaults" : {
+ "dnsSuffix" : "api.aws",
+ "variants" : [ {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "hostname" : "eks-auth.us-gov-east-1.api.aws"
+ },
+ "us-gov-west-1" : {
+ "hostname" : "eks-auth.us-gov-west-1.api.aws"
+ }
+ }
+ },
+ "elasticache" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "elasticache.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticache.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : { },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "elasticache.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticache.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "elasticbeanstalk" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "elasticbeanstalk.us-gov-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "elasticbeanstalk.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticbeanstalk.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "elasticbeanstalk.us-gov-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "elasticbeanstalk.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "elasticbeanstalk.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticbeanstalk.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "elasticfilesystem" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "elasticloadbalancing" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "elasticloadbalancing.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticloadbalancing.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticloadbalancing.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "elasticloadbalancing.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "protocols" : [ "http", "https" ],
+ "variants" : [ {
+ "hostname" : "elasticloadbalancing.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "elasticmapreduce" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "elasticmapreduce.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticmapreduce.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticmapreduce.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "elasticmapreduce.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "elasticmapreduce.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "elasticmapreduce.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "elasticmapreduce.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "email" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "email-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "email-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "email-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "email-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "emr-containers" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "emr-containers.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "emr-containers.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "emr-containers.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "emr-containers.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "emr-serverless" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "emr-serverless.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "emr-serverless.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "emr-serverless.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "emr-serverless.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "es" : {
+ "endpoints" : {
+ "fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "es-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "aos.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "es-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "es-fips.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "aos.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "es-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "es-fips.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "events" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "events.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "events.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "events.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "events.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "firehose" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "firehose-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "firehose-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "firehose-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "firehose-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "fms" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fms-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "fms-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "fsx" : {
+ "endpoints" : {
+ "fips-prod-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fsx-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-prod-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fsx-fips.us-gov-west-1.amazonaws.com"
+ },
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fsx-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fsx-fips.us-gov-west-1.amazonaws.com"
+ },
+ "prod-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "fsx-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "prod-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "fsx-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "fsx-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "fsx-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "gameliftstreams" : {
+ "defaults" : {
+ "dnsSuffix" : "api.aws",
+ "variants" : [ {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "hostname" : "gameliftstreams.us-gov-east-1.api.aws"
+ },
+ "us-gov-west-1" : {
+ "hostname" : "gameliftstreams.us-gov-west-1.api.aws"
+ }
+ }
+ },
+ "geo" : {
+ "endpoints" : {
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "geo-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "geo-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "glacier" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "glacier.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "glacier.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "glacier.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "protocols" : [ "http", "https" ],
+ "variants" : [ {
+ "hostname" : "glacier.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "glue" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "glue-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "glue-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "glue-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "glue-fips.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "glue.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "glue-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "glue-fips.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "glue.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "greengrass" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "dataplane-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "greengrass-ats.iot.us-gov-east-1.amazonaws.com"
+ },
+ "dataplane-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "greengrass-ats.iot.us-gov-west-1.amazonaws.com"
+ },
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "greengrass.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "greengrass.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "greengrass.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "greengrass.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ },
+ "isRegionalized" : true
+ },
+ "guardduty" : {
+ "defaults" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "guardduty.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "guardduty.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "guardduty.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "guardduty.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "guardduty.us-gov-west-1.amazonaws.com"
+ }
+ },
+ "isRegionalized" : true
+ },
+ "health" : {
+ "defaults" : {
+ "protocols" : [ "https" ],
+ "sslCommonName" : "health.us-gov-west-1.amazonaws.com"
+ },
+ "endpoints" : {
+ "aws-us-gov-global" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "global.health.us-gov.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "health-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "health-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "iam" : {
+ "endpoints" : {
+ "aws-us-gov-global" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "iam.us-gov.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "iam.us-gov.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "aws-us-gov-global-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "iam.us-gov.amazonaws.com"
+ },
+ "iam-govcloud" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "iam.us-gov.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "iam-govcloud-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "iam.us-gov.amazonaws.com"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-us-gov-global"
+ },
+ "identitystore" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "identitystore.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "identitystore.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "identitystore.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "identitystore.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "identitystore.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "ingest.timestream" : {
+ "endpoints" : {
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "ingest.timestream.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ingest.timestream.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "inspector" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "inspector-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "inspector-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "inspector-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "inspector-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "inspector2" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "inspector2-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "inspector2-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "inspector2-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "inspector2-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "internetmonitor" : {
+ "defaults" : {
+ "dnsSuffix" : "api.aws",
+ "variants" : [ {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "hostname" : "internetmonitor.us-gov-east-1.api.aws"
+ },
+ "us-gov-west-1" : {
+ "hostname" : "internetmonitor.us-gov-west-1.api.aws"
+ }
+ }
+ },
+ "iot" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "deprecated" : true,
+ "hostname" : "iot-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "deprecated" : true,
+ "hostname" : "iot-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "iot-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "iot-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "iotevents" : {
+ "endpoints" : {
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "iotevents-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "iotevents-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "ioteventsdata" : {
+ "endpoints" : {
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "data.iotevents-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "data.iotevents.us-gov-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "data.iotevents-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "iotsecuredtunneling" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "api.tunneling.iot-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api.tunneling.iot-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "api.tunneling.iot-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "api.tunneling.iot-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "api.tunneling.iot-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "iotsitewise" : {
+ "endpoints" : {
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "iotsitewise-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "iotsitewise-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "iottwinmaker" : {
+ "endpoints" : {
+ "api-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "api.iottwinmaker.us-gov-west-1.amazonaws.com"
+ },
+ "data-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "data.iottwinmaker.us-gov-west-1.amazonaws.com"
+ },
+ "fips-api-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "api.iottwinmaker-fips.us-gov-west-1.amazonaws.com"
+ },
+ "fips-data-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "data.iottwinmaker-fips.us-gov-west-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "iottwinmaker-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "iottwinmaker-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "kafka" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "kafka.us-gov-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "kafka.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kafka.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "kafka.us-gov-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "kafka.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kafka.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "kendra" : {
+ "endpoints" : {
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kendra-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "kendra-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "kendra-ranking" : {
+ "defaults" : {
+ "dnsSuffix" : "api.aws",
+ "variants" : [ {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "hostname" : "kendra-ranking.us-gov-east-1.api.aws"
+ },
+ "us-gov-west-1" : {
+ "hostname" : "kendra-ranking.us-gov-west-1.api.aws"
+ }
+ }
+ },
+ "kinesis" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kinesis.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kinesis.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "kinesis.us-gov-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "kinesis.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "kinesis.us-gov-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "kinesis.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "kinesisanalytics" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kinesisanalytics-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kinesisanalytics-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "kinesisanalytics-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "kinesisanalytics-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "kinesisvideo" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kinesisvideo-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kinesisvideo-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "kinesisvideo-fips.us-gov-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "kinesisvideo-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "kinesisvideo-fips.us-gov-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "kinesisvideo-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "kms" : {
+ "endpoints" : {
+ "ProdFips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "lakeformation" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "lakeformation-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "lakeformation-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "lakeformation-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "lakeformation-fips.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "lakeformation.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "lakeformation-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "lakeformation-fips.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "lakeformation.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "lambda" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "lambda-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "lambda-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "lambda-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "lambda.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "lambda-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "lambda.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "license-manager" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "license-manager-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "license-manager-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "license-manager-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "license-manager-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "license-manager-linux-subscriptions" : {
+ "endpoints" : {
+ "us-gov-east-1" : { },
+ "us-gov-west-1" : { }
+ }
+ },
+ "license-manager-user-subscriptions" : {
+ "endpoints" : {
+ "us-gov-east-1" : { },
+ "us-gov-west-1" : { }
+ }
+ },
+ "logs" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "logs.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "logs.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "logs.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "logs.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "logs.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "logs.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "m2" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "deprecated" : true
+ },
+ "fips-us-gov-west-1" : {
+ "deprecated" : true
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "managedblockchain" : {
+ "endpoints" : {
+ "us-gov-west-1" : { }
+ }
+ },
+ "mediaconvert" : {
+ "endpoints" : {
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "mediaconvert.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "mediaconvert.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "mediaconvert.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "mediaconvert.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ }
+ }
+ },
+ "meetings-chime" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "meetings-chime-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "meetings-chime-fips.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "meetings-chime-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "meetings-chime-fips.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "memory-db" : {
+ "endpoints" : {
+ "us-gov-east-1" : { },
+ "us-gov-west-1" : { }
+ }
+ },
+ "metering.marketplace" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "aws-marketplace"
+ }
+ },
+ "endpoints" : {
+ "us-gov-east-1" : { },
+ "us-gov-west-1" : { }
+ }
+ },
+ "metrics.sagemaker" : {
+ "endpoints" : {
+ "us-gov-east-1" : { },
+ "us-gov-west-1" : { }
+ }
+ },
+ "mgn" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "mgn-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "mgn-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "mgn-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "mgn-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "models-v2-lex" : {
+ "endpoints" : {
+ "us-gov-west-1" : { }
+ }
+ },
+ "models.lex" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "lex"
+ },
+ "variants" : [ {
+ "hostname" : "models-fips.lex.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "models-fips.lex.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "models-fips.lex.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "monitoring" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "monitoring.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "monitoring.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "monitoring.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "monitoring.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "monitoring.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "mq" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "mq-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "mq-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "mq-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "mq-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "neptune" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "rds.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "rds.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "network-firewall" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "network-firewall-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "network-firewall-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "network-firewall-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "network-firewall-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "networkmanager" : {
+ "endpoints" : {
+ "aws-us-gov-global" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "networkmanager.us-gov-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "networkmanager.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "fips-aws-us-gov-global" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "networkmanager.us-gov-west-1.amazonaws.com"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-us-gov-global"
+ },
+ "notifications" : {
+ "defaults" : {
+ "dnsSuffix" : "api.aws",
+ "variants" : [ {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "hostname" : "notifications.us-gov-east-1.api.aws"
+ },
+ "us-gov-west-1" : {
+ "hostname" : "notifications.us-gov-west-1.api.aws"
+ }
+ }
+ },
+ "oam" : {
+ "endpoints" : {
+ "us-gov-east-1" : { },
+ "us-gov-west-1" : { }
+ }
+ },
+ "oidc" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "oidc.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "oidc.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "organizations" : {
+ "endpoints" : {
+ "aws-us-gov-global" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "organizations.us-gov-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "organizations.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "fips-aws-us-gov-global" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "organizations.us-gov-west-1.amazonaws.com"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-us-gov-global"
+ },
+ "outposts" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "outposts.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "outposts.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "outposts.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "outposts.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "participant.connect" : {
+ "endpoints" : {
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "participant.connect.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "participant.connect.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "pi" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "pi-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "pi-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "pi-fips.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "pi.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "pi-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "pi-fips.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "pi.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "pinpoint" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "mobiletargeting"
+ }
+ },
+ "endpoints" : {
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "pinpoint-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "pinpoint.us-gov-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "pinpoint-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "polly" : {
+ "endpoints" : {
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "polly-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "polly-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "polly-fips.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "polly.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "portal.sso" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "portal.sso.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "portal.sso.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "qbusiness" : {
+ "defaults" : {
+ "dnsSuffix" : "api.aws",
+ "variants" : [ {
+ "dnsSuffix" : "api.aws",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "hostname" : "qbusiness.us-gov-east-1.api.aws"
+ },
+ "us-gov-west-1" : {
+ "hostname" : "qbusiness.us-gov-west-1.api.aws"
+ }
+ }
+ },
+ "quicksight" : {
+ "endpoints" : {
+ "us-gov-east-1" : { },
+ "us-gov-west-1" : { }
+ }
+ },
+ "ram" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "ram.us-gov-east-1.amazonaws.com",
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "ram.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ramus-gov-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ram.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "ram.us-gov-west-1.amazonaws.com",
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "hostname" : "ram.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "ramus-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ram.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "rbin" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rbin-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rbin-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "rbin-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "rbin-fips.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "rbin.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "rbin-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "rbin-fips.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "rbin.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "rds" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "rds.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "rds.us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rds.us-gov-east-1.amazonaws.com"
+ },
+ "rds.us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rds.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "rds.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rds.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "rds.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rds.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "redshift" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "redshift.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "redshift.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "redshift-serverless" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "redshift-serverless-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "redshift-serverless-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "redshift-serverless-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "redshift-serverless-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "rekognition" : {
+ "endpoints" : {
+ "rekognition-fips.us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rekognition-fips.us-gov-west-1.amazonaws.com"
+ },
+ "rekognition.us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "rekognition-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "rekognition-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rekognition-fips.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "resiliencehub" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "resiliencehub-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "resiliencehub-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "resiliencehub-fips.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "resiliencehub.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "resiliencehub-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "resiliencehub-fips.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "resiliencehub.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "resource-groups" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "resource-groups.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "resource-groups.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "resource-groups.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "resource-groups.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "resource-groups.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "robomaker" : {
+ "endpoints" : {
+ "us-gov-west-1" : { }
+ }
+ },
+ "rolesanywhere" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rolesanywhere-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rolesanywhere-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "rolesanywhere-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "rolesanywhere-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "route53" : {
+ "endpoints" : {
+ "aws-us-gov-global" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "route53.us-gov.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "route53.us-gov.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "fips-aws-us-gov-global" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "route53.us-gov.amazonaws.com"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-us-gov-global"
+ },
+ "route53profiles" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "route53profiles-fips.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "route53profiles.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "route53profiles-fips.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "route53profiles.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "route53resolver" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "route53resolver.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "deprecated" : true,
+ "hostname" : "route53resolver.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "route53resolver.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "deprecated" : true,
+ "hostname" : "route53resolver.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "runtime-v2-lex" : {
+ "endpoints" : {
+ "us-gov-west-1" : { }
+ }
+ },
+ "runtime.lex" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "lex"
+ },
+ "variants" : [ {
+ "hostname" : "runtime-fips.lex.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "runtime-fips.lex.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "runtime-fips.lex.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "runtime.sagemaker" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "runtime.sagemaker.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : { },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "runtime.sagemaker.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "runtime.sagemaker.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "s3" : {
+ "defaults" : {
+ "signatureVersions" : [ "s3", "s3v4" ],
+ "variants" : [ {
+ "dnsSuffix" : "amazonaws.com",
+ "hostname" : "{service}-fips.dualstack.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "dnsSuffix" : "amazonaws.com",
+ "hostname" : "{service}.dualstack.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "hostname" : "s3.us-gov-east-1.amazonaws.com",
+ "protocols" : [ "http", "https" ],
+ "variants" : [ {
+ "hostname" : "s3-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "s3.dualstack.us-gov-east-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "hostname" : "s3.us-gov-west-1.amazonaws.com",
+ "protocols" : [ "http", "https" ],
+ "variants" : [ {
+ "hostname" : "s3-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "s3.dualstack.us-gov-west-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "s3-control" : {
+ "defaults" : {
+ "protocols" : [ "https" ],
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "dnsSuffix" : "amazonaws.com",
+ "hostname" : "{service}-fips.dualstack.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "dnsSuffix" : "amazonaws.com",
+ "hostname" : "{service}.dualstack.{region}.{dnsSuffix}",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "s3-control.us-gov-east-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control-fips.dualstack.us-gov-east-1.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "s3-control-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "s3-control.dualstack.us-gov-east-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-control-fips.us-gov-east-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ]
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "s3-control.us-gov-west-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control-fips.dualstack.us-gov-west-1.amazonaws.com",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "s3-control-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "s3-control.dualstack.us-gov-west-1.amazonaws.com",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-control-fips.us-gov-west-1.amazonaws.com",
+ "signatureVersions" : [ "s3v4" ]
+ }
+ }
+ },
+ "s3-outposts" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "deprecated" : true
+ },
+ "fips-us-gov-west-1" : {
+ "deprecated" : true
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "schemas" : {
+ "endpoints" : {
+ "us-gov-east-1" : { },
+ "us-gov-west-1" : { }
+ }
+ },
+ "secretsmanager" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "deprecated" : true
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ }, {
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "deprecated" : true
+ }
+ }
+ },
+ "securityhub" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "securityhub-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "securityhub-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "securityhub-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "securityhub.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "securityhub-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "securityhub.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "securitylake" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "securitylake.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "securitylake.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "securitylake.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "securitylake.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "serverlessrepo" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "serverlessrepo.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "serverlessrepo.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "serverlessrepo.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "serverlessrepo.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "servicecatalog" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "servicecatalog-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "servicecatalog-fips.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "servicecatalog-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "servicecatalog-fips.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "servicecatalog-appregistry" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "servicecatalog-appregistry.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : { },
+ "us-gov-west-1" : { }
+ }
+ },
+ "servicediscovery" : {
+ "endpoints" : {
+ "servicediscovery" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "servicediscovery-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "servicediscovery-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "servicediscovery-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "servicediscovery-fips.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "servicediscovery.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "servicediscovery-fips.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "servicediscovery-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "servicediscovery-fips.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "servicediscovery.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "servicediscovery-fips.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "servicequotas" : {
+ "defaults" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "servicequotas.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "servicequotas.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "servicequotas.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "servicequotas.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "servicequotas.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "signer" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "signer-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "signer-fips.us-gov-west-1.amazonaws.com"
+ },
+ "fips-verification-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "verification.signer-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-verification-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "verification.signer-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "signer-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "signer-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "verification-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "verification.signer.us-gov-east-1.amazonaws.com"
+ },
+ "verification-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "verification.signer.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "simspaceweaver" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "simspaceweaver.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "simspaceweaver.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "simspaceweaver.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "simspaceweaver.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "sms" : {
+ "endpoints" : {
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sms-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "sms-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "sms-voice" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sms-voice-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sms-voice-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "sms-voice-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "sms-voice-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "snowball" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "snowball-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "snowball-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "snowball-fips.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "snowball.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "sns" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sns.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sns.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "sns.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "sns.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "sqs" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "sqs.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "sqs.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "sqs.us-gov-west-1.amazonaws.com",
+ "protocols" : [ "http", "https" ],
+ "sslCommonName" : "{region}.queue.{dnsSuffix}"
+ }
+ }
+ },
+ "ssm" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "ssm.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ssm.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "ssm.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "ssm.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "sso" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "sso.us-gov-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "sso.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sso.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "sso.us-gov-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "sso.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sso.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "states" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "states-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "states.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "states-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "states.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "storagegateway" : {
+ "endpoints" : {
+ "fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "storagegateway-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "storagegateway-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "storagegateway-fips.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "storagegateway-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "storagegateway-fips.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "streams.dynamodb" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "dynamodb"
+ },
+ "variants" : [ {
+ "hostname" : "streams.dynamodb.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : { },
+ "us-gov-west-1" : { }
+ }
+ },
+ "sts" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "sts.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "sts.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sts.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "sts.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "sts.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "support" : {
+ "endpoints" : {
+ "aws-us-gov-global" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "support.us-gov-west-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "support.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "support.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ },
+ "partitionEndpoint" : "aws-us-gov-global"
+ },
+ "swf" : {
+ "endpoints" : {
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "swf.us-gov-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "swf.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "swf.us-gov-east-1.amazonaws.com"
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "swf.us-gov-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "swf.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "swf.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "synthetics" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "synthetics-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "synthetics-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "synthetics-fips.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "synthetics.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "synthetics-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "synthetics-fips.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "synthetics.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "tagging" : {
+ "endpoints" : {
+ "us-gov-east-1" : { },
+ "us-gov-west-1" : { }
+ }
+ },
+ "textract" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "textract-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "textract-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "textract-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "textract-fips.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "textract.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "textract-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "textract-fips.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "textract.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "transcribe" : {
+ "defaults" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "fips.transcribe.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fips.transcribe.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fips.transcribe.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "fips.transcribe.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "transcribe-fips.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "transcribe.us-gov-east-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "fips.transcribe.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "transcribe-fips.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "transcribe.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "transcribestreaming" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "transcribestreaming-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "transcribestreaming-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "transcribestreaming-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "transcribestreaming-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "transfer" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "transfer-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "transfer-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "transfer-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "transfer-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "translate" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "translate-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "translate-fips.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "translate.us-gov-west-1.api.aws",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-gov-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "translate-fips.us-gov-west-1.amazonaws.com"
+ }
+ }
+ },
+ "verifiedpermissions" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "verifiedpermissions-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "verifiedpermissions-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "verifiedpermissions-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "verifiedpermissions-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "waf-regional" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "waf-regional-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "waf-regional.us-gov-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "waf-regional.us-gov-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "waf-regional-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "wafv2" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "wafv2-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "hostname" : "wafv2.us-gov-east-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "hostname" : "wafv2.us-gov-west-1.amazonaws.com",
+ "variants" : [ {
+ "hostname" : "wafv2-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "wellarchitected" : {
+ "endpoints" : {
+ "us-gov-east-1" : { },
+ "us-gov-west-1" : { }
+ }
+ },
+ "workspaces" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "workspaces-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "workspaces-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "workspaces-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "workspaces-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "xray" : {
+ "endpoints" : {
+ "fips-us-gov-east-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "xray-fips.us-gov-east-1.amazonaws.com"
+ },
+ "fips-us-gov-west-1" : {
+ "credentialScope" : {
+ "region" : "us-gov-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "xray-fips.us-gov-west-1.amazonaws.com"
+ },
+ "us-gov-east-1" : {
+ "variants" : [ {
+ "hostname" : "xray-fips.us-gov-east-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-gov-west-1" : {
+ "variants" : [ {
+ "hostname" : "xray-fips.us-gov-west-1.amazonaws.com",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ }
+ }
+ }, {
+ "defaults" : {
+ "hostname" : "{service}.{region}.{dnsSuffix}",
+ "protocols" : [ "https" ],
+ "signatureVersions" : [ "v4" ],
+ "variants" : [ {
+ "dnsSuffix" : "c2s.ic.gov",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "dnsSuffix" : "c2s.ic.gov",
+ "partition" : "aws-iso",
+ "partitionName" : "AWS ISO (US)",
+ "regionRegex" : "^us\\-iso\\-\\w+\\-\\d+$",
+ "regions" : {
+ "us-iso-east-1" : {
+ "description" : "US ISO East"
+ },
+ "us-iso-west-1" : {
+ "description" : "US ISO WEST"
+ }
+ },
+ "services" : {
+ "agreement-marketplace" : {
+ "endpoints" : {
+ "fips-us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "agreement-marketplace-fips.us-iso-east-1.c2s.ic.gov"
+ },
+ "us-iso-east-1" : {
+ "variants" : [ {
+ "hostname" : "agreement-marketplace-fips.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "api.ecr" : {
+ "endpoints" : {
+ "us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "hostname" : "api.ecr.us-iso-east-1.c2s.ic.gov"
+ },
+ "us-iso-west-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-west-1"
+ },
+ "hostname" : "api.ecr.us-iso-west-1.c2s.ic.gov"
+ }
+ }
+ },
+ "api.pricing" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "pricing"
+ }
+ },
+ "endpoints" : {
+ "us-iso-east-1" : { }
+ }
+ },
+ "api.sagemaker" : {
+ "endpoints" : {
+ "us-iso-east-1" : { }
+ }
+ },
+ "apigateway" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "appconfig" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "appconfigdata" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "application-autoscaling" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "arc-zonal-shift" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "athena" : {
+ "endpoints" : {
+ "us-iso-east-1" : { }
+ }
+ },
+ "autoscaling" : {
+ "endpoints" : {
+ "us-iso-east-1" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "us-iso-west-1" : { }
+ }
+ },
+ "bedrock" : {
+ "endpoints" : {
+ "bedrock-runtime-us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "hostname" : "bedrock-runtime.us-iso-east-1.c2s.ic.gov"
+ },
+ "bedrock-us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "hostname" : "bedrock.us-iso-east-1.c2s.ic.gov"
+ },
+ "us-iso-east-1" : { }
+ }
+ },
+ "budgets" : {
+ "endpoints" : {
+ "aws-iso-global" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "hostname" : "budgets.c2s.ic.gov"
+ },
+ "us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "hostname" : "budgets.c2s.ic.gov"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-iso-global"
+ },
+ "ce" : {
+ "endpoints" : {
+ "aws-iso-global" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "hostname" : "ce.us-iso-east-1.c2s.ic.gov"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-iso-global"
+ },
+ "cloudcontrolapi" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "cloudformation" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "cloudtrail" : {
+ "endpoints" : {
+ "fips-us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudtrail-fips.us-iso-east-1.c2s.ic.gov"
+ },
+ "fips-us-iso-west-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudtrail-fips.us-iso-west-1.c2s.ic.gov"
+ },
+ "us-iso-east-1" : {
+ "variants" : [ {
+ "hostname" : "cloudtrail-fips.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-iso-west-1" : {
+ "variants" : [ {
+ "hostname" : "cloudtrail-fips.us-iso-west-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "codebuild" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "codedeploy" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "comprehend" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "fips-us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "comprehend-fips.us-iso-east-1.c2s.ic.gov"
+ },
+ "us-iso-east-1" : {
+ "variants" : [ {
+ "hostname" : "comprehend-fips.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "config" : {
+ "endpoints" : {
+ "fips-us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "config-fips.us-iso-east-1.c2s.ic.gov"
+ },
+ "fips-us-iso-west-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "config-fips.us-iso-west-1.c2s.ic.gov"
+ },
+ "us-iso-east-1" : {
+ "variants" : [ {
+ "hostname" : "config-fips.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-iso-west-1" : {
+ "variants" : [ {
+ "hostname" : "config-fips.us-iso-west-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "datapipeline" : {
+ "endpoints" : {
+ "us-iso-east-1" : { }
+ }
+ },
+ "datasync" : {
+ "endpoints" : {
+ "fips-us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "datasync-fips.us-iso-east-1.c2s.ic.gov"
+ },
+ "fips-us-iso-west-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "datasync-fips.us-iso-west-1.c2s.ic.gov"
+ },
+ "us-iso-east-1" : {
+ "variants" : [ {
+ "hostname" : "datasync-fips.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-iso-west-1" : {
+ "variants" : [ {
+ "hostname" : "datasync-fips.us-iso-west-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "directconnect" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "dlm" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "dms" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "dms.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "dms" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "dms.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "dms-fips" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dms.us-iso-east-1.c2s.ic.gov"
+ },
+ "us-iso-east-1" : {
+ "variants" : [ {
+ "hostname" : "dms.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-iso-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dms.us-iso-east-1.c2s.ic.gov"
+ },
+ "us-iso-west-1" : {
+ "variants" : [ {
+ "hostname" : "dms.us-iso-west-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-iso-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-iso-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dms.us-iso-west-1.c2s.ic.gov"
+ }
+ }
+ },
+ "ds" : {
+ "endpoints" : {
+ "fips-us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ds-fips.us-iso-east-1.c2s.ic.gov"
+ },
+ "fips-us-iso-west-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ds-fips.us-iso-west-1.c2s.ic.gov"
+ },
+ "us-iso-east-1" : {
+ "variants" : [ {
+ "hostname" : "ds-fips.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-iso-west-1" : {
+ "variants" : [ {
+ "hostname" : "ds-fips.us-iso-west-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "dynamodb" : {
+ "endpoints" : {
+ "us-iso-east-1" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "us-iso-west-1" : { }
+ }
+ },
+ "ebs" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "ec2" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "ecs" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "eks" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "elasticache" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "elasticfilesystem" : {
+ "endpoints" : {
+ "fips-us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.us-iso-east-1.c2s.ic.gov"
+ },
+ "fips-us-iso-west-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.us-iso-west-1.c2s.ic.gov"
+ },
+ "us-iso-east-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-iso-west-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.us-iso-west-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "elasticloadbalancing" : {
+ "endpoints" : {
+ "us-iso-east-1" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "us-iso-west-1" : { }
+ }
+ },
+ "elasticmapreduce" : {
+ "endpoints" : {
+ "fips-us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticmapreduce.us-iso-east-1.c2s.ic.gov"
+ },
+ "fips-us-iso-west-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticmapreduce.us-iso-west-1.c2s.ic.gov"
+ },
+ "us-iso-east-1" : {
+ "protocols" : [ "https" ],
+ "variants" : [ {
+ "hostname" : "elasticmapreduce.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-iso-west-1" : {
+ "variants" : [ {
+ "hostname" : "elasticmapreduce.us-iso-west-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "es" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "events" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "firehose" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "fsx" : {
+ "endpoints" : {
+ "fips-prod-us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fsx-fips.us-iso-east-1.c2s.ic.gov"
+ },
+ "fips-us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fsx-fips.us-iso-east-1.c2s.ic.gov"
+ },
+ "prod-us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "fsx-fips.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-iso-east-1" : {
+ "variants" : [ {
+ "hostname" : "fsx-fips.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "glacier" : {
+ "endpoints" : {
+ "us-iso-east-1" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "us-iso-west-1" : { }
+ }
+ },
+ "glue" : {
+ "endpoints" : {
+ "us-iso-east-1" : { }
+ }
+ },
+ "guardduty" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "us-iso-east-1" : { }
+ },
+ "isRegionalized" : true
+ },
+ "health" : {
+ "endpoints" : {
+ "us-iso-east-1" : { }
+ }
+ },
+ "iam" : {
+ "endpoints" : {
+ "aws-iso-global" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "hostname" : "iam.us-iso-east-1.c2s.ic.gov"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-iso-global"
+ },
+ "kinesis" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "kms" : {
+ "endpoints" : {
+ "ProdFips" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.us-iso-east-1.c2s.ic.gov"
+ },
+ "us-iso-east-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-iso-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.us-iso-east-1.c2s.ic.gov"
+ },
+ "us-iso-west-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.us-iso-west-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-iso-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-iso-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.us-iso-west-1.c2s.ic.gov"
+ }
+ }
+ },
+ "lambda" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "license-manager" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "logs" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "medialive" : {
+ "endpoints" : {
+ "fips-us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "medialive-fips.us-iso-east-1.c2s.ic.gov"
+ },
+ "us-iso-east-1" : {
+ "variants" : [ {
+ "hostname" : "medialive-fips.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "mediapackage" : {
+ "endpoints" : {
+ "us-iso-east-1" : { }
+ }
+ },
+ "metrics.sagemaker" : {
+ "endpoints" : {
+ "us-iso-east-1" : { }
+ }
+ },
+ "monitoring" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "oam" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "organizations" : {
+ "endpoints" : {
+ "aws-iso-global" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "hostname" : "organizations.us-iso-east-1.c2s.ic.gov"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-iso-global"
+ },
+ "outposts" : {
+ "endpoints" : {
+ "us-iso-east-1" : { }
+ }
+ },
+ "pi" : {
+ "endpoints" : {
+ "us-iso-east-1" : {
+ "protocols" : [ "https" ]
+ },
+ "us-iso-west-1" : {
+ "protocols" : [ "https" ]
+ }
+ }
+ },
+ "ram" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "rbin" : {
+ "endpoints" : {
+ "fips-us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rbin-fips.us-iso-east-1.c2s.ic.gov"
+ },
+ "fips-us-iso-west-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rbin-fips.us-iso-west-1.c2s.ic.gov"
+ },
+ "us-iso-east-1" : {
+ "variants" : [ {
+ "hostname" : "rbin-fips.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-iso-west-1" : {
+ "variants" : [ {
+ "hostname" : "rbin-fips.us-iso-west-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "rds" : {
+ "endpoints" : {
+ "rds.us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rds.us-iso-east-1.c2s.ic.gov"
+ },
+ "rds.us-iso-west-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rds.us-iso-west-1.c2s.ic.gov"
+ },
+ "us-iso-east-1" : {
+ "variants" : [ {
+ "hostname" : "rds.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-iso-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rds.us-iso-east-1.c2s.ic.gov"
+ },
+ "us-iso-west-1" : {
+ "variants" : [ {
+ "hostname" : "rds.us-iso-west-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-iso-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-iso-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rds.us-iso-west-1.c2s.ic.gov"
+ }
+ }
+ },
+ "redshift" : {
+ "endpoints" : {
+ "us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "hostname" : "redshift.us-iso-east-1.c2s.ic.gov"
+ },
+ "us-iso-west-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-west-1"
+ },
+ "hostname" : "redshift.us-iso-west-1.c2s.ic.gov"
+ }
+ }
+ },
+ "resource-groups" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "route53" : {
+ "endpoints" : {
+ "aws-iso-global" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "hostname" : "route53.c2s.ic.gov"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-iso-global"
+ },
+ "route53resolver" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "runtime.sagemaker" : {
+ "endpoints" : {
+ "us-iso-east-1" : { }
+ }
+ },
+ "s3" : {
+ "defaults" : {
+ "signatureVersions" : [ "s3v4" ]
+ },
+ "endpoints" : {
+ "fips-us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-fips.us-iso-east-1.c2s.ic.gov"
+ },
+ "fips-us-iso-west-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-fips.us-iso-west-1.c2s.ic.gov"
+ },
+ "us-iso-east-1" : {
+ "protocols" : [ "http", "https" ],
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-fips.dualstack.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "s3-fips.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-iso-west-1" : {
+ "variants" : [ {
+ "hostname" : "s3-fips.dualstack.us-iso-west-1.c2s.ic.gov",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "s3-fips.us-iso-west-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "s3-control" : {
+ "defaults" : {
+ "protocols" : [ "https" ],
+ "signatureVersions" : [ "s3v4" ]
+ },
+ "endpoints" : {
+ "us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "hostname" : "s3-control.us-iso-east-1.c2s.ic.gov",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control-fips.dualstack.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "s3-control-fips.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "s3-control.dualstack.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-iso-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-control-fips.us-iso-east-1.c2s.ic.gov",
+ "signatureVersions" : [ "s3v4" ]
+ },
+ "us-iso-west-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-west-1"
+ },
+ "hostname" : "s3-control.us-iso-west-1.c2s.ic.gov",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control-fips.dualstack.us-iso-west-1.c2s.ic.gov",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "s3-control-fips.us-iso-west-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "s3-control.dualstack.us-iso-west-1.c2s.ic.gov",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-iso-west-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-iso-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-control-fips.us-iso-west-1.c2s.ic.gov",
+ "signatureVersions" : [ "s3v4" ]
+ }
+ }
+ },
+ "s3-outposts" : {
+ "endpoints" : {
+ "fips-us-iso-east-1" : {
+ "deprecated" : true
+ },
+ "us-iso-east-1" : {
+ "variants" : [ {
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "scheduler" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "secretsmanager" : {
+ "endpoints" : {
+ "us-iso-east-1" : {
+ "variants" : [ {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-iso-east-1-fips" : {
+ "deprecated" : true
+ },
+ "us-iso-west-1" : {
+ "variants" : [ {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-iso-west-1-fips" : {
+ "deprecated" : true
+ }
+ }
+ },
+ "snowball" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "sns" : {
+ "endpoints" : {
+ "us-iso-east-1" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "us-iso-west-1" : { }
+ }
+ },
+ "sqs" : {
+ "endpoints" : {
+ "us-iso-east-1" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "us-iso-west-1" : { }
+ }
+ },
+ "ssm" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "states" : {
+ "endpoints" : {
+ "fips-us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "states-fips.us-iso-east-1.c2s.ic.gov"
+ },
+ "fips-us-iso-west-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "states-fips.us-iso-west-1.c2s.ic.gov"
+ },
+ "us-iso-east-1" : {
+ "variants" : [ {
+ "hostname" : "states-fips.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-iso-west-1" : {
+ "variants" : [ {
+ "hostname" : "states-fips.us-iso-west-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "streams.dynamodb" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "dynamodb"
+ }
+ },
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "sts" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "support" : {
+ "endpoints" : {
+ "aws-iso-global" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "hostname" : "support.us-iso-east-1.c2s.ic.gov"
+ }
+ },
+ "partitionEndpoint" : "aws-iso-global"
+ },
+ "swf" : {
+ "endpoints" : {
+ "fips-us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "swf-fips.us-iso-east-1.c2s.ic.gov"
+ },
+ "fips-us-iso-west-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "swf-fips.us-iso-west-1.c2s.ic.gov"
+ },
+ "us-iso-east-1" : {
+ "variants" : [ {
+ "hostname" : "swf-fips.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-iso-west-1" : {
+ "variants" : [ {
+ "hostname" : "swf-fips.us-iso-west-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "synthetics" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "tagging" : {
+ "endpoints" : {
+ "us-iso-east-1" : { },
+ "us-iso-west-1" : { }
+ }
+ },
+ "textract" : {
+ "endpoints" : {
+ "us-iso-east-1" : { }
+ }
+ },
+ "transcribe" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "fips-us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "fips.transcribe.us-iso-east-1.c2s.ic.gov"
+ },
+ "us-iso-east-1" : {
+ "variants" : [ {
+ "hostname" : "fips.transcribe.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "transcribestreaming" : {
+ "endpoints" : {
+ "us-iso-east-1" : { }
+ }
+ },
+ "translate" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "us-iso-east-1" : {
+ "variants" : [ {
+ "hostname" : "translate-fips.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-iso-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "translate-fips.us-iso-east-1.c2s.ic.gov"
+ }
+ }
+ },
+ "workspaces" : {
+ "endpoints" : {
+ "fips-us-iso-east-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "workspaces-fips.us-iso-east-1.c2s.ic.gov"
+ },
+ "fips-us-iso-west-1" : {
+ "credentialScope" : {
+ "region" : "us-iso-west-1"
+ },
+ "deprecated" : true,
+ "hostname" : "workspaces-fips.us-iso-west-1.c2s.ic.gov"
+ },
+ "us-iso-east-1" : {
+ "variants" : [ {
+ "hostname" : "workspaces-fips.us-iso-east-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-iso-west-1" : {
+ "variants" : [ {
+ "hostname" : "workspaces-fips.us-iso-west-1.c2s.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ }
+ }
+ }, {
+ "defaults" : {
+ "hostname" : "{service}.{region}.{dnsSuffix}",
+ "protocols" : [ "https" ],
+ "signatureVersions" : [ "v4" ],
+ "variants" : [ {
+ "dnsSuffix" : "sc2s.sgov.gov",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "dnsSuffix" : "sc2s.sgov.gov",
+ "partition" : "aws-iso-b",
+ "partitionName" : "AWS ISOB (US)",
+ "regionRegex" : "^us\\-isob\\-\\w+\\-\\d+$",
+ "regions" : {
+ "us-isob-east-1" : {
+ "description" : "US ISOB East (Ohio)"
+ }
+ },
+ "services" : {
+ "api.ecr" : {
+ "endpoints" : {
+ "us-isob-east-1" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "hostname" : "api.ecr.us-isob-east-1.sc2s.sgov.gov"
+ }
+ }
+ },
+ "api.pricing" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "pricing"
+ }
+ },
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "api.sagemaker" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "apigateway" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "appconfig" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "appconfigdata" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "application-autoscaling" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "arc-zonal-shift" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "autoscaling" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "budgets" : {
+ "endpoints" : {
+ "aws-iso-b-global" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "hostname" : "budgets.global.sc2s.sgov.gov"
+ },
+ "us-isob-east-1" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "hostname" : "budgets.global.sc2s.sgov.gov"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-iso-b-global"
+ },
+ "ce" : {
+ "endpoints" : {
+ "aws-iso-b-global" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "hostname" : "ce.us-isob-east-1.sc2s.sgov.gov"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-iso-b-global"
+ },
+ "cloudcontrolapi" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "cloudformation" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "cloudtrail" : {
+ "endpoints" : {
+ "fips-us-isob-east-1" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "cloudtrail-fips.us-isob-east-1.sc2s.sgov.gov"
+ },
+ "us-isob-east-1" : {
+ "variants" : [ {
+ "hostname" : "cloudtrail-fips.us-isob-east-1.sc2s.sgov.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "codedeploy" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "config" : {
+ "endpoints" : {
+ "fips-us-isob-east-1" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "config-fips.us-isob-east-1.sc2s.sgov.gov"
+ },
+ "us-isob-east-1" : {
+ "variants" : [ {
+ "hostname" : "config-fips.us-isob-east-1.sc2s.sgov.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "directconnect" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "dlm" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "dms" : {
+ "defaults" : {
+ "variants" : [ {
+ "hostname" : "dms.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "endpoints" : {
+ "dms" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "dms.us-isob-east-1.sc2s.sgov.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "dms-fips" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dms.us-isob-east-1.sc2s.sgov.gov"
+ },
+ "us-isob-east-1" : {
+ "variants" : [ {
+ "hostname" : "dms.us-isob-east-1.sc2s.sgov.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-isob-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dms.us-isob-east-1.sc2s.sgov.gov"
+ }
+ }
+ },
+ "ds" : {
+ "endpoints" : {
+ "fips-us-isob-east-1" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "ds-fips.us-isob-east-1.sc2s.sgov.gov"
+ },
+ "us-isob-east-1" : {
+ "variants" : [ {
+ "hostname" : "ds-fips.us-isob-east-1.sc2s.sgov.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "dynamodb" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "ebs" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "ec2" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "ecs" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "eks" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "elasticache" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "elasticfilesystem" : {
+ "endpoints" : {
+ "fips-us-isob-east-1" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.us-isob-east-1.sc2s.sgov.gov"
+ },
+ "us-isob-east-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.us-isob-east-1.sc2s.sgov.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "elasticloadbalancing" : {
+ "endpoints" : {
+ "us-isob-east-1" : {
+ "protocols" : [ "https" ]
+ }
+ }
+ },
+ "elasticmapreduce" : {
+ "endpoints" : {
+ "fips-us-isob-east-1" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticmapreduce.us-isob-east-1.sc2s.sgov.gov"
+ },
+ "us-isob-east-1" : {
+ "variants" : [ {
+ "hostname" : "elasticmapreduce.us-isob-east-1.sc2s.sgov.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "es" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "events" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "firehose" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "glacier" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "health" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "iam" : {
+ "endpoints" : {
+ "aws-iso-b-global" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "hostname" : "iam.us-isob-east-1.sc2s.sgov.gov"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-iso-b-global"
+ },
+ "kinesis" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "kms" : {
+ "endpoints" : {
+ "ProdFips" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.us-isob-east-1.sc2s.sgov.gov"
+ },
+ "us-isob-east-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.us-isob-east-1.sc2s.sgov.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-isob-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.us-isob-east-1.sc2s.sgov.gov"
+ }
+ }
+ },
+ "lambda" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "license-manager" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "logs" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "medialive" : {
+ "endpoints" : {
+ "fips-us-isob-east-1" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "medialive-fips.us-isob-east-1.sc2s.sgov.gov"
+ },
+ "us-isob-east-1" : {
+ "variants" : [ {
+ "hostname" : "medialive-fips.us-isob-east-1.sc2s.sgov.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "mediapackage" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "metering.marketplace" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "aws-marketplace"
+ }
+ },
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "metrics.sagemaker" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "monitoring" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "oam" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "organizations" : {
+ "endpoints" : {
+ "aws-iso-b-global" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "hostname" : "organizations.us-isob-east-1.sc2s.sgov.gov"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-iso-b-global"
+ },
+ "outposts" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "ram" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "rbin" : {
+ "endpoints" : {
+ "fips-us-isob-east-1" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rbin-fips.us-isob-east-1.sc2s.sgov.gov"
+ },
+ "us-isob-east-1" : {
+ "variants" : [ {
+ "hostname" : "rbin-fips.us-isob-east-1.sc2s.sgov.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "rds" : {
+ "endpoints" : {
+ "rds.us-isob-east-1" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rds.us-isob-east-1.sc2s.sgov.gov"
+ },
+ "us-isob-east-1" : {
+ "variants" : [ {
+ "hostname" : "rds.us-isob-east-1.sc2s.sgov.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-isob-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "rds.us-isob-east-1.sc2s.sgov.gov"
+ }
+ }
+ },
+ "redshift" : {
+ "endpoints" : {
+ "us-isob-east-1" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "hostname" : "redshift.us-isob-east-1.sc2s.sgov.gov"
+ }
+ }
+ },
+ "resource-groups" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "route53" : {
+ "endpoints" : {
+ "aws-iso-b-global" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "hostname" : "route53.sc2s.sgov.gov"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-iso-b-global"
+ },
+ "route53resolver" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "runtime.sagemaker" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "s3" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ],
+ "signatureVersions" : [ "s3v4" ]
+ },
+ "endpoints" : {
+ "fips-us-isob-east-1" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-fips.us-isob-east-1.sc2s.sgov.gov"
+ },
+ "us-isob-east-1" : {
+ "variants" : [ {
+ "hostname" : "s3-fips.dualstack.us-isob-east-1.sc2s.sgov.gov",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "s3-fips.us-isob-east-1.sc2s.sgov.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "s3-control" : {
+ "defaults" : {
+ "protocols" : [ "https" ],
+ "signatureVersions" : [ "s3v4" ]
+ },
+ "endpoints" : {
+ "us-isob-east-1" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "hostname" : "s3-control.us-isob-east-1.sc2s.sgov.gov",
+ "signatureVersions" : [ "s3v4" ],
+ "variants" : [ {
+ "hostname" : "s3-control-fips.dualstack.us-isob-east-1.sc2s.sgov.gov",
+ "tags" : [ "dualstack", "fips" ]
+ }, {
+ "hostname" : "s3-control-fips.us-isob-east-1.sc2s.sgov.gov",
+ "tags" : [ "fips" ]
+ }, {
+ "hostname" : "s3-control.dualstack.us-isob-east-1.sc2s.sgov.gov",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-isob-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "s3-control-fips.us-isob-east-1.sc2s.sgov.gov",
+ "signatureVersions" : [ "s3v4" ]
+ }
+ }
+ },
+ "s3-outposts" : {
+ "endpoints" : {
+ "fips-us-isob-east-1" : {
+ "deprecated" : true
+ },
+ "us-isob-east-1" : {
+ "variants" : [ {
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "scheduler" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "secretsmanager" : {
+ "endpoints" : {
+ "us-isob-east-1" : {
+ "variants" : [ {
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-isob-east-1-fips" : {
+ "deprecated" : true
+ }
+ }
+ },
+ "snowball" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "sns" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "sqs" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ],
+ "sslCommonName" : "{region}.queue.{dnsSuffix}"
+ },
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "ssm" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "states" : {
+ "endpoints" : {
+ "fips-us-isob-east-1" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "states-fips.us-isob-east-1.sc2s.sgov.gov"
+ },
+ "us-isob-east-1" : {
+ "variants" : [ {
+ "hostname" : "states-fips.us-isob-east-1.sc2s.sgov.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "storagegateway" : {
+ "endpoints" : {
+ "fips" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "storagegateway-fips.us-isob-east-1.sc2s.sgov.gov"
+ },
+ "us-isob-east-1" : {
+ "variants" : [ {
+ "hostname" : "storagegateway-fips.us-isob-east-1.sc2s.sgov.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-isob-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "storagegateway-fips.us-isob-east-1.sc2s.sgov.gov"
+ }
+ }
+ },
+ "streams.dynamodb" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "dynamodb"
+ },
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "sts" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "support" : {
+ "endpoints" : {
+ "aws-iso-b-global" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "hostname" : "support.us-isob-east-1.sc2s.sgov.gov"
+ }
+ },
+ "partitionEndpoint" : "aws-iso-b-global"
+ },
+ "swf" : {
+ "endpoints" : {
+ "fips-us-isob-east-1" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "swf-fips.us-isob-east-1.sc2s.sgov.gov"
+ },
+ "us-isob-east-1" : {
+ "variants" : [ {
+ "hostname" : "swf-fips.us-isob-east-1.sc2s.sgov.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "synthetics" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "tagging" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ },
+ "workspaces" : {
+ "endpoints" : {
+ "fips-us-isob-east-1" : {
+ "credentialScope" : {
+ "region" : "us-isob-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "workspaces-fips.us-isob-east-1.sc2s.sgov.gov"
+ },
+ "us-isob-east-1" : {
+ "variants" : [ {
+ "hostname" : "workspaces-fips.us-isob-east-1.sc2s.sgov.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "xray" : {
+ "endpoints" : {
+ "us-isob-east-1" : { }
+ }
+ }
+ }
+ }, {
+ "defaults" : {
+ "hostname" : "{service}.{region}.{dnsSuffix}",
+ "protocols" : [ "https" ],
+ "signatureVersions" : [ "v4" ],
+ "variants" : [ {
+ "dnsSuffix" : "cloud.adc-e.uk",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "dnsSuffix" : "cloud.adc-e.uk",
+ "partition" : "aws-iso-e",
+ "partitionName" : "AWS ISOE (Europe)",
+ "regionRegex" : "^eu\\-isoe\\-\\w+\\-\\d+$",
+ "regions" : {
+ "eu-isoe-west-1" : {
+ "description" : "EU ISOE West"
+ }
+ },
+ "services" : { }
+ }, {
+ "defaults" : {
+ "hostname" : "{service}.{region}.{dnsSuffix}",
+ "protocols" : [ "https" ],
+ "signatureVersions" : [ "v4" ],
+ "variants" : [ {
+ "dnsSuffix" : "csp.hci.ic.gov",
+ "hostname" : "{service}-fips.{region}.{dnsSuffix}",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "dnsSuffix" : "csp.hci.ic.gov",
+ "partition" : "aws-iso-f",
+ "partitionName" : "AWS ISOF",
+ "regionRegex" : "^us\\-isof\\-\\w+\\-\\d+$",
+ "regions" : {
+ "us-isof-east-1" : {
+ "description" : "US ISOF EAST"
+ },
+ "us-isof-south-1" : {
+ "description" : "US ISOF SOUTH"
+ }
+ },
+ "services" : {
+ "access-analyzer" : {
+ "endpoints" : {
+ "us-isof-east-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.us-isof-east-1.api.aws.hci.ic.gov",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-isof-south-1" : {
+ "variants" : [ {
+ "hostname" : "access-analyzer.us-isof-south-1.api.aws.hci.ic.gov",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "acm" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "acm-pca" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "api.ecr" : {
+ "endpoints" : {
+ "us-isof-east-1" : {
+ "credentialScope" : {
+ "region" : "us-isof-east-1"
+ },
+ "hostname" : "api.ecr.us-isof-east-1.csp.hci.ic.gov"
+ },
+ "us-isof-south-1" : {
+ "credentialScope" : {
+ "region" : "us-isof-south-1"
+ },
+ "hostname" : "api.ecr.us-isof-south-1.csp.hci.ic.gov"
+ }
+ }
+ },
+ "api.pricing" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "pricing"
+ }
+ },
+ "endpoints" : {
+ "us-isof-south-1" : { }
+ }
+ },
+ "api.sagemaker" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "appconfig" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "appconfigdata" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "application-autoscaling" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "arc-zonal-shift" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "athena" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "autoscaling" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "backup" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "batch" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "budgets" : {
+ "endpoints" : {
+ "aws-iso-f-global" : {
+ "credentialScope" : {
+ "region" : "us-isof-south-1"
+ },
+ "hostname" : "budgets.global.csp.hci.ic.gov"
+ },
+ "us-isof-south-1" : {
+ "credentialScope" : {
+ "region" : "us-isof-south-1"
+ },
+ "hostname" : "budgets.global.csp.hci.ic.gov"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-iso-f-global"
+ },
+ "ce" : {
+ "endpoints" : {
+ "aws-iso-f-global" : {
+ "credentialScope" : {
+ "region" : "us-isof-south-1"
+ },
+ "hostname" : "ce.us-isof-south-1.csp.hci.ic.gov"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-iso-f-global"
+ },
+ "cloudcontrolapi" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "cloudformation" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "cloudtrail" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "codebuild" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "codedeploy" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "codepipeline" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "comprehend" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "compute-optimizer" : {
+ "endpoints" : {
+ "us-isof-south-1" : {
+ "credentialScope" : {
+ "region" : "us-isof-south-1"
+ },
+ "hostname" : "compute-optimizer.us-isof-south-1.csp.hci.ic.gov"
+ }
+ }
+ },
+ "config" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "cost-optimization-hub" : {
+ "endpoints" : {
+ "us-isof-south-1" : {
+ "credentialScope" : {
+ "region" : "us-isof-south-1"
+ },
+ "hostname" : "cost-optimization-hub.us-isof-south-1.csp.hci.ic.gov"
+ }
+ }
+ },
+ "directconnect" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "dlm" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "dms" : {
+ "endpoints" : {
+ "dms" : {
+ "credentialScope" : {
+ "region" : "us-isof-east-1"
+ },
+ "deprecated" : true,
+ "variants" : [ {
+ "hostname" : "dms.us-isof-east-1.csp.hci.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "dms-fips" : {
+ "credentialScope" : {
+ "region" : "us-isof-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dms.us-isof-east-1.csp.hci.ic.gov"
+ },
+ "us-isof-east-1" : {
+ "variants" : [ {
+ "hostname" : "dms.us-isof-east-1.csp.hci.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-isof-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-isof-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dms.us-isof-east-1.csp.hci.ic.gov"
+ },
+ "us-isof-south-1" : {
+ "variants" : [ {
+ "hostname" : "dms.us-isof-south-1.csp.hci.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-isof-south-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-isof-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "dms.us-isof-south-1.csp.hci.ic.gov"
+ }
+ }
+ },
+ "ds" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "dynamodb" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "ebs" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "ec2" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "ecs" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "eks" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "elasticache" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "elasticfilesystem" : {
+ "endpoints" : {
+ "fips-us-isof-east-1" : {
+ "credentialScope" : {
+ "region" : "us-isof-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.us-isof-east-1.csp.hci.ic.gov"
+ },
+ "fips-us-isof-south-1" : {
+ "credentialScope" : {
+ "region" : "us-isof-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "elasticfilesystem-fips.us-isof-south-1.csp.hci.ic.gov"
+ },
+ "us-isof-east-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.us-isof-east-1.csp.hci.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-isof-south-1" : {
+ "variants" : [ {
+ "hostname" : "elasticfilesystem-fips.us-isof-south-1.csp.hci.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ }
+ }
+ },
+ "elasticloadbalancing" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "elasticmapreduce" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "es" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "events" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "firehose" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "fsx" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "glue" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "guardduty" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ },
+ "isRegionalized" : true
+ },
+ "iam" : {
+ "endpoints" : {
+ "aws-iso-f-global" : {
+ "credentialScope" : {
+ "region" : "us-isof-south-1"
+ },
+ "hostname" : "iam.us-isof-south-1.csp.hci.ic.gov"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-iso-f-global"
+ },
+ "kinesis" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "kms" : {
+ "endpoints" : {
+ "ProdFips" : {
+ "credentialScope" : {
+ "region" : "us-isof-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.us-isof-east-1.csp.hci.ic.gov"
+ },
+ "us-isof-east-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.us-isof-east-1.csp.hci.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-isof-east-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-isof-east-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.us-isof-east-1.csp.hci.ic.gov"
+ },
+ "us-isof-south-1" : {
+ "variants" : [ {
+ "hostname" : "kms-fips.us-isof-south-1.csp.hci.ic.gov",
+ "tags" : [ "fips" ]
+ } ]
+ },
+ "us-isof-south-1-fips" : {
+ "credentialScope" : {
+ "region" : "us-isof-south-1"
+ },
+ "deprecated" : true,
+ "hostname" : "kms-fips.us-isof-south-1.csp.hci.ic.gov"
+ }
+ }
+ },
+ "lakeformation" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "lambda" : {
+ "endpoints" : {
+ "us-isof-east-1" : {
+ "variants" : [ {
+ "hostname" : "lambda.us-isof-east-1.api.aws.hci.ic.gov",
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-isof-south-1" : {
+ "variants" : [ {
+ "hostname" : "lambda.us-isof-south-1.api.aws.hci.ic.gov",
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "license-manager" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "logs" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "metrics.sagemaker" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "monitoring" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "oam" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "organizations" : {
+ "endpoints" : {
+ "aws-iso-f-global" : {
+ "credentialScope" : {
+ "region" : "us-isof-south-1"
+ },
+ "hostname" : "organizations.us-isof-south-1.csp.hci.ic.gov"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-iso-f-global"
+ },
+ "pi" : {
+ "endpoints" : {
+ "us-isof-east-1" : {
+ "protocols" : [ "https" ]
+ },
+ "us-isof-south-1" : {
+ "protocols" : [ "https" ]
+ }
+ }
+ },
+ "pipes" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "quicksight" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "ram" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "rbin" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "rds" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "redshift" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "redshift-serverless" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "rekognition" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "resource-groups" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "route53" : {
+ "endpoints" : {
+ "aws-iso-f-global" : {
+ "credentialScope" : {
+ "region" : "us-isof-south-1"
+ },
+ "hostname" : "route53.csp.hci.ic.gov"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-iso-f-global"
+ },
+ "route53resolver" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "s3" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ],
+ "signatureVersions" : [ "s3v4" ]
+ },
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "savingsplans" : {
+ "endpoints" : {
+ "aws-iso-f-global" : {
+ "credentialScope" : {
+ "region" : "us-isof-south-1"
+ },
+ "hostname" : "savingsplans.csp.hci.ic.gov"
+ }
+ },
+ "isRegionalized" : false,
+ "partitionEndpoint" : "aws-iso-f-global"
+ },
+ "scheduler" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "schemas" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "secretsmanager" : {
+ "endpoints" : {
+ "us-isof-east-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ },
+ "us-isof-south-1" : {
+ "variants" : [ {
+ "tags" : [ "dualstack" ]
+ } ]
+ }
+ }
+ },
+ "servicediscovery" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "servicequotas" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "sns" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "sqs" : {
+ "defaults" : {
+ "protocols" : [ "http", "https" ],
+ "sslCommonName" : "{region}.queue.{dnsSuffix}"
+ },
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "ssm" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "states" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "streams.dynamodb" : {
+ "defaults" : {
+ "credentialScope" : {
+ "service" : "dynamodb"
+ },
+ "protocols" : [ "http", "https" ]
+ },
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "sts" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "swf" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "synthetics" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "tagging" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "textract" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "transcribe" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "transcribestreaming" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "translate" : {
+ "defaults" : {
+ "protocols" : [ "https" ]
+ },
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ },
+ "xray" : {
+ "endpoints" : {
+ "us-isof-east-1" : { },
+ "us-isof-south-1" : { }
+ }
+ }
+ }
+ } ],
+ "version" : 3
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/entityresolution/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/entityresolution/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..abca7569
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/entityresolution/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/entityresolution/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/entityresolution/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..b34d3829
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/entityresolution/2018-05-10/paginators-1.json
@@ -0,0 +1,46 @@
+{
+ "pagination": {
+ "ListMatchingJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "jobs"
+ },
+ "ListMatchingWorkflows": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "workflowSummaries"
+ },
+ "ListSchemaMappings": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "schemaList"
+ },
+ "ListIdMappingJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "jobs"
+ },
+ "ListIdMappingWorkflows": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "workflowSummaries"
+ },
+ "ListProviderServices": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "providerServiceSummaries"
+ },
+ "ListIdNamespaces": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "idNamespaceSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/entityresolution/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/entityresolution/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..1f186c76
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/entityresolution/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/es/2015-01-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/es/2015-01-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..38f03a05
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/es/2015-01-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/es/2015-01-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/es/2015-01-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/es/2015-01-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/es/2015-01-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/es/2015-01-01/paginators-1.json
new file mode 100644
index 00000000..4c0f24e4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/es/2015-01-01/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "ListElasticsearchInstanceTypes": {
+ "result_key": "ElasticsearchInstanceTypes",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListElasticsearchVersions": {
+ "result_key": "ElasticsearchVersions",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "DescribeReservedElasticsearchInstanceOfferings": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ReservedElasticsearchInstanceOfferings"
+ },
+ "DescribeReservedElasticsearchInstances": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ReservedElasticsearchInstances"
+ },
+ "GetUpgradeHistory": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "UpgradeHistories"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/es/2015-01-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/es/2015-01-01/service-2.json.gz
new file mode 100644
index 00000000..900fd292
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/es/2015-01-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/events/2014-02-03/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/events/2014-02-03/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..4c93ba43
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/events/2014-02-03/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/events/2014-02-03/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/events/2014-02-03/service-2.json.gz
new file mode 100644
index 00000000..e552015d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/events/2014-02-03/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/events/2015-10-07/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/events/2015-10-07/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..a6096159
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/events/2015-10-07/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/events/2015-10-07/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/events/2015-10-07/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/events/2015-10-07/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/events/2015-10-07/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/events/2015-10-07/paginators-1.json
new file mode 100644
index 00000000..501a3229
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/events/2015-10-07/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListRuleNamesByTarget": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "RuleNames"
+ },
+ "ListRules": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "Rules"
+ },
+ "ListTargetsByRule": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "Targets"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/events/2015-10-07/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/events/2015-10-07/service-2.json.gz
new file mode 100644
index 00000000..06918f3b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/events/2015-10-07/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/evidently/2021-02-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/evidently/2021-02-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..26a8b744
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/evidently/2021-02-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/evidently/2021-02-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/evidently/2021-02-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/evidently/2021-02-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/evidently/2021-02-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/evidently/2021-02-01/paginators-1.json
new file mode 100644
index 00000000..c72d3cba
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/evidently/2021-02-01/paginators-1.json
@@ -0,0 +1,40 @@
+{
+ "pagination": {
+ "ListExperiments": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "experiments"
+ },
+ "ListFeatures": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "features"
+ },
+ "ListLaunches": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "launches"
+ },
+ "ListProjects": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "projects"
+ },
+ "ListSegmentReferences": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "referencedBy"
+ },
+ "ListSegments": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "segments"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/evidently/2021-02-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/evidently/2021-02-01/service-2.json.gz
new file mode 100644
index 00000000..5ad0a3ca
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/evidently/2021-02-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/finspace-data/2020-07-13/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/finspace-data/2020-07-13/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..7ac1f544
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/finspace-data/2020-07-13/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/finspace-data/2020-07-13/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/finspace-data/2020-07-13/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/finspace-data/2020-07-13/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/finspace-data/2020-07-13/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/finspace-data/2020-07-13/paginators-1.json
new file mode 100644
index 00000000..aa6632a2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/finspace-data/2020-07-13/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "ListChangesets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "changesets"
+ },
+ "ListDataViews": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "dataViews"
+ },
+ "ListDatasets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "datasets"
+ },
+ "ListPermissionGroups": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "permissionGroups"
+ },
+ "ListUsers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "users"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/finspace-data/2020-07-13/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/finspace-data/2020-07-13/service-2.json.gz
new file mode 100644
index 00000000..3bd08075
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/finspace-data/2020-07-13/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/finspace/2021-03-12/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/finspace/2021-03-12/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..7d402804
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/finspace/2021-03-12/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/finspace/2021-03-12/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/finspace/2021-03-12/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/finspace/2021-03-12/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/finspace/2021-03-12/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/finspace/2021-03-12/paginators-1.json
new file mode 100644
index 00000000..741ca798
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/finspace/2021-03-12/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListKxEnvironments": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "environments"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/finspace/2021-03-12/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/finspace/2021-03-12/service-2.json.gz
new file mode 100644
index 00000000..4bda454d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/finspace/2021-03-12/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/firehose/2015-08-04/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/firehose/2015-08-04/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..fe3bd0a8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/firehose/2015-08-04/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/firehose/2015-08-04/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/firehose/2015-08-04/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/firehose/2015-08-04/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/firehose/2015-08-04/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/firehose/2015-08-04/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/firehose/2015-08-04/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/firehose/2015-08-04/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/firehose/2015-08-04/service-2.json.gz
new file mode 100644
index 00000000..6e2949ab
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/firehose/2015-08-04/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/fis/2020-12-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/fis/2020-12-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..05b808aa
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/fis/2020-12-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/fis/2020-12-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/fis/2020-12-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/fis/2020-12-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/fis/2020-12-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/fis/2020-12-01/paginators-1.json
new file mode 100644
index 00000000..740e56e2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/fis/2020-12-01/paginators-1.json
@@ -0,0 +1,40 @@
+{
+ "pagination": {
+ "ListActions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "actions"
+ },
+ "ListExperimentResolvedTargets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "resolvedTargets"
+ },
+ "ListExperimentTemplates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "experimentTemplates"
+ },
+ "ListExperiments": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "experiments"
+ },
+ "ListTargetAccountConfigurations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "targetAccountConfigurations"
+ },
+ "ListTargetResourceTypes": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "targetResourceTypes"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/fis/2020-12-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/fis/2020-12-01/service-2.json.gz
new file mode 100644
index 00000000..f2031f8b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/fis/2020-12-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/fms/2018-01-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/fms/2018-01-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..86c94704
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/fms/2018-01-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/fms/2018-01-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/fms/2018-01-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/fms/2018-01-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/fms/2018-01-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/fms/2018-01-01/paginators-1.json
new file mode 100644
index 00000000..730571d1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/fms/2018-01-01/paginators-1.json
@@ -0,0 +1,52 @@
+{
+ "pagination": {
+ "ListComplianceStatus": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "PolicyComplianceStatusList"
+ },
+ "ListMemberAccounts": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "MemberAccounts"
+ },
+ "ListPolicies": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "PolicyList"
+ },
+ "ListAppsLists": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AppsLists"
+ },
+ "ListProtocolsLists": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ProtocolsLists"
+ },
+ "ListThirdPartyFirewallFirewallPolicies": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ThirdPartyFirewallFirewallPolicies"
+ },
+ "ListAdminAccountsForOrganization": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AdminAccounts"
+ },
+ "ListAdminsManagingAccount": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AdminAccounts"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/fms/2018-01-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/fms/2018-01-01/service-2.json.gz
new file mode 100644
index 00000000..9dc8b62f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/fms/2018-01-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/forecast/2018-06-26/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/forecast/2018-06-26/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..63159a4f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/forecast/2018-06-26/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/forecast/2018-06-26/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/forecast/2018-06-26/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/forecast/2018-06-26/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/forecast/2018-06-26/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/forecast/2018-06-26/paginators-1.json
new file mode 100644
index 00000000..853dee41
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/forecast/2018-06-26/paginators-1.json
@@ -0,0 +1,88 @@
+{
+ "pagination": {
+ "ListDatasetGroups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "DatasetGroups"
+ },
+ "ListDatasetImportJobs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "DatasetImportJobs"
+ },
+ "ListDatasets": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Datasets"
+ },
+ "ListForecastExportJobs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ForecastExportJobs"
+ },
+ "ListForecasts": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Forecasts"
+ },
+ "ListPredictors": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Predictors"
+ },
+ "ListPredictorBacktestExportJobs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "PredictorBacktestExportJobs"
+ },
+ "ListExplainabilities": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Explainabilities"
+ },
+ "ListExplainabilityExports": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ExplainabilityExports"
+ },
+ "ListMonitorEvaluations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "PredictorMonitorEvaluations"
+ },
+ "ListMonitors": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Monitors"
+ },
+ "ListWhatIfAnalyses": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "WhatIfAnalyses"
+ },
+ "ListWhatIfForecastExports": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "WhatIfForecastExports"
+ },
+ "ListWhatIfForecasts": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "WhatIfForecasts"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/forecast/2018-06-26/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/forecast/2018-06-26/service-2.json.gz
new file mode 100644
index 00000000..af0c39bb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/forecast/2018-06-26/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/forecastquery/2018-06-26/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/forecastquery/2018-06-26/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..4f714430
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/forecastquery/2018-06-26/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/forecastquery/2018-06-26/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/forecastquery/2018-06-26/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/forecastquery/2018-06-26/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/forecastquery/2018-06-26/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/forecastquery/2018-06-26/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/forecastquery/2018-06-26/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/forecastquery/2018-06-26/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/forecastquery/2018-06-26/service-2.json.gz
new file mode 100644
index 00000000..d7c9ef50
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/forecastquery/2018-06-26/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/frauddetector/2019-11-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/frauddetector/2019-11-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..301f0978
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/frauddetector/2019-11-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/frauddetector/2019-11-15/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/frauddetector/2019-11-15/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/frauddetector/2019-11-15/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/frauddetector/2019-11-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/frauddetector/2019-11-15/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/frauddetector/2019-11-15/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/frauddetector/2019-11-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/frauddetector/2019-11-15/service-2.json.gz
new file mode 100644
index 00000000..e025cb85
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/frauddetector/2019-11-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/freetier/2023-09-07/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/freetier/2023-09-07/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..5c0c10b5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/freetier/2023-09-07/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/freetier/2023-09-07/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/freetier/2023-09-07/paginators-1.json
new file mode 100644
index 00000000..2ccdd2b7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/freetier/2023-09-07/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "GetFreeTierUsage": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "freeTierUsages"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/freetier/2023-09-07/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/freetier/2023-09-07/service-2.json.gz
new file mode 100644
index 00000000..61b82113
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/freetier/2023-09-07/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/fsx/2018-03-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/fsx/2018-03-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..c67dfee9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/fsx/2018-03-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/fsx/2018-03-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/fsx/2018-03-01/examples-1.json
new file mode 100644
index 00000000..1993a235
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/fsx/2018-03-01/examples-1.json
@@ -0,0 +1,438 @@
+{
+ "version": "1.0",
+ "examples": {
+ "CopyBackup": [
+ {
+ "input": {
+ "SourceBackupId": "backup-03e3c82e0183b7b6b",
+ "SourceRegion": "us-east-2"
+ },
+ "output": {
+ "Backup": {
+ "BackupId": "backup-0a3364eded1014b28",
+ "CreationTime": 1617954808.068,
+ "FileSystem": {
+ "FileSystemId": "fs-0498eed5fe91001ec",
+ "FileSystemType": "LUSTRE",
+ "LustreConfiguration": {
+ "AutomaticBackupRetentionDays": 0,
+ "DeploymentType": "PERSISTENT_1",
+ "PerUnitStorageThroughput": 50,
+ "WeeklyMaintenanceStartTime": "1:05:00"
+ },
+ "ResourceARN": "arn:aws:fsx:us-east-1:012345678912:file-system/fs-0f5179e395f597e66",
+ "StorageCapacity": 2400,
+ "StorageType": "SSD"
+ },
+ "KmsKeyId": "arn:aws:fsx:us-east-1:012345678912:key/d1234e22-543a-12b7-a98f-e12c2b54001a",
+ "Lifecycle": "COPYING",
+ "OwnerId": "123456789012",
+ "ResourceARN": "arn:aws:fsx:us-east-1:012345678912:backup/backup-0a3364eded1014b28",
+ "Tags": [
+ {
+ "Key": "Name",
+ "Value": "MyBackup"
+ }
+ ],
+ "Type": "USER_INITIATED"
+ }
+ },
+ "comments": {
+ },
+ "description": "This operation copies an Amazon FSx backup.",
+ "id": "to-copy-a-backup-1481847318640",
+ "title": "To copy a backup"
+ }
+ ],
+ "CreateBackup": [
+ {
+ "input": {
+ "FileSystemId": "fs-0498eed5fe91001ec",
+ "Tags": [
+ {
+ "Key": "Name",
+ "Value": "MyBackup"
+ }
+ ]
+ },
+ "output": {
+ "Backup": {
+ "BackupId": "backup-03e3c82e0183b7b6b",
+ "CreationTime": "1481841524.0",
+ "FileSystem": {
+ "FileSystemId": "fs-0498eed5fe91001ec",
+ "OwnerId": "012345678912",
+ "StorageCapacity": 300,
+ "WindowsConfiguration": {
+ "ActiveDirectoryId": "d-1234abcd12",
+ "AutomaticBackupRetentionDays": 30,
+ "DailyAutomaticBackupStartTime": "05:00",
+ "WeeklyMaintenanceStartTime": "1:05:00"
+ }
+ },
+ "Lifecycle": "CREATING",
+ "ProgressPercent": 0,
+ "ResourceARN": "arn:aws:fsx:us-east-1:012345678912:backup/backup-03e3c82e0183b7b6b",
+ "Tags": [
+ {
+ "Key": "Name",
+ "Value": "MyBackup"
+ }
+ ],
+ "Type": "USER_INITIATED"
+ }
+ },
+ "comments": {
+ },
+ "description": "This operation creates a new backup.",
+ "id": "to-create-a-new-backup-1481840798597",
+ "title": "To create a new backup"
+ }
+ ],
+ "CreateFileSystem": [
+ {
+ "input": {
+ "ClientRequestToken": "a8ca07e4-61ec-4399-99f4-19853801bcd5",
+ "FileSystemType": "WINDOWS",
+ "KmsKeyId": "arn:aws:kms:us-east-1:012345678912:key/1111abcd-2222-3333-4444-55556666eeff",
+ "SecurityGroupIds": [
+ "sg-edcd9784"
+ ],
+ "StorageCapacity": 3200,
+ "StorageType": "HDD",
+ "SubnetIds": [
+ "subnet-1234abcd"
+ ],
+ "Tags": [
+ {
+ "Key": "Name",
+ "Value": "MyFileSystem"
+ }
+ ],
+ "WindowsConfiguration": {
+ "ActiveDirectoryId": "d-1234abcd12",
+ "Aliases": [
+ "accounting.corp.example.com"
+ ],
+ "AutomaticBackupRetentionDays": 30,
+ "DailyAutomaticBackupStartTime": "05:00",
+ "ThroughputCapacity": 32,
+ "WeeklyMaintenanceStartTime": "1:05:00"
+ }
+ },
+ "output": {
+ "FileSystem": {
+ "CreationTime": "1481841524.0",
+ "DNSName": "fs-0123456789abcdef0.fsx.com",
+ "FileSystemId": "fs-0123456789abcdef0",
+ "KmsKeyId": "arn:aws:kms:us-east-1:012345678912:key/1111abcd-2222-3333-4444-55556666eeff",
+ "Lifecycle": "CREATING",
+ "OwnerId": "012345678912",
+ "ResourceARN": "arn:aws:fsx:us-east-1:012345678912:file-system/fs-0123456789abcdef0",
+ "StorageCapacity": 3200,
+ "StorageType": "HDD",
+ "SubnetIds": [
+ "subnet-1234abcd"
+ ],
+ "Tags": [
+ {
+ "Key": "Name",
+ "Value": "MyFileSystem"
+ }
+ ],
+ "VpcId": "vpc-ab1234cd",
+ "WindowsConfiguration": {
+ "ActiveDirectoryId": "d-1234abcd12",
+ "Aliases": [
+ {
+ "Lifecycle": "CREATING",
+ "Name": "accounting.corp.example.com"
+ }
+ ],
+ "AutomaticBackupRetentionDays": 30,
+ "DailyAutomaticBackupStartTime": "05:00",
+ "ThroughputCapacity": 32,
+ "WeeklyMaintenanceStartTime": "1:05:00"
+ }
+ }
+ },
+ "comments": {
+ },
+ "description": "This operation creates a new Amazon FSx for Windows File Server file system.",
+ "id": "to-create-a-new-file-system-1481840798547",
+ "title": "To create a new file system"
+ }
+ ],
+ "CreateFileSystemFromBackup": [
+ {
+ "input": {
+ "BackupId": "backup-03e3c82e0183b7b6b",
+ "ClientRequestToken": "f4c94ed7-238d-4c46-93db-48cd62ec33b7",
+ "SecurityGroupIds": [
+ "sg-edcd9784"
+ ],
+ "SubnetIds": [
+ "subnet-1234abcd"
+ ],
+ "Tags": [
+ {
+ "Key": "Name",
+ "Value": "MyFileSystem"
+ }
+ ],
+ "WindowsConfiguration": {
+ "ThroughputCapacity": 8
+ }
+ },
+ "output": {
+ "FileSystem": {
+ "CreationTime": "1481841524.0",
+ "DNSName": "fs-0498eed5fe91001ec.fsx.com",
+ "FileSystemId": "fs-0498eed5fe91001ec",
+ "KmsKeyId": "arn:aws:kms:us-east-1:012345678912:key/0ff3ea8d-130e-4133-877f-93908b6fdbd6",
+ "Lifecycle": "CREATING",
+ "OwnerId": "012345678912",
+ "ResourceARN": "arn:aws:fsx:us-east-1:012345678912:file-system/fs-0498eed5fe91001ec",
+ "StorageCapacity": 300,
+ "SubnetIds": [
+ "subnet-1234abcd"
+ ],
+ "Tags": [
+ {
+ "Key": "Name",
+ "Value": "MyFileSystem"
+ }
+ ],
+ "VpcId": "vpc-ab1234cd",
+ "WindowsConfiguration": {
+ "ActiveDirectoryId": "d-1234abcd12",
+ "AutomaticBackupRetentionDays": 30,
+ "DailyAutomaticBackupStartTime": "05:00",
+ "ThroughputCapacity": 8,
+ "WeeklyMaintenanceStartTime": "1:05:00"
+ }
+ }
+ },
+ "comments": {
+ },
+ "description": "This operation creates a new file system from backup.",
+ "id": "to-create-a-new-file-system-from-backup-1481840798598",
+ "title": "To create a new file system from backup"
+ }
+ ],
+ "DeleteBackup": [
+ {
+ "input": {
+ "BackupId": "backup-03e3c82e0183b7b6b"
+ },
+ "output": {
+ "BackupId": "backup-03e3c82e0183b7b6b",
+ "Lifecycle": "DELETED"
+ },
+ "comments": {
+ },
+ "description": "This operation deletes an Amazon FSx file system backup.",
+ "id": "to-delete-a-file-system-1481847318399",
+ "title": "To delete a backup"
+ }
+ ],
+ "DeleteFileSystem": [
+ {
+ "input": {
+ "FileSystemId": "fs-0498eed5fe91001ec"
+ },
+ "output": {
+ "FileSystemId": "fs-0498eed5fe91001ec",
+ "Lifecycle": "DELETING"
+ },
+ "comments": {
+ },
+ "description": "This operation deletes an Amazon FSx file system.",
+ "id": "to-delete-a-file-system-1481847318348",
+ "title": "To delete a file system"
+ }
+ ],
+ "DescribeBackups": [
+ {
+ "input": {
+ },
+ "output": {
+ "Backups": [
+ {
+ "BackupId": "backup-03e3c82e0183b7b6b",
+ "CreationTime": "1481841524.0",
+ "FileSystem": {
+ "FileSystemId": "fs-0498eed5fe91001ec",
+ "OwnerId": "012345678912",
+ "StorageCapacity": 300,
+ "WindowsConfiguration": {
+ "ActiveDirectoryId": "d-1234abcd12",
+ "AutomaticBackupRetentionDays": 30,
+ "DailyAutomaticBackupStartTime": "05:00",
+ "WeeklyMaintenanceStartTime": "1:05:00"
+ }
+ },
+ "Lifecycle": "AVAILABLE",
+ "ResourceARN": "arn:aws:fsx:us-east-1:012345678912:backup/backup-03e3c82e0183b7b6b",
+ "Tags": [
+ {
+ "Key": "Name",
+ "Value": "MyBackup"
+ }
+ ],
+ "Type": "USER_INITIATED"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "This operation describes all of the Amazon FSx backups in an account.",
+ "id": "to-describe-backups-1481848448499",
+ "title": "To describe Amazon FSx backups"
+ }
+ ],
+ "DescribeFileSystems": [
+ {
+ "input": {
+ },
+ "output": {
+ "FileSystems": [
+ {
+ "CreationTime": "1481841524.0",
+ "DNSName": "fs-0498eed5fe91001ec.fsx.com",
+ "FileSystemId": "fs-0498eed5fe91001ec",
+ "KmsKeyId": "arn:aws:kms:us-east-1:012345678912:key/0ff3ea8d-130e-4133-877f-93908b6fdbd6",
+ "Lifecycle": "AVAILABLE",
+ "NetworkInterfaceIds": [
+ "eni-abcd1234"
+ ],
+ "OwnerId": "012345678912",
+ "ResourceARN": "arn:aws:fsx:us-east-1:012345678912:file-system/fs-0498eed5fe91001ec",
+ "StorageCapacity": 300,
+ "SubnetIds": [
+ "subnet-1234abcd"
+ ],
+ "Tags": [
+ {
+ "Key": "Name",
+ "Value": "MyFileSystem"
+ }
+ ],
+ "VpcId": "vpc-ab1234cd",
+ "WindowsConfiguration": {
+ "ActiveDirectoryId": "d-1234abcd12",
+ "AutomaticBackupRetentionDays": 30,
+ "DailyAutomaticBackupStartTime": "05:00",
+ "ThroughputCapacity": 8,
+ "WeeklyMaintenanceStartTime": "1:05:00"
+ }
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "This operation describes all of the Amazon FSx file systems in an account.",
+ "id": "to-describe-a-file-systems-1481848448460",
+ "title": "To describe an Amazon FSx file system"
+ }
+ ],
+ "ListTagsForResource": [
+ {
+ "input": {
+ "ResourceARN": "arn:aws:fsx:us-east-1:012345678912:file-system/fs-0498eed5fe91001ec"
+ },
+ "output": {
+ "Tags": [
+ {
+ "Key": "Name",
+ "Value": "MyFileSystem"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "This operation lists tags for an Amazon FSx resource.",
+ "id": "to-list-tags-for-a-fsx-resource-1481847318372",
+ "title": "To list tags for a resource"
+ }
+ ],
+ "TagResource": [
+ {
+ "input": {
+ "ResourceARN": "arn:aws:fsx:us-east-1:012345678912:file-system/fs-0498eed5fe91001ec",
+ "Tags": [
+ {
+ "Key": "Name",
+ "Value": "MyFileSystem"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "This operation tags an Amazon FSx resource.",
+ "id": "to-tag-a-fsx-resource-1481847318371",
+ "title": "To tag a resource"
+ }
+ ],
+ "UntagResource": [
+ {
+ "input": {
+ "ResourceARN": "arn:aws:fsx:us-east-1:012345678912:file-system/fs-0498eed5fe91001ec",
+ "TagKeys": [
+ "Name"
+ ]
+ },
+ "comments": {
+ },
+ "description": "This operation untags an Amazon FSx resource.",
+ "id": "to-untag-a-fsx-resource-1481847318373",
+ "title": "To untag a resource"
+ }
+ ],
+ "UpdateFileSystem": [
+ {
+ "input": {
+ "FileSystemId": "fs-0498eed5fe91001ec",
+ "WindowsConfiguration": {
+ "AutomaticBackupRetentionDays": 10,
+ "DailyAutomaticBackupStartTime": "06:00",
+ "WeeklyMaintenanceStartTime": "3:06:00"
+ }
+ },
+ "output": {
+ "FileSystem": {
+ "CreationTime": "1481841524.0",
+ "DNSName": "fs-0498eed5fe91001ec.fsx.com",
+ "FileSystemId": "fs-0498eed5fe91001ec",
+ "KmsKeyId": "arn:aws:kms:us-east-1:012345678912:key/0ff3ea8d-130e-4133-877f-93908b6fdbd6",
+ "Lifecycle": "AVAILABLE",
+ "OwnerId": "012345678912",
+ "ResourceARN": "arn:aws:fsx:us-east-1:012345678912:file-system/fs-0498eed5fe91001ec",
+ "StorageCapacity": 300,
+ "SubnetIds": [
+ "subnet-1234abcd"
+ ],
+ "Tags": [
+ {
+ "Key": "Name",
+ "Value": "MyFileSystem"
+ }
+ ],
+ "VpcId": "vpc-ab1234cd",
+ "WindowsConfiguration": {
+ "AutomaticBackupRetentionDays": 10,
+ "DailyAutomaticBackupStartTime": "06:00",
+ "ThroughputCapacity": 8,
+ "WeeklyMaintenanceStartTime": "3:06:00"
+ }
+ }
+ },
+ "comments": {
+ },
+ "description": "This operation updates an existing file system.",
+ "id": "to-update-a-file-system-1481840798595",
+ "title": "To update an existing file system"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/fsx/2018-03-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/fsx/2018-03-01/paginators-1.json
new file mode 100644
index 00000000..c9536b15
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/fsx/2018-03-01/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "DescribeBackups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Backups"
+ },
+ "DescribeFileSystems": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "FileSystems"
+ },
+ "ListTagsForResource": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Tags"
+ },
+ "DescribeStorageVirtualMachines": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "StorageVirtualMachines"
+ },
+ "DescribeVolumes": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Volumes"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/fsx/2018-03-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/fsx/2018-03-01/service-2.json.gz
new file mode 100644
index 00000000..136026c6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/fsx/2018-03-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/gamelift/2015-10-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/gamelift/2015-10-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..0856ac68
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/gamelift/2015-10-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/gamelift/2015-10-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/gamelift/2015-10-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/gamelift/2015-10-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/gamelift/2015-10-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/gamelift/2015-10-01/paginators-1.json
new file mode 100644
index 00000000..a5a91837
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/gamelift/2015-10-01/paginators-1.json
@@ -0,0 +1,160 @@
+{
+ "pagination": {
+ "DescribeFleetAttributes": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "FleetAttributes"
+ },
+ "DescribeFleetCapacity": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "FleetCapacity"
+ },
+ "DescribeFleetEvents": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "Events"
+ },
+ "DescribeFleetUtilization": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "FleetUtilization"
+ },
+ "DescribeGameSessionDetails": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "GameSessionDetails"
+ },
+ "DescribeGameSessionQueues": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "GameSessionQueues"
+ },
+ "DescribeGameSessions": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "GameSessions"
+ },
+ "DescribeInstances": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "Instances"
+ },
+ "DescribeMatchmakingConfigurations": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "Configurations"
+ },
+ "DescribeMatchmakingRuleSets": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "RuleSets"
+ },
+ "DescribePlayerSessions": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "PlayerSessions"
+ },
+ "DescribeScalingPolicies": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "ScalingPolicies"
+ },
+ "ListAliases": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "Aliases"
+ },
+ "ListBuilds": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "Builds"
+ },
+ "ListFleets": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "FleetIds"
+ },
+ "SearchGameSessions": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "GameSessions"
+ },
+ "DescribeGameServerInstances": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "GameServerInstances"
+ },
+ "ListGameServerGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "GameServerGroups"
+ },
+ "ListGameServers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "GameServers"
+ },
+ "ListScripts": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "Scripts"
+ },
+ "ListCompute": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "ComputeList"
+ },
+ "ListLocations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "Locations"
+ },
+ "ListContainerGroupDefinitions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "ContainerGroupDefinitions"
+ },
+ "ListContainerFleets": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "ContainerFleets"
+ },
+ "ListContainerGroupDefinitionVersions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "ContainerGroupDefinitions"
+ },
+ "ListFleetDeployments": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "FleetDeployments"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/gamelift/2015-10-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/gamelift/2015-10-01/service-2.json.gz
new file mode 100644
index 00000000..d221a5bd
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/gamelift/2015-10-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/gameliftstreams/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/gameliftstreams/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..794e19d0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/gameliftstreams/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/gameliftstreams/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/gameliftstreams/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..a396ef46
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/gameliftstreams/2018-05-10/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListApplications": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListStreamGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListStreamSessions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListStreamSessionsByAccount": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/gameliftstreams/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/gameliftstreams/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..9937ade0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/gameliftstreams/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/gameliftstreams/2018-05-10/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/gameliftstreams/2018-05-10/waiters-2.json
new file mode 100644
index 00000000..2c064b00
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/gameliftstreams/2018-05-10/waiters-2.json
@@ -0,0 +1,88 @@
+{
+ "version" : 2,
+ "waiters" : {
+ "ApplicationDeleted" : {
+ "description" : "Waits until an application is deleted",
+ "delay" : 2,
+ "maxAttempts" : 60,
+ "operation" : "GetApplication",
+ "acceptors" : [ {
+ "matcher" : "error",
+ "state" : "success",
+ "expected" : "ResourceNotFoundException"
+ } ]
+ },
+ "ApplicationReady" : {
+ "description" : "Waits until an application is ready",
+ "delay" : 2,
+ "maxAttempts" : 60,
+ "operation" : "GetApplication",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "Status",
+ "state" : "success",
+ "expected" : "READY"
+ }, {
+ "matcher" : "path",
+ "argument" : "Status",
+ "state" : "failure",
+ "expected" : "ERROR"
+ } ]
+ },
+ "StreamGroupActive" : {
+ "description" : "Waits until a stream group is active",
+ "delay" : 30,
+ "maxAttempts" : 120,
+ "operation" : "GetStreamGroup",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "Status",
+ "state" : "success",
+ "expected" : "ACTIVE"
+ }, {
+ "matcher" : "path",
+ "argument" : "Status",
+ "state" : "failure",
+ "expected" : "ERROR"
+ }, {
+ "matcher" : "path",
+ "argument" : "Status",
+ "state" : "failure",
+ "expected" : "ACTIVE_WITH_ERRORS"
+ }, {
+ "matcher" : "path",
+ "argument" : "Status",
+ "state" : "failure",
+ "expected" : "DELETING"
+ } ]
+ },
+ "StreamGroupDeleted" : {
+ "description" : "Waits until a stream group is deleted",
+ "delay" : 30,
+ "maxAttempts" : 60,
+ "operation" : "GetStreamGroup",
+ "acceptors" : [ {
+ "matcher" : "error",
+ "state" : "success",
+ "expected" : "ResourceNotFoundException"
+ } ]
+ },
+ "StreamSessionActive" : {
+ "description" : "Waits until a stream session is active",
+ "delay" : 2,
+ "maxAttempts" : 60,
+ "operation" : "GetStreamSession",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "Status",
+ "state" : "success",
+ "expected" : "ACTIVE"
+ }, {
+ "matcher" : "path",
+ "argument" : "Status",
+ "state" : "failure",
+ "expected" : "ERROR"
+ } ]
+ }
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/geo-maps/2020-11-19/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/geo-maps/2020-11-19/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..9e27adb1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/geo-maps/2020-11-19/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/geo-maps/2020-11-19/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/geo-maps/2020-11-19/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/geo-maps/2020-11-19/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/geo-maps/2020-11-19/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/geo-maps/2020-11-19/service-2.json.gz
new file mode 100644
index 00000000..59edc056
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/geo-maps/2020-11-19/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/geo-places/2020-11-19/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/geo-places/2020-11-19/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..4fe05d5f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/geo-places/2020-11-19/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/geo-places/2020-11-19/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/geo-places/2020-11-19/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/geo-places/2020-11-19/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/geo-places/2020-11-19/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/geo-places/2020-11-19/service-2.json.gz
new file mode 100644
index 00000000..1cfb9233
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/geo-places/2020-11-19/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/geo-routes/2020-11-19/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/geo-routes/2020-11-19/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..07f52a5d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/geo-routes/2020-11-19/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/geo-routes/2020-11-19/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/geo-routes/2020-11-19/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/geo-routes/2020-11-19/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/geo-routes/2020-11-19/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/geo-routes/2020-11-19/service-2.json.gz
new file mode 100644
index 00000000..6c845b0e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/geo-routes/2020-11-19/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/glacier/2012-06-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/glacier/2012-06-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..1a5e9af4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/glacier/2012-06-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/glacier/2012-06-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/glacier/2012-06-01/examples-1.json
new file mode 100644
index 00000000..7ecea259
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/glacier/2012-06-01/examples-1.json
@@ -0,0 +1,806 @@
+{
+ "version": "1.0",
+ "examples": {
+ "AbortMultipartUpload": [
+ {
+ "input": {
+ "accountId": "-",
+ "uploadId": "19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ",
+ "vaultName": "my-vault"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example deletes an in-progress multipart upload to a vault named my-vault:",
+ "id": "f3d907f6-e71c-420c-8f71-502346a2c48a",
+ "title": "To abort a multipart upload identified by the upload ID"
+ }
+ ],
+ "AbortVaultLock": [
+ {
+ "input": {
+ "accountId": "-",
+ "vaultName": "examplevault"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example aborts the vault locking process if the vault lock is not in the Locked state for the vault named examplevault.",
+ "id": "to-abort-a-vault-lock-1481839357947",
+ "title": "To abort a vault lock"
+ }
+ ],
+ "AddTagsToVault": [
+ {
+ "input": {
+ "Tags": {
+ "examplekey1": "examplevalue1",
+ "examplekey2": "examplevalue2"
+ },
+ "accountId": "-",
+ "vaultName": "my-vault"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example adds two tags to a my-vault.",
+ "id": "add-tags-to-vault-post-tags-add-1481663457694",
+ "title": "To add tags to a vault"
+ }
+ ],
+ "CompleteMultipartUpload": [
+ {
+ "input": {
+ "accountId": "-",
+ "archiveSize": "3145728",
+ "checksum": "9628195fcdbcbbe76cdde456d4646fa7de5f219fb39823836d81f0cc0e18aa67",
+ "uploadId": "19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ",
+ "vaultName": "my-vault"
+ },
+ "output": {
+ "archiveId": "NkbByEejwEggmBz2fTHgJrg0XBoDfjP4q6iu87-TjhqG6eGoOY9Z8i1_AUyUsuhPAdTqLHy8pTl5nfCFJmDl2yEZONi5L26Omw12vcs01MNGntHEQL8MBfGlqrEXAMPLEArchiveId",
+ "checksum": "9628195fcdbcbbe76cdde456d4646fa7de5f219fb39823836d81f0cc0e18aa67",
+ "location": "/111122223333/vaults/my-vault/archives/NkbByEejwEggmBz2fTHgJrg0XBoDfjP4q6iu87-TjhqG6eGoOY9Z8i1_AUyUsuhPAdTqLHy8pTl5nfCFJmDl2yEZONi5L26Omw12vcs01MNGntHEQL8MBfGlqrEXAMPLEArchiveId"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example completes a multipart upload for a 3 MiB archive.",
+ "id": "272aa0b8-e44c-4a64-add2-ad905a37984d",
+ "title": "To complete a multipart upload"
+ }
+ ],
+ "CompleteVaultLock": [
+ {
+ "input": {
+ "accountId": "-",
+ "lockId": "AE863rKkWZU53SLW5be4DUcW",
+ "vaultName": "example-vault"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example completes the vault locking process by transitioning the vault lock from the InProgress state to the Locked state.",
+ "id": "to-complete-a-vault-lock-1481839721312",
+ "title": "To complete a vault lock"
+ }
+ ],
+ "CreateVault": [
+ {
+ "input": {
+ "accountId": "-",
+ "vaultName": "my-vault"
+ },
+ "output": {
+ "location": "/111122223333/vaults/my-vault"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates a new vault named my-vault.",
+ "id": "1dc0313d-ace1-4e6c-9d13-1ec7813b14b7",
+ "title": "To create a new vault"
+ }
+ ],
+ "DeleteArchive": [
+ {
+ "input": {
+ "accountId": "-",
+ "archiveId": "NkbByEejwEggmBz2fTHgJrg0XBoDfjP4q6iu87-TjhqG6eGoOY9Z8i1_AUyUsuhPAdTqLHy8pTl5nfCFJmDl2yEZONi5L26Omw12vcs01MNGntHEQL8MBfGlqrEXAMPLEArchiveId",
+ "vaultName": "examplevault"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example deletes the archive specified by the archive ID.",
+ "id": "delete-archive-1481667809463",
+ "title": "To delete an archive"
+ }
+ ],
+ "DeleteVault": [
+ {
+ "input": {
+ "accountId": "-",
+ "vaultName": "my-vault"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example deletes a vault named my-vault:",
+ "id": "7f7f000b-4bdb-40d2-91e6-7c902f60f60f",
+ "title": "To delete a vault"
+ }
+ ],
+ "DeleteVaultAccessPolicy": [
+ {
+ "input": {
+ "accountId": "-",
+ "vaultName": "examplevault"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example deletes the access policy associated with the vault named examplevault.",
+ "id": "to-delete-the-vault-access-policy-1481840424677",
+ "title": "To delete the vault access policy"
+ }
+ ],
+ "DeleteVaultNotifications": [
+ {
+ "input": {
+ "accountId": "-",
+ "vaultName": "examplevault"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example deletes the notification configuration set for the vault named examplevault.",
+ "id": "to-delete-the-notification-configuration-set-for-a-vault-1481840646090",
+ "title": "To delete the notification configuration set for a vault"
+ }
+ ],
+ "DescribeJob": [
+ {
+ "input": {
+ "accountId": "-",
+ "jobId": "zbxcm3Z_3z5UkoroF7SuZKrxgGoDc3RloGduS7Eg-RO47Yc6FxsdGBgf_Q2DK5Ejh18CnTS5XW4_XqlNHS61dsO4Cn",
+ "vaultName": "my-vault"
+ },
+ "output": {
+ "Action": "InventoryRetrieval",
+ "Completed": false,
+ "CreationDate": "2015-07-17T20:23:41.616Z",
+ "InventoryRetrievalParameters": {
+ "Format": "JSON"
+ },
+ "JobId": "zbxcm3Z_3z5UkoroF7SuZKrxgGoDc3RloGduS7Eg-RO47Yc6FxsdGBgf_Q2DK5Ejh18CnTS5XW4_XqlNHS61dsO4CnMW",
+ "StatusCode": "InProgress",
+ "VaultARN": "arn:aws:glacier:us-west-2:0123456789012:vaults/my-vault"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example returns information about the previously initiated job specified by the job ID.",
+ "id": "to-get-information-about-a-job-you-previously-initiated-1481840928592",
+ "title": "To get information about a previously initiated job"
+ }
+ ],
+ "DescribeVault": [
+ {
+ "input": {
+ "accountId": "-",
+ "vaultName": "my-vault"
+ },
+ "output": {
+ "CreationDate": "2016-09-23T19:27:18.665Z",
+ "NumberOfArchives": 0,
+ "SizeInBytes": 0,
+ "VaultARN": "arn:aws:glacier:us-west-2:111122223333:vaults/my-vault",
+ "VaultName": "my-vault"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example retrieves data about a vault named my-vault.",
+ "id": "3c1c6e9d-f5a2-427a-aa6a-f439eacfc05f",
+ "title": "To retrieve information about a vault"
+ }
+ ],
+ "GetDataRetrievalPolicy": [
+ {
+ "input": {
+ "accountId": "-"
+ },
+ "output": {
+ "Policy": {
+ "Rules": [
+ {
+ "BytesPerHour": 10737418240,
+ "Strategy": "BytesPerHour"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example returns the current data retrieval policy for the account.",
+ "id": "to-get-the-current-data-retrieval-policy-for-the-account-1481851580439",
+ "title": "To get the current data retrieval policy for an account"
+ }
+ ],
+ "GetJobOutput": [
+ {
+ "input": {
+ "accountId": "-",
+ "jobId": "zbxcm3Z_3z5UkoroF7SuZKrxgGoDc3RloGduS7Eg-RO47Yc6FxsdGBgf_Q2DK5Ejh18CnTS5XW4_XqlNHS61dsO4CnMW",
+ "range": "",
+ "vaultName": "my-vaul"
+ },
+ "output": {
+ "acceptRanges": "bytes",
+ "body": "inventory-data",
+ "contentType": "application/json",
+ "status": 200
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example downloads the output of a previously initiated inventory retrieval job that is identified by the job ID.",
+ "id": "to-get-the-output-of-a-previously-initiated-job-1481848550859",
+ "title": "To get the output of a previously initiated job"
+ }
+ ],
+ "GetVaultAccessPolicy": [
+ {
+ "input": {
+ "accountId": "-",
+ "vaultName": "example-vault"
+ },
+ "output": {
+ "policy": {
+ "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Define-owner-access-rights\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::999999999999:root\"},\"Action\":\"glacier:DeleteArchive\",\"Resource\":\"arn:aws:glacier:us-west-2:999999999999:vaults/examplevault\"}]}"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example retrieves the access-policy set on the vault named example-vault.",
+ "id": "to--get-the-access-policy-set-on-the-vault-1481936004590",
+ "title": "To get the access-policy set on the vault"
+ }
+ ],
+ "GetVaultLock": [
+ {
+ "input": {
+ "accountId": "-",
+ "vaultName": "examplevault"
+ },
+ "output": {
+ "CreationDate": "exampledate",
+ "ExpirationDate": "exampledate",
+ "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Define-vault-lock\",\"Effect\":\"Deny\",\"Principal\":{\"AWS\":\"arn:aws:iam::999999999999:root\"},\"Action\":\"glacier:DeleteArchive\",\"Resource\":\"arn:aws:glacier:us-west-2:999999999999:vaults/examplevault\",\"Condition\":{\"NumericLessThanEquals\":{\"glacier:ArchiveAgeinDays\":\"365\"}}}]}",
+ "State": "InProgress"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example retrieves the attributes from the lock-policy subresource set on the vault named examplevault.",
+ "id": "to-retrieve-vault-lock-policy-related-attributes-that-are-set-on-a-vault-1481851363097",
+ "title": "To retrieve vault lock-policy related attributes that are set on a vault"
+ }
+ ],
+ "GetVaultNotifications": [
+ {
+ "input": {
+ "accountId": "-",
+ "vaultName": "my-vault"
+ },
+ "output": {
+ "vaultNotificationConfig": {
+ "Events": [
+ "InventoryRetrievalCompleted",
+ "ArchiveRetrievalCompleted"
+ ],
+ "SNSTopic": "arn:aws:sns:us-west-2:0123456789012:my-vault"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example retrieves the notification-configuration for the vault named my-vault.",
+ "id": "to-get-the-notification-configuration-for-the-specified-vault-1481918746677",
+ "title": "To get the notification-configuration for the specified vault"
+ }
+ ],
+ "InitiateJob": [
+ {
+ "input": {
+ "accountId": "-",
+ "jobParameters": {
+ "Description": "My inventory job",
+ "Format": "CSV",
+ "SNSTopic": "arn:aws:sns:us-west-2:111111111111:Glacier-InventoryRetrieval-topic-Example",
+ "Type": "inventory-retrieval"
+ },
+ "vaultName": "examplevault"
+ },
+ "output": {
+ "jobId": " HkF9p6o7yjhFx-K3CGl6fuSm6VzW9T7esGQfco8nUXVYwS0jlb5gq1JZ55yHgt5vP54ZShjoQzQVVh7vEXAMPLEjobID",
+ "location": "/111122223333/vaults/examplevault/jobs/HkF9p6o7yjhFx-K3CGl6fuSm6VzW9T7esGQfco8nUXVYwS0jlb5gq1JZ55yHgt5vP54ZShjoQzQVVh7vEXAMPLEjobID"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example initiates an inventory-retrieval job for the vault named examplevault.",
+ "id": "to-initiate-an-inventory-retrieval-job-1482186883826",
+ "title": "To initiate an inventory-retrieval job"
+ }
+ ],
+ "InitiateMultipartUpload": [
+ {
+ "input": {
+ "accountId": "-",
+ "partSize": "1048576",
+ "vaultName": "my-vault"
+ },
+ "output": {
+ "location": "/111122223333/vaults/my-vault/multipart-uploads/19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ",
+ "uploadId": "19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example initiates a multipart upload to a vault named my-vault with a part size of 1 MiB (1024 x 1024 bytes) per file.",
+ "id": "72f2db19-3d93-4c74-b2ed-38703baacf49",
+ "title": "To initiate a multipart upload"
+ }
+ ],
+ "InitiateVaultLock": [
+ {
+ "input": {
+ "accountId": "-",
+ "policy": {
+ "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Define-vault-lock\",\"Effect\":\"Deny\",\"Principal\":{\"AWS\":\"arn:aws:iam::999999999999:root\"},\"Action\":\"glacier:DeleteArchive\",\"Resource\":\"arn:aws:glacier:us-west-2:999999999999:vaults/examplevault\",\"Condition\":{\"NumericLessThanEquals\":{\"glacier:ArchiveAgeinDays\":\"365\"}}}]}"
+ },
+ "vaultName": "my-vault"
+ },
+ "output": {
+ "lockId": "AE863rKkWZU53SLW5be4DUcW"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example initiates the vault locking process for the vault named my-vault.",
+ "id": "to-initiate-the-vault-locking-process-1481919693394",
+ "title": "To initiate the vault locking process"
+ }
+ ],
+ "ListJobs": [
+ {
+ "input": {
+ "accountId": "-",
+ "vaultName": "my-vault"
+ },
+ "output": {
+ "JobList": [
+ {
+ "Action": "ArchiveRetrieval",
+ "ArchiveId": "kKB7ymWJVpPSwhGP6ycSOAekp9ZYe_--zM_mw6k76ZFGEIWQX-ybtRDvc2VkPSDtfKmQrj0IRQLSGsNuDp-AJVlu2ccmDSyDUmZwKbwbpAdGATGDiB3hHO0bjbGehXTcApVud_wyDw",
+ "ArchiveSHA256TreeHash": "9628195fcdbcbbe76cdde932d4646fa7de5f219fb39823836d81f0cc0e18aa67",
+ "ArchiveSizeInBytes": 3145728,
+ "Completed": false,
+ "CreationDate": "2015-07-17T21:16:13.840Z",
+ "JobDescription": "Retrieve archive on 2015-07-17",
+ "JobId": "l7IL5-EkXyEY9Ws95fClzIbk2O5uLYaFdAYOi-azsX_Z8V6NH4yERHzars8wTKYQMX6nBDI9cMNHzyZJO59-8N9aHWav",
+ "RetrievalByteRange": "0-3145727",
+ "SHA256TreeHash": "9628195fcdbcbbe76cdde932d4646fa7de5f219fb39823836d81f0cc0e18aa67",
+ "SNSTopic": "arn:aws:sns:us-west-2:0123456789012:my-vault",
+ "StatusCode": "InProgress",
+ "VaultARN": "arn:aws:glacier:us-west-2:0123456789012:vaults/my-vault"
+ },
+ {
+ "Action": "InventoryRetrieval",
+ "Completed": false,
+ "CreationDate": "2015-07-17T20:23:41.616Z",
+ "InventoryRetrievalParameters": {
+ "Format": "JSON"
+ },
+ "JobId": "zbxcm3Z_3z5UkoroF7SuZKrxgGoDc3RloGduS7Eg-RO47Yc6FxsdGBgf_Q2DK5Ejh18CnTS5XW4_XqlNHS61dsO4CnMW",
+ "StatusCode": "InProgress",
+ "VaultARN": "arn:aws:glacier:us-west-2:0123456789012:vaults/my-vault"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example lists jobs for the vault named my-vault.",
+ "id": "to-list-jobs-for-a-vault-1481920530537",
+ "title": "To list jobs for a vault"
+ }
+ ],
+ "ListMultipartUploads": [
+ {
+ "input": {
+ "accountId": "-",
+ "vaultName": "examplevault"
+ },
+ "output": {
+ "Marker": "null",
+ "UploadsList": [
+ {
+ "ArchiveDescription": "archive 1",
+ "CreationDate": "2012-03-19T23:20:59.130Z",
+ "MultipartUploadId": "xsQdFIRsfJr20CW2AbZBKpRZAFTZSJIMtL2hYf8mvp8dM0m4RUzlaqoEye6g3h3ecqB_zqwB7zLDMeSWhwo65re4C4Ev",
+ "PartSizeInBytes": 4194304,
+ "VaultARN": "arn:aws:glacier:us-west-2:012345678901:vaults/examplevault"
+ },
+ {
+ "ArchiveDescription": "archive 2",
+ "CreationDate": "2012-04-01T15:00:00.000Z",
+ "MultipartUploadId": "nPyGOnyFcx67qqX7E-0tSGiRi88hHMOwOxR-_jNyM6RjVMFfV29lFqZ3rNsSaWBugg6OP92pRtufeHdQH7ClIpSF6uJc",
+ "PartSizeInBytes": 4194304,
+ "VaultARN": "arn:aws:glacier:us-west-2:012345678901:vaults/examplevault"
+ },
+ {
+ "ArchiveDescription": "archive 3",
+ "CreationDate": "2012-03-20T17:03:43.221Z",
+ "MultipartUploadId": "qt-RBst_7yO8gVIonIBsAxr2t-db0pE4s8MNeGjKjGdNpuU-cdSAcqG62guwV9r5jh5mLyFPzFEitTpNE7iQfHiu1XoV",
+ "PartSizeInBytes": 4194304,
+ "VaultARN": "arn:aws:glacier:us-west-2:012345678901:vaults/examplevault"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example lists all the in-progress multipart uploads for the vault named examplevault.",
+ "id": "to-list-all-the-in-progress-multipart-uploads-for-a-vault-1481935250590",
+ "title": "To list all the in-progress multipart uploads for a vault"
+ }
+ ],
+ "ListParts": [
+ {
+ "input": {
+ "accountId": "-",
+ "uploadId": "OW2fM5iVylEpFEMM9_HpKowRapC3vn5sSL39_396UW9zLFUWVrnRHaPjUJddQ5OxSHVXjYtrN47NBZ-khxOjyEXAMPLE",
+ "vaultName": "examplevault"
+ },
+ "output": {
+ "ArchiveDescription": "archive description",
+ "CreationDate": "2012-03-20T17:03:43.221Z",
+ "Marker": "null",
+ "MultipartUploadId": "OW2fM5iVylEpFEMM9_HpKowRapC3vn5sSL39_396UW9zLFUWVrnRHaPjUJddQ5OxSHVXjYtrN47NBZ-khxOjyEXAMPLE",
+ "PartSizeInBytes": 4194304,
+ "Parts": [
+ {
+ "RangeInBytes": "0-4194303",
+ "SHA256TreeHash": "01d34dabf7be316472c93b1ef80721f5d4"
+ },
+ {
+ "RangeInBytes": "4194304-8388607",
+ "SHA256TreeHash": "0195875365afda349fc21c84c099987164"
+ }
+ ],
+ "VaultARN": "arn:aws:glacier:us-west-2:012345678901:vaults/demo1-vault"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example lists all the parts of a multipart upload.",
+ "id": "to-list-the-parts-of-an-archive-that-have-been-uploaded-in-a-multipart-upload-1481921767590",
+ "title": "To list the parts of an archive that have been uploaded in a multipart upload"
+ }
+ ],
+ "ListProvisionedCapacity": [
+ {
+ "input": {
+ "accountId": "-"
+ },
+ "output": {
+ "ProvisionedCapacityList": [
+ {
+ "CapacityId": "zSaq7NzHFQDANTfQkDen4V7z",
+ "ExpirationDate": "2016-12-12T00:00:00.000Z",
+ "StartDate": "2016-11-11T20:11:51.095Z"
+ },
+ {
+ "CapacityId": "yXaq7NzHFQNADTfQkDen4V7z",
+ "ExpirationDate": "2017-01-15T00:00:00.000Z",
+ "StartDate": "2016-12-13T20:11:51.095Z"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example lists the provisioned capacity units for an account.",
+ "id": "to-list-the-provisioned-capacity-units-for-an-account-1481923656130",
+ "title": "To list the provisioned capacity units for an account"
+ }
+ ],
+ "ListTagsForVault": [
+ {
+ "input": {
+ "accountId": "-",
+ "vaultName": "examplevault"
+ },
+ "output": {
+ "Tags": {
+ "date": "july2015",
+ "id": "1234"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example lists all the tags attached to the vault examplevault.",
+ "id": "list-tags-for-vault-1481755839720",
+ "title": "To list the tags for a vault"
+ }
+ ],
+ "ListVaults": [
+ {
+ "input": {
+ "accountId": "-",
+ "limit": "",
+ "marker": ""
+ },
+ "output": {
+ "VaultList": [
+ {
+ "CreationDate": "2015-04-06T21:23:45.708Z",
+ "LastInventoryDate": "2015-04-07T00:26:19.028Z",
+ "NumberOfArchives": 1,
+ "SizeInBytes": 3178496,
+ "VaultARN": "arn:aws:glacier:us-west-2:0123456789012:vaults/my-vault",
+ "VaultName": "my-vault"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example lists all vaults owned by the specified AWS account.",
+ "id": "list-vaults-1481753006990",
+ "title": "To list all vaults owned by the calling user's account"
+ }
+ ],
+ "PurchaseProvisionedCapacity": [
+ {
+ "input": {
+ "accountId": "-"
+ },
+ "output": {
+ "capacityId": "zSaq7NzHFQDANTfQkDen4V7z"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example purchases provisioned capacity unit for an AWS account.",
+ "id": "to-purchases-a-provisioned-capacity-unit-for-an-aws-account-1481927446662",
+ "title": "To purchases a provisioned capacity unit for an AWS account"
+ }
+ ],
+ "RemoveTagsFromVault": [
+ {
+ "input": {
+ "TagKeys": [
+ "examplekey1",
+ "examplekey2"
+ ],
+ "accountId": "-",
+ "vaultName": "examplevault"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example removes two tags from the vault named examplevault.",
+ "id": "remove-tags-from-vault-1481754998801",
+ "title": "To remove tags from a vault"
+ }
+ ],
+ "SetDataRetrievalPolicy": [
+ {
+ "input": {
+ "Policy": {
+ "Rules": [
+ {
+ "BytesPerHour": 10737418240,
+ "Strategy": "BytesPerHour"
+ }
+ ]
+ },
+ "accountId": "-"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example sets and then enacts a data retrieval policy.",
+ "id": "to-set-and-then-enact-a-data-retrieval-policy--1481928352408",
+ "title": "To set and then enact a data retrieval policy "
+ }
+ ],
+ "SetVaultAccessPolicy": [
+ {
+ "input": {
+ "accountId": "-",
+ "policy": {
+ "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Define-owner-access-rights\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::999999999999:root\"},\"Action\":\"glacier:DeleteArchive\",\"Resource\":\"arn:aws:glacier:us-west-2:999999999999:vaults/examplevault\"}]}"
+ },
+ "vaultName": "examplevault"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example configures an access policy for the vault named examplevault.",
+ "id": "to--set-the-access-policy-on-a-vault-1482185872517",
+ "title": "To set the access-policy on a vault"
+ }
+ ],
+ "SetVaultNotifications": [
+ {
+ "input": {
+ "accountId": "-",
+ "vaultName": "examplevault",
+ "vaultNotificationConfig": {
+ "Events": [
+ "ArchiveRetrievalCompleted",
+ "InventoryRetrievalCompleted"
+ ],
+ "SNSTopic": "arn:aws:sns:us-west-2:012345678901:mytopic"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example sets the examplevault notification configuration.",
+ "id": "to-configure-a-vault-to-post-a-message-to-an-amazon-simple-notification-service-amazon-sns-topic-when-jobs-complete-1482186397475",
+ "title": "To configure a vault to post a message to an Amazon SNS topic when jobs complete"
+ }
+ ],
+ "UploadArchive": [
+ {
+ "input": {
+ "accountId": "-",
+ "archiveDescription": "",
+ "body": "example-data-to-upload",
+ "checksum": "",
+ "vaultName": "my-vault"
+ },
+ "output": {
+ "archiveId": "kKB7ymWJVpPSwhGP6ycSOAekp9ZYe_--zM_mw6k76ZFGEIWQX-ybtRDvc2VkPSDtfKmQrj0IRQLSGsNuDp-AJVlu2ccmDSyDUmZwKbwbpAdGATGDiB3hHO0bjbGehXTcApVud_wyDw",
+ "checksum": "969fb39823836d81f0cc028195fcdbcbbe76cdde932d4646fa7de5f21e18aa67",
+ "location": "/0123456789012/vaults/my-vault/archives/kKB7ymWJVpPSwhGP6ycSOAekp9ZYe_--zM_mw6k76ZFGEIWQX-ybtRDvc2VkPSDtfKmQrj0IRQLSGsNuDp-AJVlu2ccmDSyDUmZwKbwbpAdGATGDiB3hHO0bjbGehXTcApVud_wyDw"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example adds an archive to a vault.",
+ "id": "upload-archive-1481668510494",
+ "title": "To upload an archive"
+ }
+ ],
+ "UploadMultipartPart": [
+ {
+ "input": {
+ "accountId": "-",
+ "body": "part1",
+ "checksum": "c06f7cd4baacb087002a99a5f48bf953",
+ "range": "bytes 0-1048575/*",
+ "uploadId": "19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ",
+ "vaultName": "examplevault"
+ },
+ "output": {
+ "checksum": "c06f7cd4baacb087002a99a5f48bf953"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The example uploads the first 1 MiB (1024 x 1024 bytes) part of an archive.",
+ "id": "to-upload-the-first-part-of-an-archive-1481835899519",
+ "title": "To upload the first part of an archive"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/glacier/2012-06-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/glacier/2012-06-01/paginators-1.json
new file mode 100644
index 00000000..69691437
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/glacier/2012-06-01/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListJobs": {
+ "input_token": "marker",
+ "output_token": "Marker",
+ "limit_key": "limit",
+ "result_key": "JobList"
+ },
+ "ListMultipartUploads": {
+ "input_token": "marker",
+ "output_token": "Marker",
+ "limit_key": "limit",
+ "result_key": "UploadsList"
+ },
+ "ListParts": {
+ "input_token": "marker",
+ "output_token": "Marker",
+ "limit_key": "limit",
+ "result_key": "Parts"
+ },
+ "ListVaults": {
+ "input_token": "marker",
+ "output_token": "Marker",
+ "limit_key": "limit",
+ "result_key": "VaultList"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/glacier/2012-06-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/glacier/2012-06-01/service-2.json.gz
new file mode 100644
index 00000000..5f9a509a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/glacier/2012-06-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/glacier/2012-06-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/glacier/2012-06-01/waiters-2.json
new file mode 100644
index 00000000..07a64a05
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/glacier/2012-06-01/waiters-2.json
@@ -0,0 +1,39 @@
+{
+ "version": 2,
+ "waiters": {
+ "VaultExists": {
+ "operation": "DescribeVault",
+ "delay": 3,
+ "maxAttempts": 15,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "status",
+ "expected": 200
+ },
+ {
+ "state": "retry",
+ "matcher": "error",
+ "expected": "ResourceNotFoundException"
+ }
+ ]
+ },
+ "VaultNotExists": {
+ "operation": "DescribeVault",
+ "delay": 3,
+ "maxAttempts": 15,
+ "acceptors": [
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 200
+ },
+ {
+ "state": "success",
+ "matcher": "error",
+ "expected": "ResourceNotFoundException"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/globalaccelerator/2018-08-08/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/globalaccelerator/2018-08-08/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..73ac2055
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/globalaccelerator/2018-08-08/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/globalaccelerator/2018-08-08/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/globalaccelerator/2018-08-08/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/globalaccelerator/2018-08-08/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/globalaccelerator/2018-08-08/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/globalaccelerator/2018-08-08/paginators-1.json
new file mode 100644
index 00000000..2a0f8251
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/globalaccelerator/2018-08-08/paginators-1.json
@@ -0,0 +1,70 @@
+{
+ "pagination": {
+ "ListAccelerators": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Accelerators"
+ },
+ "ListEndpointGroups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "EndpointGroups"
+ },
+ "ListListeners": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Listeners"
+ },
+ "ListByoipCidrs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ByoipCidrs"
+ },
+ "ListCustomRoutingAccelerators": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Accelerators"
+ },
+ "ListCustomRoutingListeners": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Listeners"
+ },
+ "ListCustomRoutingPortMappings": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "PortMappings"
+ },
+ "ListCustomRoutingPortMappingsByDestination": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "DestinationPortMappings"
+ },
+ "ListCustomRoutingEndpointGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "EndpointGroups"
+ },
+ "ListCrossAccountAttachments": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "CrossAccountAttachments"
+ },
+ "ListCrossAccountResources": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "CrossAccountResources"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/globalaccelerator/2018-08-08/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/globalaccelerator/2018-08-08/service-2.json.gz
new file mode 100644
index 00000000..6d3943a7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/globalaccelerator/2018-08-08/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/glue/2017-03-31/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/glue/2017-03-31/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..9d3d53e7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/glue/2017-03-31/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/glue/2017-03-31/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/glue/2017-03-31/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/glue/2017-03-31/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/glue/2017-03-31/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/glue/2017-03-31/paginators-1.json
new file mode 100644
index 00000000..98af8a9c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/glue/2017-03-31/paginators-1.json
@@ -0,0 +1,175 @@
+{
+ "pagination": {
+ "GetJobs": {
+ "result_key": "Jobs",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "GetPartitions": {
+ "result_key": "Partitions",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "GetDatabases": {
+ "result_key": "DatabaseList",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "GetClassifiers": {
+ "result_key": "Classifiers",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "GetTableVersions": {
+ "result_key": "TableVersions",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "GetCrawlers": {
+ "result_key": "Crawlers",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "GetDevEndpoints": {
+ "result_key": "DevEndpoints",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "GetJobRuns": {
+ "result_key": "JobRuns",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "GetTriggers": {
+ "result_key": "Triggers",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "GetTables": {
+ "result_key": "TableList",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "GetUserDefinedFunctions": {
+ "result_key": "UserDefinedFunctions",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "GetCrawlerMetrics": {
+ "result_key": "CrawlerMetricsList",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "GetConnections": {
+ "result_key": "ConnectionList",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "GetSecurityConfigurations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "SecurityConfigurations"
+ },
+ "GetPartitionIndexes": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "PartitionIndexDescriptorList"
+ },
+ "GetResourcePolicies": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "GetResourcePoliciesResponseList"
+ },
+ "ListRegistries": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Registries"
+ },
+ "ListSchemaVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Schemas"
+ },
+ "ListSchemas": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Schemas"
+ },
+ "ListUsageProfiles": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Profiles"
+ },
+ "GetWorkflowRuns": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Runs"
+ },
+ "ListBlueprints": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Blueprints"
+ },
+ "ListJobs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "JobNames"
+ },
+ "ListTriggers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TriggerNames"
+ },
+ "ListWorkflows": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Workflows"
+ },
+ "ListTableOptimizerRuns": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TableOptimizerRuns"
+ },
+ "DescribeEntity": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Fields"
+ },
+ "ListConnectionTypes": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ConnectionTypes"
+ },
+ "ListEntities": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Entities"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/glue/2017-03-31/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/glue/2017-03-31/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..4d788b16
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/glue/2017-03-31/paginators-1.sdk-extras.json
@@ -0,0 +1,14 @@
+{
+ "version": 1,
+ "merge": {
+ "pagination": {
+ "ListTableOptimizerRuns": {
+ "non_aggregate_keys": [
+ "CatalogId",
+ "DatabaseName",
+ "TableName"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/glue/2017-03-31/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/glue/2017-03-31/service-2.json.gz
new file mode 100644
index 00000000..9c2bec01
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/glue/2017-03-31/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/grafana/2020-08-18/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/grafana/2020-08-18/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..3881d6e7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/grafana/2020-08-18/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/grafana/2020-08-18/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/grafana/2020-08-18/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/grafana/2020-08-18/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/grafana/2020-08-18/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/grafana/2020-08-18/paginators-1.json
new file mode 100644
index 00000000..55d05f29
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/grafana/2020-08-18/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "ListPermissions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "permissions"
+ },
+ "ListWorkspaces": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "workspaces"
+ },
+ "ListVersions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "grafanaVersions"
+ },
+ "ListWorkspaceServiceAccountTokens": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "serviceAccountTokens"
+ },
+ "ListWorkspaceServiceAccounts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "serviceAccounts"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/grafana/2020-08-18/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/grafana/2020-08-18/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..421e2f65
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/grafana/2020-08-18/paginators-1.sdk-extras.json
@@ -0,0 +1,18 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "ListWorkspaceServiceAccounts": {
+ "non_aggregate_keys": [
+ "workspaceId"
+ ]
+ },
+ "ListWorkspaceServiceAccountTokens": {
+ "non_aggregate_keys": [
+ "serviceAccountId",
+ "workspaceId"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/grafana/2020-08-18/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/grafana/2020-08-18/service-2.json.gz
new file mode 100644
index 00000000..693ad526
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/grafana/2020-08-18/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/greengrass/2017-06-07/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/greengrass/2017-06-07/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..532a133e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/greengrass/2017-06-07/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/greengrass/2017-06-07/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/greengrass/2017-06-07/paginators-1.json
new file mode 100644
index 00000000..303b4384
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/greengrass/2017-06-07/paginators-1.json
@@ -0,0 +1,118 @@
+{
+ "pagination": {
+ "ListBulkDeploymentDetailedReports": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Deployments"
+ },
+ "ListBulkDeployments": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "BulkDeployments"
+ },
+ "ListConnectorDefinitionVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Versions"
+ },
+ "ListConnectorDefinitions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Definitions"
+ },
+ "ListCoreDefinitionVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Versions"
+ },
+ "ListCoreDefinitions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Definitions"
+ },
+ "ListDeployments": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Deployments"
+ },
+ "ListDeviceDefinitionVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Versions"
+ },
+ "ListDeviceDefinitions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Definitions"
+ },
+ "ListFunctionDefinitionVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Versions"
+ },
+ "ListFunctionDefinitions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Definitions"
+ },
+ "ListGroupVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Versions"
+ },
+ "ListGroups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Groups"
+ },
+ "ListLoggerDefinitionVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Versions"
+ },
+ "ListLoggerDefinitions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Definitions"
+ },
+ "ListResourceDefinitionVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Versions"
+ },
+ "ListResourceDefinitions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Definitions"
+ },
+ "ListSubscriptionDefinitionVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Versions"
+ },
+ "ListSubscriptionDefinitions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Definitions"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/greengrass/2017-06-07/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/greengrass/2017-06-07/service-2.json.gz
new file mode 100644
index 00000000..a4cc3e43
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/greengrass/2017-06-07/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/greengrassv2/2020-11-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/greengrassv2/2020-11-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..2b02df7c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/greengrassv2/2020-11-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/greengrassv2/2020-11-30/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/greengrassv2/2020-11-30/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/greengrassv2/2020-11-30/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/greengrassv2/2020-11-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/greengrassv2/2020-11-30/paginators-1.json
new file mode 100644
index 00000000..2e2af05d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/greengrassv2/2020-11-30/paginators-1.json
@@ -0,0 +1,46 @@
+{
+ "pagination": {
+ "ListComponentVersions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "componentVersions"
+ },
+ "ListComponents": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "components"
+ },
+ "ListCoreDevices": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "coreDevices"
+ },
+ "ListDeployments": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "deployments"
+ },
+ "ListEffectiveDeployments": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "effectiveDeployments"
+ },
+ "ListInstalledComponents": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "installedComponents"
+ },
+ "ListClientDevicesAssociatedWithCoreDevice": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "associatedClientDevices"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/greengrassv2/2020-11-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/greengrassv2/2020-11-30/service-2.json.gz
new file mode 100644
index 00000000..faba2671
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/greengrassv2/2020-11-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/groundstation/2019-05-23/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/groundstation/2019-05-23/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..524dbeab
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/groundstation/2019-05-23/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/groundstation/2019-05-23/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/groundstation/2019-05-23/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/groundstation/2019-05-23/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/groundstation/2019-05-23/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/groundstation/2019-05-23/paginators-1.json
new file mode 100644
index 00000000..0ead1107
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/groundstation/2019-05-23/paginators-1.json
@@ -0,0 +1,46 @@
+{
+ "pagination": {
+ "ListConfigs": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "configList"
+ },
+ "ListContacts": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "contactList"
+ },
+ "ListDataflowEndpointGroups": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "dataflowEndpointGroupList"
+ },
+ "ListMissionProfiles": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "missionProfileList"
+ },
+ "ListGroundStations": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "groundStationList"
+ },
+ "ListSatellites": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "satellites"
+ },
+ "ListEphemerides": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "ephemerides"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/groundstation/2019-05-23/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/groundstation/2019-05-23/service-2.json.gz
new file mode 100644
index 00000000..563195a2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/groundstation/2019-05-23/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/groundstation/2019-05-23/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/groundstation/2019-05-23/waiters-2.json
new file mode 100644
index 00000000..c0080e29
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/groundstation/2019-05-23/waiters-2.json
@@ -0,0 +1,22 @@
+{
+ "version" : 2,
+ "waiters" : {
+ "ContactScheduled" : {
+ "description" : "Waits until a contact has been scheduled",
+ "delay" : 5,
+ "maxAttempts" : 180,
+ "operation" : "DescribeContact",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "contactStatus",
+ "state" : "failure",
+ "expected" : "FAILED_TO_SCHEDULE"
+ }, {
+ "matcher" : "path",
+ "argument" : "contactStatus",
+ "state" : "success",
+ "expected" : "SCHEDULED"
+ } ]
+ }
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/guardduty/2017-11-28/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/guardduty/2017-11-28/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..18a5974b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/guardduty/2017-11-28/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/guardduty/2017-11-28/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/guardduty/2017-11-28/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/guardduty/2017-11-28/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/guardduty/2017-11-28/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/guardduty/2017-11-28/paginators-1.json
new file mode 100644
index 00000000..a030d893
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/guardduty/2017-11-28/paginators-1.json
@@ -0,0 +1,64 @@
+{
+ "pagination": {
+ "ListDetectors": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "DetectorIds"
+ },
+ "ListFindings": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "FindingIds"
+ },
+ "ListIPSets": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "IpSetIds"
+ },
+ "ListThreatIntelSets": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ThreatIntelSetIds"
+ },
+ "ListInvitations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Invitations"
+ },
+ "ListMembers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Members"
+ },
+ "ListFilters": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "FilterNames"
+ },
+ "ListOrganizationAdminAccounts": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AdminAccounts"
+ },
+ "DescribeMalwareScans": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Scans"
+ },
+ "ListCoverage": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Resources"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/guardduty/2017-11-28/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/guardduty/2017-11-28/service-2.json.gz
new file mode 100644
index 00000000..cf740a71
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/guardduty/2017-11-28/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/health/2016-08-04/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/health/2016-08-04/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..19615873
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/health/2016-08-04/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/health/2016-08-04/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/health/2016-08-04/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/health/2016-08-04/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/health/2016-08-04/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/health/2016-08-04/paginators-1.json
new file mode 100644
index 00000000..51094812
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/health/2016-08-04/paginators-1.json
@@ -0,0 +1,52 @@
+{
+ "pagination": {
+ "DescribeAffectedEntities": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "entities"
+ },
+ "DescribeEventAggregates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "eventAggregates"
+ },
+ "DescribeEvents": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "events"
+ },
+ "DescribeEventTypes": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "eventTypes"
+ },
+ "DescribeAffectedAccountsForOrganization": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "affectedAccounts",
+ "non_aggregate_keys": [
+ "eventScopeCode"
+ ]
+ },
+ "DescribeAffectedEntitiesForOrganization": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "non_aggregate_keys": [
+ "failedSet"
+ ],
+ "output_token": "nextToken",
+ "result_key": "entities"
+ },
+ "DescribeEventsForOrganization": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "events"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/health/2016-08-04/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/health/2016-08-04/service-2.json.gz
new file mode 100644
index 00000000..59a7cb94
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/health/2016-08-04/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/healthlake/2017-07-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/healthlake/2017-07-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..0e0b23cb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/healthlake/2017-07-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/healthlake/2017-07-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/healthlake/2017-07-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/healthlake/2017-07-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/healthlake/2017-07-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/healthlake/2017-07-01/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/healthlake/2017-07-01/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/healthlake/2017-07-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/healthlake/2017-07-01/service-2.json.gz
new file mode 100644
index 00000000..2bff3ea2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/healthlake/2017-07-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iam/2010-05-08/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iam/2010-05-08/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..73b2713a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iam/2010-05-08/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iam/2010-05-08/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iam/2010-05-08/examples-1.json
new file mode 100644
index 00000000..cd3a94aa
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iam/2010-05-08/examples-1.json
@@ -0,0 +1,1577 @@
+{
+ "version": "1.0",
+ "examples": {
+ "AddClientIDToOpenIDConnectProvider": [
+ {
+ "input": {
+ "ClientID": "my-application-ID",
+ "OpenIDConnectProviderArn": "arn:aws:iam::123456789012:oidc-provider/server.example.com"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following add-client-id-to-open-id-connect-provider command adds the client ID my-application-ID to the OIDC provider named server.example.com:",
+ "id": "028e91f4-e2a6-4d59-9e3b-4965a3fb19be",
+ "title": "To add a client ID (audience) to an Open-ID Connect (OIDC) provider"
+ }
+ ],
+ "AddRoleToInstanceProfile": [
+ {
+ "input": {
+ "InstanceProfileName": "Webserver",
+ "RoleName": "S3Access"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command adds the role named S3Access to the instance profile named Webserver:",
+ "id": "c107fac3-edb6-4827-8a71-8863ec91c81f",
+ "title": "To add a role to an instance profile"
+ }
+ ],
+ "AddUserToGroup": [
+ {
+ "input": {
+ "GroupName": "Admins",
+ "UserName": "Bob"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command adds an IAM user named Bob to the IAM group named Admins:",
+ "id": "619c7e6b-09f8-4036-857b-51a6ea5027ca",
+ "title": "To add a user to an IAM group"
+ }
+ ],
+ "AttachGroupPolicy": [
+ {
+ "input": {
+ "GroupName": "Finance",
+ "PolicyArn": "arn:aws:iam::aws:policy/ReadOnlyAccess"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command attaches the AWS managed policy named ReadOnlyAccess to the IAM group named Finance.",
+ "id": "87551489-86f0-45db-9889-759936778f2b",
+ "title": "To attach a managed policy to an IAM group"
+ }
+ ],
+ "AttachRolePolicy": [
+ {
+ "input": {
+ "PolicyArn": "arn:aws:iam::aws:policy/ReadOnlyAccess",
+ "RoleName": "ReadOnlyRole"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command attaches the AWS managed policy named ReadOnlyAccess to the IAM role named ReadOnlyRole.",
+ "id": "3e1b8c7c-99c8-4fc4-a20c-131fe3f22c7e",
+ "title": "To attach a managed policy to an IAM role"
+ }
+ ],
+ "AttachUserPolicy": [
+ {
+ "input": {
+ "PolicyArn": "arn:aws:iam::aws:policy/AdministratorAccess",
+ "UserName": "Alice"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command attaches the AWS managed policy named AdministratorAccess to the IAM user named Alice.",
+ "id": "1372ebd8-9475-4b1a-a479-23b6fd4b8b3e",
+ "title": "To attach a managed policy to an IAM user"
+ }
+ ],
+ "ChangePassword": [
+ {
+ "input": {
+ "NewPassword": "]35d/{pB9Fo9wJ",
+ "OldPassword": "3s0K_;xh4~8XXI"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command changes the password for the current IAM user.",
+ "id": "3a80c66f-bffb-46df-947c-1e8fa583b470",
+ "title": "To change the password for your IAM user"
+ }
+ ],
+ "CreateAccessKey": [
+ {
+ "input": {
+ "UserName": "Bob"
+ },
+ "output": {
+ "AccessKey": {
+ "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
+ "CreateDate": "2015-03-09T18:39:23.411Z",
+ "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY",
+ "Status": "Active",
+ "UserName": "Bob"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command creates an access key (access key ID and secret access key) for the IAM user named Bob.",
+ "id": "1fbb3211-4cf2-41db-8c20-ba58d9f5802d",
+ "title": "To create an access key for an IAM user"
+ }
+ ],
+ "CreateAccountAlias": [
+ {
+ "input": {
+ "AccountAlias": "examplecorp"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command associates the alias examplecorp to your AWS account.",
+ "id": "5adaf6fb-94fc-4ca2-b825-2fbc2062add1",
+ "title": "To create an account alias"
+ }
+ ],
+ "CreateGroup": [
+ {
+ "input": {
+ "GroupName": "Admins"
+ },
+ "output": {
+ "Group": {
+ "Arn": "arn:aws:iam::123456789012:group/Admins",
+ "CreateDate": "2015-03-09T20:30:24.940Z",
+ "GroupId": "AIDGPMS9RO4H3FEXAMPLE",
+ "GroupName": "Admins",
+ "Path": "/"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command creates an IAM group named Admins.",
+ "id": "d5da2a90-5e69-4ef7-8ae8-4c33dc21fd21",
+ "title": "To create an IAM group"
+ }
+ ],
+ "CreateInstanceProfile": [
+ {
+ "input": {
+ "InstanceProfileName": "Webserver"
+ },
+ "output": {
+ "InstanceProfile": {
+ "Arn": "arn:aws:iam::123456789012:instance-profile/Webserver",
+ "CreateDate": "2015-03-09T20:33:19.626Z",
+ "InstanceProfileId": "AIPAJMBYC7DLSPEXAMPLE",
+ "InstanceProfileName": "Webserver",
+ "Path": "/",
+ "Roles": [
+
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command creates an instance profile named Webserver that is ready to have a role attached and then be associated with an EC2 instance.",
+ "id": "5d84e6ae-5921-4e39-8454-10232cd9ff9a",
+ "title": "To create an instance profile"
+ }
+ ],
+ "CreateLoginProfile": [
+ {
+ "input": {
+ "Password": "h]6EszR}vJ*m",
+ "PasswordResetRequired": true,
+ "UserName": "Bob"
+ },
+ "output": {
+ "LoginProfile": {
+ "CreateDate": "2015-03-10T20:55:40.274Z",
+ "PasswordResetRequired": true,
+ "UserName": "Bob"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command changes IAM user Bob's password and sets the flag that required Bob to change the password the next time he signs in.",
+ "id": "c63795bc-3444-40b3-89df-83c474ef88be",
+ "title": "To create an instance profile"
+ }
+ ],
+ "CreateOpenIDConnectProvider": [
+ {
+ "input": {
+ "ClientIDList": [
+ "my-application-id"
+ ],
+ "ThumbprintList": [
+ "3768084dfb3d2b68b7897bf5f565da8efEXAMPLE"
+ ],
+ "Url": "https://server.example.com"
+ },
+ "output": {
+ "OpenIDConnectProviderArn": "arn:aws:iam::123456789012:oidc-provider/server.example.com"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example defines a new OIDC provider in IAM with a client ID of my-application-id and pointing at the server with a URL of https://server.example.com.",
+ "id": "4e4a6bff-cc97-4406-922e-0ab4a82cdb63",
+ "title": "To create an instance profile"
+ }
+ ],
+ "CreateRole": [
+ {
+ "input": {
+ "AssumeRolePolicyDocument": "<Stringified-JSON>",
+ "Path": "/",
+ "RoleName": "Test-Role"
+ },
+ "output": {
+ "Role": {
+ "Arn": "arn:aws:iam::123456789012:role/Test-Role",
+ "AssumeRolePolicyDocument": "<URL-encoded-JSON>",
+ "CreateDate": "2013-06-07T20:43:32.821Z",
+ "Path": "/",
+ "RoleId": "AKIAIOSFODNN7EXAMPLE",
+ "RoleName": "Test-Role"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command creates a role named Test-Role and attaches a trust policy that you must convert from JSON to a string. Upon success, the response includes the same policy as a URL-encoded JSON string.",
+ "id": "eaaa4b5f-51f1-4f73-b0d3-30127040eff8",
+ "title": "To create an IAM role"
+ }
+ ],
+ "CreateUser": [
+ {
+ "input": {
+ "UserName": "Bob"
+ },
+ "output": {
+ "User": {
+ "Arn": "arn:aws:iam::123456789012:user/Bob",
+ "CreateDate": "2013-06-08T03:20:41.270Z",
+ "Path": "/",
+ "UserId": "AKIAIOSFODNN7EXAMPLE",
+ "UserName": "Bob"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following create-user command creates an IAM user named Bob in the current account.",
+ "id": "eb15f90b-e5f5-4af8-a594-e4e82b181a62",
+ "title": "To create an IAM user"
+ }
+ ],
+ "DeleteAccessKey": [
+ {
+ "input": {
+ "AccessKeyId": "AKIDPMS9RO4H3FEXAMPLE",
+ "UserName": "Bob"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command deletes one access key (access key ID and secret access key) assigned to the IAM user named Bob.",
+ "id": "61a785a7-d30a-415a-ae18-ab9236e56871",
+ "title": "To delete an access key for an IAM user"
+ }
+ ],
+ "DeleteAccountAlias": [
+ {
+ "input": {
+ "AccountAlias": "mycompany"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command removes the alias mycompany from the current AWS account:",
+ "id": "7abeca65-04a8-4500-a890-47f1092bf766",
+ "title": "To delete an account alias"
+ }
+ ],
+ "DeleteAccountPasswordPolicy": [
+ {
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command removes the password policy from the current AWS account:",
+ "id": "9ddf755e-495c-49bc-ae3b-ea6cc9b8ebcf",
+ "title": "To delete the current account password policy"
+ }
+ ],
+ "DeleteGroupPolicy": [
+ {
+ "input": {
+ "GroupName": "Admins",
+ "PolicyName": "ExamplePolicy"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command deletes the policy named ExamplePolicy from the group named Admins:",
+ "id": "e683f2bd-98a4-4fe0-bb66-33169c692d4a",
+ "title": "To delete a policy from an IAM group"
+ }
+ ],
+ "DeleteInstanceProfile": [
+ {
+ "input": {
+ "InstanceProfileName": "ExampleInstanceProfile"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command deletes the instance profile named ExampleInstanceProfile",
+ "id": "12d74fb8-3433-49db-8171-a1fc764e354d",
+ "title": "To delete an instance profile"
+ }
+ ],
+ "DeleteLoginProfile": [
+ {
+ "input": {
+ "UserName": "Bob"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command deletes the password for the IAM user named Bob.",
+ "id": "1fe57059-fc73-42e2-b992-517b7d573b5c",
+ "title": "To delete a password for an IAM user"
+ }
+ ],
+ "DeleteRole": [
+ {
+ "input": {
+ "RoleName": "Test-Role"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command removes the role named Test-Role.",
+ "id": "053cdf74-9bda-44b8-bdbb-140fd5a32603",
+ "title": "To delete an IAM role"
+ }
+ ],
+ "DeleteRolePolicy": [
+ {
+ "input": {
+ "PolicyName": "ExamplePolicy",
+ "RoleName": "Test-Role"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command removes the policy named ExamplePolicy from the role named Test-Role.",
+ "id": "9c667336-fde3-462c-b8f3-950800821e27",
+ "title": "To remove a policy from an IAM role"
+ }
+ ],
+ "DeleteSigningCertificate": [
+ {
+ "input": {
+ "CertificateId": "TA7SMP42TDN5Z26OBPJE7EXAMPLE",
+ "UserName": "Anika"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command deletes the specified signing certificate for the IAM user named Anika.",
+ "id": "e3357586-ba9c-4070-b35b-d1a899b71987",
+ "title": "To delete a signing certificate for an IAM user"
+ }
+ ],
+ "DeleteUser": [
+ {
+ "input": {
+ "UserName": "Bob"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command removes the IAM user named Bob from the current account.",
+ "id": "a13dc3f9-59fe-42d9-abbb-fb98b204fdf0",
+ "title": "To delete an IAM user"
+ }
+ ],
+ "DeleteUserPolicy": [
+ {
+ "input": {
+ "PolicyName": "ExamplePolicy",
+ "UserName": "Juan"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following delete-user-policy command removes the specified policy from the IAM user named Juan:",
+ "id": "34f07ddc-9bc1-4f52-bc59-cd0a3ccd06c8",
+ "title": "To remove a policy from an IAM user"
+ }
+ ],
+ "DeleteVirtualMFADevice": [
+ {
+ "input": {
+ "SerialNumber": "arn:aws:iam::123456789012:mfa/ExampleName"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following delete-virtual-mfa-device command removes the specified MFA device from the current AWS account.",
+ "id": "2933b08b-dbe7-4b89-b8c1-fdf75feea1ee",
+ "title": "To remove a virtual MFA device"
+ }
+ ],
+ "GenerateOrganizationsAccessReport": [
+ {
+ "input": {
+ "EntityPath": "o-a1b2c3d4e5/r-f6g7h8i9j0example/ou-1a2b3c-k9l8m7n6o5example"
+ },
+ "output": {
+ "JobId": "examplea-1234-b567-cde8-90fg123abcd4"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation generates a report for the organizational unit ou-rge0-awexample",
+ "id": "generateorganizationsaccessreport-ou",
+ "title": "To generate a service last accessed data report for an organizational unit"
+ }
+ ],
+ "GenerateServiceLastAccessedDetails": [
+ {
+ "input": {
+ "Arn": "arn:aws:iam::123456789012:policy/ExamplePolicy1"
+ },
+ "output": {
+ "JobId": "examplef-1305-c245-eba4-71fe298bcda7"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation generates a report for the policy: ExamplePolicy1",
+ "id": "generateaccessdata-policy-1541695178514",
+ "title": "To generate a service last accessed data report for a policy"
+ }
+ ],
+ "GetAccountPasswordPolicy": [
+ {
+ "output": {
+ "PasswordPolicy": {
+ "AllowUsersToChangePassword": false,
+ "ExpirePasswords": false,
+ "HardExpiry": false,
+ "MaxPasswordAge": 90,
+ "MinimumPasswordLength": 8,
+ "PasswordReusePrevention": 12,
+ "RequireLowercaseCharacters": false,
+ "RequireNumbers": true,
+ "RequireSymbols": true,
+ "RequireUppercaseCharacters": false
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command displays details about the password policy for the current AWS account.",
+ "id": "5e4598c7-c425-431f-8af1-19073b3c4a5f",
+ "title": "To see the current account password policy"
+ }
+ ],
+ "GetAccountSummary": [
+ {
+ "output": {
+ "SummaryMap": {
+ "AccessKeysPerUserQuota": 2,
+ "AccountAccessKeysPresent": 1,
+ "AccountMFAEnabled": 0,
+ "AccountSigningCertificatesPresent": 0,
+ "AttachedPoliciesPerGroupQuota": 10,
+ "AttachedPoliciesPerRoleQuota": 10,
+ "AttachedPoliciesPerUserQuota": 10,
+ "GlobalEndpointTokenVersion": 2,
+ "GroupPolicySizeQuota": 5120,
+ "Groups": 15,
+ "GroupsPerUserQuota": 10,
+ "GroupsQuota": 100,
+ "MFADevices": 6,
+ "MFADevicesInUse": 3,
+ "Policies": 8,
+ "PoliciesQuota": 1000,
+ "PolicySizeQuota": 5120,
+ "PolicyVersionsInUse": 22,
+ "PolicyVersionsInUseQuota": 10000,
+ "ServerCertificates": 1,
+ "ServerCertificatesQuota": 20,
+ "SigningCertificatesPerUserQuota": 2,
+ "UserPolicySizeQuota": 2048,
+ "Users": 27,
+ "UsersQuota": 5000,
+ "VersionsPerPolicyQuota": 5
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command returns information about the IAM entity quotas and usage in the current AWS account.",
+ "id": "9d8447af-f344-45de-8219-2cebc3cce7f2",
+ "title": "To get information about IAM entity quotas and usage in the current account"
+ }
+ ],
+ "GetInstanceProfile": [
+ {
+ "input": {
+ "InstanceProfileName": "ExampleInstanceProfile"
+ },
+ "output": {
+ "InstanceProfile": {
+ "Arn": "arn:aws:iam::336924118301:instance-profile/ExampleInstanceProfile",
+ "CreateDate": "2013-06-12T23:52:02Z",
+ "InstanceProfileId": "AID2MAB8DPLSRHEXAMPLE",
+ "InstanceProfileName": "ExampleInstanceProfile",
+ "Path": "/",
+ "Roles": [
+ {
+ "Arn": "arn:aws:iam::336924118301:role/Test-Role",
+ "AssumeRolePolicyDocument": "<URL-encoded-JSON>",
+ "CreateDate": "2013-01-09T06:33:26Z",
+ "Path": "/",
+ "RoleId": "AIDGPMS9RO4H3FEXAMPLE",
+ "RoleName": "Test-Role"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command gets information about the instance profile named ExampleInstanceProfile.",
+ "id": "463b9ba5-18cc-4608-9ccb-5a7c6b6e5fe7",
+ "title": "To get information about an instance profile"
+ }
+ ],
+ "GetLoginProfile": [
+ {
+ "input": {
+ "UserName": "Anika"
+ },
+ "output": {
+ "LoginProfile": {
+ "CreateDate": "2012-09-21T23:03:39Z",
+ "UserName": "Anika"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command gets information about the password for the IAM user named Anika.",
+ "id": "d6b580cc-909f-4925-9caa-d425cbc1ad47",
+ "title": "To get password information for an IAM user"
+ }
+ ],
+ "GetOrganizationsAccessReport": [
+ {
+ "input": {
+ "JobId": "examplea-1234-b567-cde8-90fg123abcd4"
+ },
+ "output": {
+ "AccessDetails": [
+ {
+ "EntityPath": "o-a1b2c3d4e5/r-f6g7h8i9j0example/ou-1a2b3c-k9l8m7n6o5example/111122223333",
+ "LastAuthenticatedTime": "2019-05-25T16:29:52Z",
+ "Region": "us-east-1",
+ "ServiceName": "Amazon DynamoDB",
+ "ServiceNamespace": "dynamodb",
+ "TotalAuthenticatedEntities": 2
+ },
+ {
+ "EntityPath": "o-a1b2c3d4e5/r-f6g7h8i9j0example/ou-1a2b3c-k9l8m7n6o5example/123456789012",
+ "LastAuthenticatedTime": "2019-06-15T13:12:06Z",
+ "Region": "us-east-1",
+ "ServiceName": "AWS Identity and Access Management",
+ "ServiceNamespace": "iam",
+ "TotalAuthenticatedEntities": 4
+ },
+ {
+ "ServiceName": "Amazon Simple Storage Service",
+ "ServiceNamespace": "s3",
+ "TotalAuthenticatedEntities": 0
+ }
+ ],
+ "IsTruncated": false,
+ "JobCompletionDate": "2019-06-18T19:47:35.241Z",
+ "JobCreationDate": "2019-06-18T19:47:31.466Z",
+ "JobStatus": "COMPLETED",
+ "NumberOfServicesAccessible": 3,
+ "NumberOfServicesNotAccessed": 1
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation gets details about the report with the job ID: examplea-1234-b567-cde8-90fg123abcd4",
+ "id": "getorganizationsaccessreport-ou",
+ "title": "To get details from a previously generated organizational unit report"
+ }
+ ],
+ "GetRole": [
+ {
+ "input": {
+ "RoleName": "Test-Role"
+ },
+ "output": {
+ "Role": {
+ "Arn": "arn:aws:iam::123456789012:role/Test-Role",
+ "AssumeRolePolicyDocument": "<URL-encoded-JSON>",
+ "CreateDate": "2013-04-18T05:01:58Z",
+ "MaxSessionDuration": 3600,
+ "Path": "/",
+ "RoleId": "AROADBQP57FF2AEXAMPLE",
+ "RoleLastUsed": {
+ "LastUsedDate": "2019-11-18T05:01:58Z",
+ "Region": "us-east-1"
+ },
+ "RoleName": "Test-Role"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command gets information about the role named Test-Role.",
+ "id": "5b7d03a6-340c-472d-aa77-56425950d8b0",
+ "title": "To get information about an IAM role"
+ }
+ ],
+ "GetServiceLastAccessedDetails": [
+ {
+ "input": {
+ "JobId": "examplef-1305-c245-eba4-71fe298bcda7"
+ },
+ "output": {
+ "IsTruncated": false,
+ "JobCompletionDate": "2018-10-24T19:47:35.241Z",
+ "JobCreationDate": "2018-10-24T19:47:31.466Z",
+ "JobStatus": "COMPLETED",
+ "ServicesLastAccessed": [
+ {
+ "LastAuthenticated": "2018-10-24T19:11:00Z",
+ "LastAuthenticatedEntity": "arn:aws:iam::123456789012:user/AWSExampleUser01",
+ "ServiceName": "AWS Identity and Access Management",
+ "ServiceNamespace": "iam",
+ "TotalAuthenticatedEntities": 2
+ },
+ {
+ "ServiceName": "Amazon Simple Storage Service",
+ "ServiceNamespace": "s3",
+ "TotalAuthenticatedEntities": 0
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation gets details about the report with the job ID: examplef-1305-c245-eba4-71fe298bcda7",
+ "id": "getserviceaccessdetails-policy-1541696298085",
+ "title": "To get details from a previously-generated report"
+ }
+ ],
+ "GetServiceLastAccessedDetailsWithEntities": [
+ {
+ "input": {
+ "JobId": "examplef-1305-c245-eba4-71fe298bcda7",
+ "ServiceNamespace": "iam"
+ },
+ "output": {
+ "EntityDetailsList": [
+ {
+ "EntityInfo": {
+ "Arn": "arn:aws:iam::123456789012:user/AWSExampleUser01",
+ "Id": "AIDAEX2EXAMPLEB6IGCDC",
+ "Name": "AWSExampleUser01",
+ "Path": "/",
+ "Type": "USER"
+ },
+ "LastAuthenticated": "2018-10-24T19:10:00Z"
+ },
+ {
+ "EntityInfo": {
+ "Arn": "arn:aws:iam::123456789012:role/AWSExampleRole01",
+ "Id": "AROAEAEXAMPLEIANXSIU4",
+ "Name": "AWSExampleRole01",
+ "Path": "/",
+ "Type": "ROLE"
+ }
+ }
+ ],
+ "IsTruncated": false,
+ "JobCompletionDate": "2018-10-24T19:47:35.241Z",
+ "JobCreationDate": "2018-10-24T19:47:31.466Z",
+ "JobStatus": "COMPLETED"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation returns details about the entities that attempted to access the IAM service.",
+ "id": "getserviceaccessdetailsentity-policy-1541697621384",
+ "title": "To get sntity details from a previously-generated report"
+ }
+ ],
+ "GetUser": [
+ {
+ "input": {
+ "UserName": "Bob"
+ },
+ "output": {
+ "User": {
+ "Arn": "arn:aws:iam::123456789012:user/Bob",
+ "CreateDate": "2012-09-21T23:03:13Z",
+ "Path": "/",
+ "UserId": "AKIAIOSFODNN7EXAMPLE",
+ "UserName": "Bob"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command gets information about the IAM user named Bob.",
+ "id": "ede000a1-9e4c-40db-bd0a-d4f95e41a6ab",
+ "title": "To get information about an IAM user"
+ }
+ ],
+ "ListAccessKeys": [
+ {
+ "input": {
+ "UserName": "Alice"
+ },
+ "output": {
+ "AccessKeyMetadata": [
+ {
+ "AccessKeyId": "AKIA111111111EXAMPLE",
+ "CreateDate": "2016-12-01T22:19:58Z",
+ "Status": "Active",
+ "UserName": "Alice"
+ },
+ {
+ "AccessKeyId": "AKIA222222222EXAMPLE",
+ "CreateDate": "2016-12-01T22:20:01Z",
+ "Status": "Active",
+ "UserName": "Alice"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command lists the access keys IDs for the IAM user named Alice.",
+ "id": "15571463-ebea-411a-a021-1c76bd2a3625",
+ "title": "To list the access key IDs for an IAM user"
+ }
+ ],
+ "ListAccountAliases": [
+ {
+ "input": {
+ },
+ "output": {
+ "AccountAliases": [
+ "exmaple-corporation"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command lists the aliases for the current account.",
+ "id": "e27b457a-16f9-4e05-a006-3df7b3472741",
+ "title": "To list account aliases"
+ }
+ ],
+ "ListGroupPolicies": [
+ {
+ "input": {
+ "GroupName": "Admins"
+ },
+ "output": {
+ "PolicyNames": [
+ "AdminRoot",
+ "KeyPolicy"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command lists the names of in-line policies that are embedded in the IAM group named Admins.",
+ "id": "02de5095-2410-4d3a-ac1b-cc40234af68f",
+ "title": "To list the in-line policies for an IAM group"
+ }
+ ],
+ "ListGroups": [
+ {
+ "input": {
+ },
+ "output": {
+ "Groups": [
+ {
+ "Arn": "arn:aws:iam::123456789012:group/Admins",
+ "CreateDate": "2016-12-15T21:40:08.121Z",
+ "GroupId": "AGPA1111111111EXAMPLE",
+ "GroupName": "Admins",
+ "Path": "/division_abc/subdivision_xyz/"
+ },
+ {
+ "Arn": "arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_1234/engineering/Test",
+ "CreateDate": "2016-11-30T14:10:01.156Z",
+ "GroupId": "AGP22222222222EXAMPLE",
+ "GroupName": "Test",
+ "Path": "/division_abc/subdivision_xyz/product_1234/engineering/"
+ },
+ {
+ "Arn": "arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_1234/Managers",
+ "CreateDate": "2016-06-12T20:14:52.032Z",
+ "GroupId": "AGPI3333333333EXAMPLE",
+ "GroupName": "Managers",
+ "Path": "/division_abc/subdivision_xyz/product_1234/"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command lists the IAM groups in the current account:",
+ "id": "b3ab1380-2a21-42fb-8e85-503f65512c66",
+ "title": "To list the IAM groups for the current account"
+ }
+ ],
+ "ListGroupsForUser": [
+ {
+ "input": {
+ "UserName": "Bob"
+ },
+ "output": {
+ "Groups": [
+ {
+ "Arn": "arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_1234/engineering/Test",
+ "CreateDate": "2016-11-30T14:10:01.156Z",
+ "GroupId": "AGP2111111111EXAMPLE",
+ "GroupName": "Test",
+ "Path": "/division_abc/subdivision_xyz/product_1234/engineering/"
+ },
+ {
+ "Arn": "arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_1234/Managers",
+ "CreateDate": "2016-06-12T20:14:52.032Z",
+ "GroupId": "AGPI222222222SEXAMPLE",
+ "GroupName": "Managers",
+ "Path": "/division_abc/subdivision_xyz/product_1234/"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command displays the groups that the IAM user named Bob belongs to.",
+ "id": "278ec2ee-fc28-4136-83fb-433af0ae46a2",
+ "title": "To list the groups that an IAM user belongs to"
+ }
+ ],
+ "ListPoliciesGrantingServiceAccess": [
+ {
+ "input": {
+ "Arn": "arn:aws:iam::123456789012:user/ExampleUser01",
+ "ServiceNamespaces": [
+ "iam",
+ "ec2"
+ ]
+ },
+ "output": {
+ "IsTruncated": false,
+ "PoliciesGrantingServiceAccess": [
+ {
+ "Policies": [
+ {
+ "PolicyArn": "arn:aws:iam::123456789012:policy/ExampleIamPolicy",
+ "PolicyName": "ExampleIamPolicy",
+ "PolicyType": "MANAGED"
+ },
+ {
+ "EntityName": "AWSExampleGroup1",
+ "EntityType": "GROUP",
+ "PolicyName": "ExampleGroup1Policy",
+ "PolicyType": "INLINE"
+ }
+ ],
+ "ServiceNamespace": "iam"
+ },
+ {
+ "Policies": [
+ {
+ "PolicyArn": "arn:aws:iam::123456789012:policy/ExampleEc2Policy",
+ "PolicyName": "ExampleEc2Policy",
+ "PolicyType": "MANAGED"
+ }
+ ],
+ "ServiceNamespace": "ec2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following operation lists policies that allow ExampleUser01 to access IAM or EC2.",
+ "id": "listpoliciesaccess-user-1541698749508",
+ "title": "To list policies that allow access to a service"
+ }
+ ],
+ "ListRoleTags": [
+ {
+ "input": {
+ "RoleName": "taggedrole1"
+ },
+ "output": {
+ "IsTruncated": false,
+ "Tags": [
+ {
+ "Key": "Dept",
+ "Value": "12345"
+ },
+ {
+ "Key": "Team",
+ "Value": "Accounting"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to list the tags attached to a role.",
+ "id": "to-list-the-tags-attached-to-an-iam-role-1506719238376",
+ "title": "To list the tags attached to an IAM role"
+ }
+ ],
+ "ListSigningCertificates": [
+ {
+ "input": {
+ "UserName": "Bob"
+ },
+ "output": {
+ "Certificates": [
+ {
+ "CertificateBody": "-----BEGIN CERTIFICATE-----<certificate-body>-----END CERTIFICATE-----",
+ "CertificateId": "TA7SMP42TDN5Z26OBPJE7EXAMPLE",
+ "Status": "Active",
+ "UploadDate": "2013-06-06T21:40:08Z",
+ "UserName": "Bob"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command lists the signing certificates for the IAM user named Bob.",
+ "id": "b4c10256-4fc9-457e-b3fd-4a110d4d73dc",
+ "title": "To list the signing certificates for an IAM user"
+ }
+ ],
+ "ListUserTags": [
+ {
+ "input": {
+ "UserName": "anika"
+ },
+ "output": {
+ "IsTruncated": false,
+ "Tags": [
+ {
+ "Key": "Dept",
+ "Value": "12345"
+ },
+ {
+ "Key": "Team",
+ "Value": "Accounting"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to list the tags attached to a user.",
+ "id": "to-list-the-tags-attached-to-an-iam-user-1506719473186",
+ "title": "To list the tags attached to an IAM user"
+ }
+ ],
+ "ListUsers": [
+ {
+ "input": {
+ },
+ "output": {
+ "Users": [
+ {
+ "Arn": "arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/engineering/Juan",
+ "CreateDate": "2012-09-05T19:38:48Z",
+ "PasswordLastUsed": "2016-09-08T21:47:36Z",
+ "Path": "/division_abc/subdivision_xyz/engineering/",
+ "UserId": "AID2MAB8DPLSRHEXAMPLE",
+ "UserName": "Juan"
+ },
+ {
+ "Arn": "arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/engineering/Anika",
+ "CreateDate": "2014-04-09T15:43:45Z",
+ "PasswordLastUsed": "2016-09-24T16:18:07Z",
+ "Path": "/division_abc/subdivision_xyz/engineering/",
+ "UserId": "AIDIODR4TAW7CSEXAMPLE",
+ "UserName": "Anika"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command lists the IAM users in the current account.",
+ "id": "9edfbd73-03d8-4d8a-9a79-76c85e8c8298",
+ "title": "To list IAM users"
+ }
+ ],
+ "ListVirtualMFADevices": [
+ {
+ "input": {
+ },
+ "output": {
+ "VirtualMFADevices": [
+ {
+ "SerialNumber": "arn:aws:iam::123456789012:mfa/ExampleMFADevice"
+ },
+ {
+ "SerialNumber": "arn:aws:iam::123456789012:mfa/Juan"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command lists the virtual MFA devices that have been configured for the current account.",
+ "id": "54f9ac18-5100-4070-bec4-fe5f612710d5",
+ "title": "To list virtual MFA devices"
+ }
+ ],
+ "PutGroupPolicy": [
+ {
+ "input": {
+ "GroupName": "Admins",
+ "PolicyDocument": "{\"Version\":\"2012-10-17\",\"Statement\":{\"Effect\":\"Allow\",\"Action\":\"*\",\"Resource\":\"*\"}}",
+ "PolicyName": "AllPerms"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command adds a policy named AllPerms to the IAM group named Admins.",
+ "id": "4bc17418-758f-4d0f-ab0c-4d00265fec2e",
+ "title": "To add a policy to a group"
+ }
+ ],
+ "PutRolePolicy": [
+ {
+ "input": {
+ "PolicyDocument": "{\"Version\":\"2012-10-17\",\"Statement\":{\"Effect\":\"Allow\",\"Action\":\"s3:*\",\"Resource\":\"*\"}}",
+ "PolicyName": "S3AccessPolicy",
+ "RoleName": "S3Access"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command adds a permissions policy to the role named Test-Role.",
+ "id": "de62fd00-46c7-4601-9e0d-71d5fbb11ecb",
+ "title": "To attach a permissions policy to an IAM role"
+ }
+ ],
+ "PutUserPolicy": [
+ {
+ "input": {
+ "PolicyDocument": "{\"Version\":\"2012-10-17\",\"Statement\":{\"Effect\":\"Allow\",\"Action\":\"*\",\"Resource\":\"*\"}}",
+ "PolicyName": "AllAccessPolicy",
+ "UserName": "Bob"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command attaches a policy to the IAM user named Bob.",
+ "id": "2551ffc6-3576-4d39-823f-30b60bffc2c7",
+ "title": "To attach a policy to an IAM user"
+ }
+ ],
+ "RemoveRoleFromInstanceProfile": [
+ {
+ "input": {
+ "InstanceProfileName": "ExampleInstanceProfile",
+ "RoleName": "Test-Role"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command removes the role named Test-Role from the instance profile named ExampleInstanceProfile.",
+ "id": "6d9f46f1-9f4a-4873-b403-51a85c5c627c",
+ "title": "To remove a role from an instance profile"
+ }
+ ],
+ "RemoveUserFromGroup": [
+ {
+ "input": {
+ "GroupName": "Admins",
+ "UserName": "Bob"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command removes the user named Bob from the IAM group named Admins.",
+ "id": "fb54d5b4-0caf-41d8-af0e-10a84413f174",
+ "title": "To remove a user from an IAM group"
+ }
+ ],
+ "SetSecurityTokenServicePreferences": [
+ {
+ "input": {
+ "GlobalEndpointTokenVersion": "v2Token"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command sets the STS global endpoint token to version 2. Version 2 tokens are valid in all Regions.",
+ "id": "61a785a7-d30a-415a-ae18-ab9236e56871",
+ "title": "To delete an access key for an IAM user"
+ }
+ ],
+ "TagRole": [
+ {
+ "input": {
+ "RoleName": "taggedrole",
+ "Tags": [
+ {
+ "Key": "Dept",
+ "Value": "Accounting"
+ },
+ {
+ "Key": "CostCenter",
+ "Value": "12345"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to add tags to an existing role.",
+ "id": "to-add-a-tag-key-and-value-to-an-iam-role-1506718791513",
+ "title": "To add a tag key and value to an IAM role"
+ }
+ ],
+ "TagUser": [
+ {
+ "input": {
+ "Tags": [
+ {
+ "Key": "Dept",
+ "Value": "Accounting"
+ },
+ {
+ "Key": "CostCenter",
+ "Value": "12345"
+ }
+ ],
+ "UserName": "anika"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to add tags to an existing user.",
+ "id": "to-add-a-tag-key-and-value-to-an-iam-user-1506719044227",
+ "title": "To add a tag key and value to an IAM user"
+ }
+ ],
+ "UntagRole": [
+ {
+ "input": {
+ "RoleName": "taggedrole",
+ "TagKeys": [
+ "Dept"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to remove a tag with the key 'Dept' from a role named 'taggedrole'.",
+ "id": "to-remove-a-tag-from-an-iam-role-1506719589943",
+ "title": "To remove a tag from an IAM role"
+ }
+ ],
+ "UntagUser": [
+ {
+ "input": {
+ "TagKeys": [
+ "Dept"
+ ],
+ "UserName": "anika"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to remove tags that are attached to a user named 'anika'.",
+ "id": "to-remove-a-tag-from-an-iam-user-1506719725554",
+ "title": "To remove a tag from an IAM user"
+ }
+ ],
+ "UpdateAccessKey": [
+ {
+ "input": {
+ "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
+ "Status": "Inactive",
+ "UserName": "Bob"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command deactivates the specified access key (access key ID and secret access key) for the IAM user named Bob.",
+ "id": "02b556fd-e673-49b7-ab6b-f2f9035967d0",
+ "title": "To activate or deactivate an access key for an IAM user"
+ }
+ ],
+ "UpdateAccountPasswordPolicy": [
+ {
+ "input": {
+ "MinimumPasswordLength": 8,
+ "RequireNumbers": true
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command sets the password policy to require a minimum length of eight characters and to require one or more numbers in the password:",
+ "id": "c263a1af-37dc-4423-8dba-9790284ef5e0",
+ "title": "To set or change the current account password policy"
+ }
+ ],
+ "UpdateAssumeRolePolicy": [
+ {
+ "input": {
+ "PolicyDocument": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"ec2.amazonaws.com\"]},\"Action\":[\"sts:AssumeRole\"]}]}",
+ "RoleName": "S3AccessForEC2Instances"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command updates the role trust policy for the role named Test-Role:",
+ "id": "c9150063-d953-4e99-9576-9685872006c6",
+ "title": "To update the trust policy for an IAM role"
+ }
+ ],
+ "UpdateGroup": [
+ {
+ "input": {
+ "GroupName": "Test",
+ "NewGroupName": "Test-1"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command changes the name of the IAM group Test to Test-1.",
+ "id": "f0cf1662-91ae-4278-a80e-7db54256ccba",
+ "title": "To rename an IAM group"
+ }
+ ],
+ "UpdateLoginProfile": [
+ {
+ "input": {
+ "Password": "SomeKindOfPassword123!@#",
+ "UserName": "Bob"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command creates or changes the password for the IAM user named Bob.",
+ "id": "036d9498-ecdb-4ed6-a8d8-366c383d1487",
+ "title": "To change the password for an IAM user"
+ }
+ ],
+ "UpdateSigningCertificate": [
+ {
+ "input": {
+ "CertificateId": "TA7SMP42TDN5Z26OBPJE7EXAMPLE",
+ "Status": "Inactive",
+ "UserName": "Bob"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command changes the status of a signing certificate for a user named Bob to Inactive.",
+ "id": "829aee7b-efc5-4b3b-84a5-7f899b38018d",
+ "title": "To change the active status of a signing certificate for an IAM user"
+ }
+ ],
+ "UpdateUser": [
+ {
+ "input": {
+ "NewUserName": "Robert",
+ "UserName": "Bob"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command changes the name of the IAM user Bob to Robert. It does not change the user's path.",
+ "id": "275d53ed-347a-44e6-b7d0-a96276154352",
+ "title": "To change an IAM user's name"
+ }
+ ],
+ "UploadServerCertificate": [
+ {
+ "input": {
+ "CertificateBody": "-----BEGIN CERTIFICATE-----<a very long certificate text string>-----END CERTIFICATE-----",
+ "Path": "/company/servercerts/",
+ "PrivateKey": "-----BEGIN DSA PRIVATE KEY-----<a very long private key string>-----END DSA PRIVATE KEY-----",
+ "ServerCertificateName": "ProdServerCert"
+ },
+ "output": {
+ "ServerCertificateMetadata": {
+ "Arn": "arn:aws:iam::123456789012:server-certificate/company/servercerts/ProdServerCert",
+ "Expiration": "2012-05-08T01:02:03.004Z",
+ "Path": "/company/servercerts/",
+ "ServerCertificateId": "ASCA1111111111EXAMPLE",
+ "ServerCertificateName": "ProdServerCert",
+ "UploadDate": "2010-05-08T01:02:03.004Z"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following upload-server-certificate command uploads a server certificate to your AWS account:",
+ "id": "06eab6d1-ebf2-4bd9-839d-f7508b9a38b6",
+ "title": "To upload a server certificate to your AWS account"
+ }
+ ],
+ "UploadSigningCertificate": [
+ {
+ "input": {
+ "CertificateBody": "-----BEGIN CERTIFICATE-----<certificate-body>-----END CERTIFICATE-----",
+ "UserName": "Bob"
+ },
+ "output": {
+ "Certificate": {
+ "CertificateBody": "-----BEGIN CERTIFICATE-----<certificate-body>-----END CERTIFICATE-----",
+ "CertificateId": "ID123456789012345EXAMPLE",
+ "Status": "Active",
+ "UploadDate": "2015-06-06T21:40:08.121Z",
+ "UserName": "Bob"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following command uploads a signing certificate for the IAM user named Bob.",
+ "id": "e67489b6-7b73-4e30-9ed3-9a9e0231e458",
+ "title": "To upload a signing certificate for an IAM user"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iam/2010-05-08/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iam/2010-05-08/paginators-1.json
new file mode 100644
index 00000000..91c09a21
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iam/2010-05-08/paginators-1.json
@@ -0,0 +1,254 @@
+{
+ "pagination": {
+ "GetAccountAuthorizationDetails": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": [
+ "UserDetailList",
+ "GroupDetailList",
+ "RoleDetailList",
+ "Policies"
+ ]
+ },
+ "GetGroup": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "Users",
+ "non_aggregate_keys": [
+ "Group"
+ ]
+ },
+ "ListAccessKeys": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "AccessKeyMetadata"
+ },
+ "ListAccountAliases": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "AccountAliases"
+ },
+ "ListAttachedGroupPolicies": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "AttachedPolicies"
+ },
+ "ListAttachedRolePolicies": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "AttachedPolicies"
+ },
+ "ListAttachedUserPolicies": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "AttachedPolicies"
+ },
+ "ListEntitiesForPolicy": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": [
+ "PolicyGroups",
+ "PolicyUsers",
+ "PolicyRoles"
+ ]
+ },
+ "ListGroupPolicies": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "PolicyNames"
+ },
+ "ListGroups": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "Groups"
+ },
+ "ListGroupsForUser": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "Groups"
+ },
+ "ListInstanceProfiles": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "InstanceProfiles"
+ },
+ "ListInstanceProfilesForRole": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "InstanceProfiles"
+ },
+ "ListMFADevices": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "MFADevices"
+ },
+ "ListPolicies": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "Policies"
+ },
+ "ListPolicyVersions": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "Versions"
+ },
+ "ListRolePolicies": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "PolicyNames"
+ },
+ "ListRoles": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "Roles"
+ },
+ "ListServerCertificates": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "ServerCertificateMetadataList"
+ },
+ "ListSigningCertificates": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "Certificates"
+ },
+ "ListSSHPublicKeys": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "SSHPublicKeys"
+ },
+ "ListUserPolicies": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "PolicyNames"
+ },
+ "ListUsers": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "Users"
+ },
+ "ListVirtualMFADevices": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "VirtualMFADevices"
+ },
+ "SimulateCustomPolicy": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "EvaluationResults"
+ },
+ "SimulatePrincipalPolicy": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "EvaluationResults"
+ },
+ "ListUserTags": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "Tags"
+ },
+ "ListInstanceProfileTags": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "Tags"
+ },
+ "ListMFADeviceTags": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "Tags"
+ },
+ "ListOpenIDConnectProviderTags": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "Tags"
+ },
+ "ListPolicyTags": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "Tags"
+ },
+ "ListRoleTags": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "Tags"
+ },
+ "ListSAMLProviderTags": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "Tags"
+ },
+ "ListServerCertificateTags": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "more_results": "IsTruncated",
+ "output_token": "Marker",
+ "result_key": "Tags"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iam/2010-05-08/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iam/2010-05-08/service-2.json.gz
new file mode 100644
index 00000000..ae441c4e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iam/2010-05-08/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iam/2010-05-08/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/iam/2010-05-08/waiters-2.json
new file mode 100644
index 00000000..62480415
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iam/2010-05-08/waiters-2.json
@@ -0,0 +1,73 @@
+{
+ "version": 2,
+ "waiters": {
+ "InstanceProfileExists": {
+ "delay": 1,
+ "operation": "GetInstanceProfile",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": 200,
+ "matcher": "status",
+ "state": "success"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 404
+ }
+ ]
+ },
+ "UserExists": {
+ "delay": 1,
+ "operation": "GetUser",
+ "maxAttempts": 20,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "status",
+ "expected": 200
+ },
+ {
+ "state": "retry",
+ "matcher": "error",
+ "expected": "NoSuchEntity"
+ }
+ ]
+ },
+ "RoleExists": {
+ "delay": 1,
+ "operation": "GetRole",
+ "maxAttempts": 20,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "status",
+ "expected": 200
+ },
+ {
+ "state": "retry",
+ "matcher": "error",
+ "expected": "NoSuchEntity"
+ }
+ ]
+ },
+ "PolicyExists": {
+ "delay": 1,
+ "operation": "GetPolicy",
+ "maxAttempts": 20,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "status",
+ "expected": 200
+ },
+ {
+ "state": "retry",
+ "matcher": "error",
+ "expected": "NoSuchEntity"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/identitystore/2020-06-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/identitystore/2020-06-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..6e7f6510
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/identitystore/2020-06-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/identitystore/2020-06-15/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/identitystore/2020-06-15/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/identitystore/2020-06-15/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/identitystore/2020-06-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/identitystore/2020-06-15/paginators-1.json
new file mode 100644
index 00000000..766e7c46
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/identitystore/2020-06-15/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListGroupMemberships": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "GroupMemberships"
+ },
+ "ListGroupMembershipsForMember": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "GroupMemberships"
+ },
+ "ListGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Groups"
+ },
+ "ListUsers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Users"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/identitystore/2020-06-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/identitystore/2020-06-15/service-2.json.gz
new file mode 100644
index 00000000..42dd37f5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/identitystore/2020-06-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/imagebuilder/2019-12-02/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/imagebuilder/2019-12-02/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..60c4108a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/imagebuilder/2019-12-02/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/imagebuilder/2019-12-02/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/imagebuilder/2019-12-02/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/imagebuilder/2019-12-02/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/imagebuilder/2019-12-02/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/imagebuilder/2019-12-02/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/imagebuilder/2019-12-02/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/imagebuilder/2019-12-02/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/imagebuilder/2019-12-02/service-2.json.gz
new file mode 100644
index 00000000..ee574d74
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/imagebuilder/2019-12-02/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/importexport/2010-06-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/importexport/2010-06-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..7fc87ff9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/importexport/2010-06-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/importexport/2010-06-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/importexport/2010-06-01/paginators-1.json
new file mode 100644
index 00000000..702385ea
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/importexport/2010-06-01/paginators-1.json
@@ -0,0 +1,11 @@
+{
+ "pagination": {
+ "ListJobs": {
+ "input_token": "Marker",
+ "output_token": "Jobs[-1].JobId",
+ "more_results": "IsTruncated",
+ "limit_key": "MaxJobs",
+ "result_key": "Jobs"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/importexport/2010-06-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/importexport/2010-06-01/service-2.json.gz
new file mode 100644
index 00000000..9d422555
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/importexport/2010-06-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/inspector-scan/2023-08-08/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/inspector-scan/2023-08-08/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..12ea8016
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/inspector-scan/2023-08-08/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/inspector-scan/2023-08-08/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/inspector-scan/2023-08-08/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/inspector-scan/2023-08-08/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/inspector-scan/2023-08-08/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/inspector-scan/2023-08-08/service-2.json.gz
new file mode 100644
index 00000000..b3900e14
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/inspector-scan/2023-08-08/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/inspector/2015-08-18/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/inspector/2015-08-18/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..777e0611
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/inspector/2015-08-18/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/inspector/2015-08-18/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/inspector/2015-08-18/service-2.json.gz
new file mode 100644
index 00000000..3f50f7a9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/inspector/2015-08-18/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/inspector/2016-02-16/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/inspector/2016-02-16/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..14cf1a5a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/inspector/2016-02-16/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/inspector/2016-02-16/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/inspector/2016-02-16/examples-1.json
new file mode 100644
index 00000000..05b541f0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/inspector/2016-02-16/examples-1.json
@@ -0,0 +1,1148 @@
+{
+ "version": "1.0",
+ "examples": {
+ "AddAttributesToFindings": [
+ {
+ "input": {
+ "attributes": [
+ {
+ "key": "Example",
+ "value": "example"
+ }
+ ],
+ "findingArns": [
+ "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-8l1VIE0D/run/0-Z02cjjug/finding/0-T8yM9mEU"
+ ]
+ },
+ "output": {
+ "failedItems": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Assigns attributes (key and value pairs) to the findings that are specified by the ARNs of the findings.",
+ "id": "add-attributes-to-findings-1481063856401",
+ "title": "Add attributes to findings"
+ }
+ ],
+ "CreateAssessmentTarget": [
+ {
+ "input": {
+ "assessmentTargetName": "ExampleAssessmentTarget",
+ "resourceGroupArn": "arn:aws:inspector:us-west-2:123456789012:resourcegroup/0-AB6DMKnv"
+ },
+ "output": {
+ "assessmentTargetArn": "arn:aws:inspector:us-west-2:123456789012:target/0-nvgVhaxX"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Creates a new assessment target using the ARN of the resource group that is generated by CreateResourceGroup. You can create up to 50 assessment targets per AWS account. You can run up to 500 concurrent agents per AWS account.",
+ "id": "create-assessment-target-1481063953657",
+ "title": "Create assessment target"
+ }
+ ],
+ "CreateAssessmentTemplate": [
+ {
+ "input": {
+ "assessmentTargetArn": "arn:aws:inspector:us-west-2:123456789012:target/0-nvgVhaxX",
+ "assessmentTemplateName": "ExampleAssessmentTemplate",
+ "durationInSeconds": 180,
+ "rulesPackageArns": [
+ "arn:aws:inspector:us-west-2:758058086616:rulespackage/0-11B9DBXp"
+ ],
+ "userAttributesForFindings": [
+ {
+ "key": "Example",
+ "value": "example"
+ }
+ ]
+ },
+ "output": {
+ "assessmentTemplateArn": "arn:aws:inspector:us-west-2:123456789012:target/0-nvgVhaxX/template/0-it5r2S4T"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Creates an assessment template for the assessment target that is specified by the ARN of the assessment target.",
+ "id": "create-assessment-template-1481064046719",
+ "title": "Create assessment template"
+ }
+ ],
+ "CreateResourceGroup": [
+ {
+ "input": {
+ "resourceGroupTags": [
+ {
+ "key": "Name",
+ "value": "example"
+ }
+ ]
+ },
+ "output": {
+ "resourceGroupArn": "arn:aws:inspector:us-west-2:123456789012:resourcegroup/0-AB6DMKnv"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Creates a resource group using the specified set of tags (key and value pairs) that are used to select the EC2 instances to be included in an Amazon Inspector assessment target. The created resource group is then used to create an Amazon Inspector assessment target. ",
+ "id": "create-resource-group-1481064169037",
+ "title": "Create resource group"
+ }
+ ],
+ "DeleteAssessmentRun": [
+ {
+ "input": {
+ "assessmentRunArn": "arn:aws:inspector:us-west-2:123456789012:target/0-nvgVhaxX/template/0-it5r2S4T/run/0-11LMTAVe"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Deletes the assessment run that is specified by the ARN of the assessment run.",
+ "id": "delete-assessment-run-1481064251629",
+ "title": "Delete assessment run"
+ }
+ ],
+ "DeleteAssessmentTarget": [
+ {
+ "input": {
+ "assessmentTargetArn": "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Deletes the assessment target that is specified by the ARN of the assessment target.",
+ "id": "delete-assessment-target-1481064309029",
+ "title": "Delete assessment target"
+ }
+ ],
+ "DeleteAssessmentTemplate": [
+ {
+ "input": {
+ "assessmentTemplateArn": "arn:aws:inspector:us-west-2:123456789012:target/0-nvgVhaxX/template/0-it5r2S4T"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Deletes the assessment template that is specified by the ARN of the assessment template.",
+ "id": "delete-assessment-template-1481064364074",
+ "title": "Delete assessment template"
+ }
+ ],
+ "DescribeAssessmentRuns": [
+ {
+ "input": {
+ "assessmentRunArns": [
+ "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-4r1V2mAw/run/0-MKkpXXPE"
+ ]
+ },
+ "output": {
+ "assessmentRuns": [
+ {
+ "name": "Run 1 for ExampleAssessmentTemplate",
+ "arn": "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-4r1V2mAw/run/0-MKkpXXPE",
+ "assessmentTemplateArn": "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-4r1V2mAw",
+ "completedAt": "1458680301.4",
+ "createdAt": "1458680170.035",
+ "dataCollected": true,
+ "durationInSeconds": 3600,
+ "findingCounts": {
+ "High": 14,
+ "Informational": 0,
+ "Low": 0,
+ "Medium": 2,
+ "Undefined": 0
+ },
+ "notifications": [
+
+ ],
+ "rulesPackageArns": [
+ "arn:aws:inspector:us-west-2:758058086616:rulespackage/0-X1KXtawP"
+ ],
+ "startedAt": "1458680170.161",
+ "state": "COMPLETED",
+ "stateChangedAt": "1458680301.4",
+ "stateChanges": [
+ {
+ "state": "CREATED",
+ "stateChangedAt": "1458680170.035"
+ },
+ {
+ "state": "START_DATA_COLLECTION_PENDING",
+ "stateChangedAt": "1458680170.065"
+ },
+ {
+ "state": "START_DATA_COLLECTION_IN_PROGRESS",
+ "stateChangedAt": "1458680170.096"
+ },
+ {
+ "state": "COLLECTING_DATA",
+ "stateChangedAt": "1458680170.161"
+ },
+ {
+ "state": "STOP_DATA_COLLECTION_PENDING",
+ "stateChangedAt": "1458680239.883"
+ },
+ {
+ "state": "DATA_COLLECTED",
+ "stateChangedAt": "1458680299.847"
+ },
+ {
+ "state": "EVALUATING_RULES",
+ "stateChangedAt": "1458680300.099"
+ },
+ {
+ "state": "COMPLETED",
+ "stateChangedAt": "1458680301.4"
+ }
+ ],
+ "userAttributesForFindings": [
+
+ ]
+ }
+ ],
+ "failedItems": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Describes the assessment runs that are specified by the ARNs of the assessment runs.",
+ "id": "describte-assessment-runs-1481064424352",
+ "title": "Describte assessment runs"
+ }
+ ],
+ "DescribeAssessmentTargets": [
+ {
+ "input": {
+ "assessmentTargetArns": [
+ "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq"
+ ]
+ },
+ "output": {
+ "assessmentTargets": [
+ {
+ "name": "ExampleAssessmentTarget",
+ "arn": "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq",
+ "createdAt": "1458074191.459",
+ "resourceGroupArn": "arn:aws:inspector:us-west-2:123456789012:resourcegroup/0-PyGXopAI",
+ "updatedAt": "1458074191.459"
+ }
+ ],
+ "failedItems": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Describes the assessment targets that are specified by the ARNs of the assessment targets.",
+ "id": "describte-assessment-targets-1481064527735",
+ "title": "Describte assessment targets"
+ }
+ ],
+ "DescribeAssessmentTemplates": [
+ {
+ "input": {
+ "assessmentTemplateArns": [
+ "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-4r1V2mAw"
+ ]
+ },
+ "output": {
+ "assessmentTemplates": [
+ {
+ "name": "ExampleAssessmentTemplate",
+ "arn": "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-4r1V2mAw",
+ "assessmentRunCount": 0,
+ "assessmentTargetArn": "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq",
+ "createdAt": "1458074191.844",
+ "durationInSeconds": 3600,
+ "rulesPackageArns": [
+ "arn:aws:inspector:us-west-2:758058086616:rulespackage/0-X1KXtawP"
+ ],
+ "userAttributesForFindings": [
+
+ ]
+ }
+ ],
+ "failedItems": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Describes the assessment templates that are specified by the ARNs of the assessment templates.",
+ "id": "describte-assessment-templates-1481064606829",
+ "title": "Describte assessment templates"
+ }
+ ],
+ "DescribeCrossAccountAccessRole": [
+ {
+ "output": {
+ "registeredAt": "1458069182.826",
+ "roleArn": "arn:aws:iam::123456789012:role/inspector",
+ "valid": true
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Describes the IAM role that enables Amazon Inspector to access your AWS account.",
+ "id": "describte-cross-account-access-role-1481064682267",
+ "title": "Describte cross account access role"
+ }
+ ],
+ "DescribeFindings": [
+ {
+ "input": {
+ "findingArns": [
+ "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-4r1V2mAw/run/0-MKkpXXPE/finding/0-HwPnsDm4"
+ ]
+ },
+ "output": {
+ "failedItems": {
+ },
+ "findings": [
+ {
+ "arn": "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-4r1V2mAw/run/0-MKkpXXPE/finding/0-HwPnsDm4",
+ "assetAttributes": {
+ "ipv4Addresses": [
+
+ ],
+ "schemaVersion": 1
+ },
+ "assetType": "ec2-instance",
+ "attributes": [
+
+ ],
+ "confidence": 10,
+ "createdAt": "1458680301.37",
+ "description": "Amazon Inspector did not find any potential security issues during this assessment.",
+ "indicatorOfCompromise": false,
+ "numericSeverity": 0,
+ "recommendation": "No remediation needed.",
+ "schemaVersion": 1,
+ "service": "Inspector",
+ "serviceAttributes": {
+ "assessmentRunArn": "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-4r1V2mAw/run/0-MKkpXXPE",
+ "rulesPackageArn": "arn:aws:inspector:us-west-2:758058086616:rulespackage/0-X1KXtawP",
+ "schemaVersion": 1
+ },
+ "severity": "Informational",
+ "title": "No potential security issues found",
+ "updatedAt": "1458680301.37",
+ "userAttributes": [
+
+ ]
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Describes the findings that are specified by the ARNs of the findings.",
+ "id": "describte-findings-1481064771803",
+ "title": "Describe findings"
+ }
+ ],
+ "DescribeResourceGroups": [
+ {
+ "input": {
+ "resourceGroupArns": [
+ "arn:aws:inspector:us-west-2:123456789012:resourcegroup/0-PyGXopAI"
+ ]
+ },
+ "output": {
+ "failedItems": {
+ },
+ "resourceGroups": [
+ {
+ "arn": "arn:aws:inspector:us-west-2:123456789012:resourcegroup/0-PyGXopAI",
+ "createdAt": "1458074191.098",
+ "tags": [
+ {
+ "key": "Name",
+ "value": "example"
+ }
+ ]
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Describes the resource groups that are specified by the ARNs of the resource groups.",
+ "id": "describe-resource-groups-1481065787743",
+ "title": "Describe resource groups"
+ }
+ ],
+ "DescribeRulesPackages": [
+ {
+ "input": {
+ "rulesPackageArns": [
+ "arn:aws:inspector:us-west-2:758058086616:rulespackage/0-JJOtZiqQ"
+ ]
+ },
+ "output": {
+ "failedItems": {
+ },
+ "rulesPackages": [
+ {
+ "version": "1.1",
+ "name": "Security Best Practices",
+ "arn": "arn:aws:inspector:us-west-2:758058086616:rulespackage/0-JJOtZiqQ",
+ "description": "The rules in this package help determine whether your systems are configured securely.",
+ "provider": "Amazon Web Services, Inc."
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Describes the rules packages that are specified by the ARNs of the rules packages.",
+ "id": "describe-rules-packages-1481069641979",
+ "title": "Describe rules packages"
+ }
+ ],
+ "GetTelemetryMetadata": [
+ {
+ "input": {
+ "assessmentRunArn": "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-4r1V2mAw/run/0-MKkpXXPE"
+ },
+ "output": {
+ "telemetryMetadata": [
+ {
+ "count": 2,
+ "dataSize": 345,
+ "messageType": "InspectorDuplicateProcess"
+ },
+ {
+ "count": 3,
+ "dataSize": 255,
+ "messageType": "InspectorTimeEventMsg"
+ },
+ {
+ "count": 4,
+ "dataSize": 1082,
+ "messageType": "InspectorNetworkInterface"
+ },
+ {
+ "count": 2,
+ "dataSize": 349,
+ "messageType": "InspectorDnsEntry"
+ },
+ {
+ "count": 11,
+ "dataSize": 2514,
+ "messageType": "InspectorDirectoryInfoMsg"
+ },
+ {
+ "count": 1,
+ "dataSize": 179,
+ "messageType": "InspectorTcpV6ListeningPort"
+ },
+ {
+ "count": 101,
+ "dataSize": 10949,
+ "messageType": "InspectorTerminal"
+ },
+ {
+ "count": 26,
+ "dataSize": 5916,
+ "messageType": "InspectorUser"
+ },
+ {
+ "count": 282,
+ "dataSize": 32148,
+ "messageType": "InspectorDynamicallyLoadedCodeModule"
+ },
+ {
+ "count": 18,
+ "dataSize": 10172,
+ "messageType": "InspectorCreateProcess"
+ },
+ {
+ "count": 3,
+ "dataSize": 8001,
+ "messageType": "InspectorProcessPerformance"
+ },
+ {
+ "count": 1,
+ "dataSize": 360,
+ "messageType": "InspectorOperatingSystem"
+ },
+ {
+ "count": 6,
+ "dataSize": 546,
+ "messageType": "InspectorStopProcess"
+ },
+ {
+ "count": 1,
+ "dataSize": 1553,
+ "messageType": "InspectorInstanceMetaData"
+ },
+ {
+ "count": 2,
+ "dataSize": 434,
+ "messageType": "InspectorTcpV4Connection"
+ },
+ {
+ "count": 474,
+ "dataSize": 2960322,
+ "messageType": "InspectorPackageInfo"
+ },
+ {
+ "count": 3,
+ "dataSize": 2235,
+ "messageType": "InspectorSystemPerformance"
+ },
+ {
+ "count": 105,
+ "dataSize": 46048,
+ "messageType": "InspectorCodeModule"
+ },
+ {
+ "count": 1,
+ "dataSize": 182,
+ "messageType": "InspectorUdpV6ListeningPort"
+ },
+ {
+ "count": 2,
+ "dataSize": 371,
+ "messageType": "InspectorUdpV4ListeningPort"
+ },
+ {
+ "count": 18,
+ "dataSize": 8362,
+ "messageType": "InspectorKernelModule"
+ },
+ {
+ "count": 29,
+ "dataSize": 48788,
+ "messageType": "InspectorConfigurationInfo"
+ },
+ {
+ "count": 1,
+ "dataSize": 79,
+ "messageType": "InspectorMonitoringStart"
+ },
+ {
+ "count": 5,
+ "dataSize": 0,
+ "messageType": "InspectorSplitMsgBegin"
+ },
+ {
+ "count": 51,
+ "dataSize": 4593,
+ "messageType": "InspectorGroup"
+ },
+ {
+ "count": 1,
+ "dataSize": 184,
+ "messageType": "InspectorTcpV4ListeningPort"
+ },
+ {
+ "count": 1159,
+ "dataSize": 3146579,
+ "messageType": "Total"
+ },
+ {
+ "count": 5,
+ "dataSize": 0,
+ "messageType": "InspectorSplitMsgEnd"
+ },
+ {
+ "count": 1,
+ "dataSize": 612,
+ "messageType": "InspectorLoadImageInProcess"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Information about the data that is collected for the specified assessment run.",
+ "id": "get-telemetry-metadata-1481066021297",
+ "title": "Get telemetry metadata"
+ }
+ ],
+ "ListAssessmentRunAgents": [
+ {
+ "input": {
+ "assessmentRunArn": "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-4r1V2mAw/run/0-MKkpXXPE",
+ "maxResults": 123
+ },
+ "output": {
+ "assessmentRunAgents": [
+ {
+ "agentHealth": "HEALTHY",
+ "agentHealthCode": "RUNNING",
+ "agentId": "i-49113b93",
+ "assessmentRunArn": "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-4r1V2mAw/run/0-MKkpXXPE",
+ "telemetryMetadata": [
+ {
+ "count": 2,
+ "dataSize": 345,
+ "messageType": "InspectorDuplicateProcess"
+ },
+ {
+ "count": 3,
+ "dataSize": 255,
+ "messageType": "InspectorTimeEventMsg"
+ },
+ {
+ "count": 4,
+ "dataSize": 1082,
+ "messageType": "InspectorNetworkInterface"
+ },
+ {
+ "count": 2,
+ "dataSize": 349,
+ "messageType": "InspectorDnsEntry"
+ },
+ {
+ "count": 11,
+ "dataSize": 2514,
+ "messageType": "InspectorDirectoryInfoMsg"
+ },
+ {
+ "count": 1,
+ "dataSize": 179,
+ "messageType": "InspectorTcpV6ListeningPort"
+ },
+ {
+ "count": 101,
+ "dataSize": 10949,
+ "messageType": "InspectorTerminal"
+ },
+ {
+ "count": 26,
+ "dataSize": 5916,
+ "messageType": "InspectorUser"
+ },
+ {
+ "count": 282,
+ "dataSize": 32148,
+ "messageType": "InspectorDynamicallyLoadedCodeModule"
+ },
+ {
+ "count": 18,
+ "dataSize": 10172,
+ "messageType": "InspectorCreateProcess"
+ },
+ {
+ "count": 3,
+ "dataSize": 8001,
+ "messageType": "InspectorProcessPerformance"
+ },
+ {
+ "count": 1,
+ "dataSize": 360,
+ "messageType": "InspectorOperatingSystem"
+ },
+ {
+ "count": 6,
+ "dataSize": 546,
+ "messageType": "InspectorStopProcess"
+ },
+ {
+ "count": 1,
+ "dataSize": 1553,
+ "messageType": "InspectorInstanceMetaData"
+ },
+ {
+ "count": 2,
+ "dataSize": 434,
+ "messageType": "InspectorTcpV4Connection"
+ },
+ {
+ "count": 474,
+ "dataSize": 2960322,
+ "messageType": "InspectorPackageInfo"
+ },
+ {
+ "count": 3,
+ "dataSize": 2235,
+ "messageType": "InspectorSystemPerformance"
+ },
+ {
+ "count": 105,
+ "dataSize": 46048,
+ "messageType": "InspectorCodeModule"
+ },
+ {
+ "count": 1,
+ "dataSize": 182,
+ "messageType": "InspectorUdpV6ListeningPort"
+ },
+ {
+ "count": 2,
+ "dataSize": 371,
+ "messageType": "InspectorUdpV4ListeningPort"
+ },
+ {
+ "count": 18,
+ "dataSize": 8362,
+ "messageType": "InspectorKernelModule"
+ },
+ {
+ "count": 29,
+ "dataSize": 48788,
+ "messageType": "InspectorConfigurationInfo"
+ },
+ {
+ "count": 1,
+ "dataSize": 79,
+ "messageType": "InspectorMonitoringStart"
+ },
+ {
+ "count": 5,
+ "dataSize": 0,
+ "messageType": "InspectorSplitMsgBegin"
+ },
+ {
+ "count": 51,
+ "dataSize": 4593,
+ "messageType": "InspectorGroup"
+ },
+ {
+ "count": 1,
+ "dataSize": 184,
+ "messageType": "InspectorTcpV4ListeningPort"
+ },
+ {
+ "count": 1159,
+ "dataSize": 3146579,
+ "messageType": "Total"
+ },
+ {
+ "count": 5,
+ "dataSize": 0,
+ "messageType": "InspectorSplitMsgEnd"
+ },
+ {
+ "count": 1,
+ "dataSize": 612,
+ "messageType": "InspectorLoadImageInProcess"
+ }
+ ]
+ }
+ ],
+ "nextToken": "1"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists the agents of the assessment runs that are specified by the ARNs of the assessment runs.",
+ "id": "list-assessment-run-agents-1481918140642",
+ "title": "List assessment run agents"
+ }
+ ],
+ "ListAssessmentRuns": [
+ {
+ "input": {
+ "assessmentTemplateArns": [
+ "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-4r1V2mAw"
+ ],
+ "maxResults": 123
+ },
+ "output": {
+ "assessmentRunArns": [
+ "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-4r1V2mAw/run/0-MKkpXXPE",
+ "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-4r1V2mAw/run/0-v5D6fI3v"
+ ],
+ "nextToken": "1"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists the assessment runs that correspond to the assessment templates that are specified by the ARNs of the assessment templates.",
+ "id": "list-assessment-runs-1481066340844",
+ "title": "List assessment runs"
+ }
+ ],
+ "ListAssessmentTargets": [
+ {
+ "input": {
+ "maxResults": 123
+ },
+ "output": {
+ "assessmentTargetArns": [
+ "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq"
+ ],
+ "nextToken": "1"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists the ARNs of the assessment targets within this AWS account. ",
+ "id": "list-assessment-targets-1481066540849",
+ "title": "List assessment targets"
+ }
+ ],
+ "ListAssessmentTemplates": [
+ {
+ "input": {
+ "assessmentTargetArns": [
+ "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq"
+ ],
+ "maxResults": 123
+ },
+ "output": {
+ "assessmentTemplateArns": [
+ "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-4r1V2mAw",
+ "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-Uza6ihLh"
+ ],
+ "nextToken": "1"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists the assessment templates that correspond to the assessment targets that are specified by the ARNs of the assessment targets.",
+ "id": "list-assessment-templates-1481066623520",
+ "title": "List assessment templates"
+ }
+ ],
+ "ListEventSubscriptions": [
+ {
+ "input": {
+ "maxResults": 123,
+ "resourceArn": "arn:aws:inspector:us-west-2:123456789012:target/0-nvgVhaxX/template/0-7sbz2Kz0"
+ },
+ "output": {
+ "nextToken": "1",
+ "subscriptions": [
+ {
+ "eventSubscriptions": [
+ {
+ "event": "ASSESSMENT_RUN_COMPLETED",
+ "subscribedAt": "1459455440.867"
+ }
+ ],
+ "resourceArn": "arn:aws:inspector:us-west-2:123456789012:target/0-nvgVhaxX/template/0-7sbz2Kz0",
+ "topicArn": "arn:aws:sns:us-west-2:123456789012:exampletopic"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists all the event subscriptions for the assessment template that is specified by the ARN of the assessment template. ",
+ "id": "list-event-subscriptions-1481068376945",
+ "title": "List event subscriptions"
+ }
+ ],
+ "ListFindings": [
+ {
+ "input": {
+ "assessmentRunArns": [
+ "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-4r1V2mAw/run/0-MKkpXXPE"
+ ],
+ "maxResults": 123
+ },
+ "output": {
+ "findingArns": [
+ "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-4r1V2mAw/run/0-MKkpXXPE/finding/0-HwPnsDm4",
+ "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-4r1V2mAw/run/0-v5D6fI3v/finding/0-tyvmqBLy"
+ ],
+ "nextToken": "1"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists findings that are generated by the assessment runs that are specified by the ARNs of the assessment runs.",
+ "id": "list-findings-1481066840611",
+ "title": "List findings"
+ }
+ ],
+ "ListRulesPackages": [
+ {
+ "input": {
+ "maxResults": 123
+ },
+ "output": {
+ "nextToken": "1",
+ "rulesPackageArns": [
+ "arn:aws:inspector:us-west-2:758058086616:rulespackage/0-9hgA516p",
+ "arn:aws:inspector:us-west-2:758058086616:rulespackage/0-H5hpSawc",
+ "arn:aws:inspector:us-west-2:758058086616:rulespackage/0-JJOtZiqQ",
+ "arn:aws:inspector:us-west-2:758058086616:rulespackage/0-vg5GGHSD"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists all available Amazon Inspector rules packages.",
+ "id": "list-rules-packages-1481066954883",
+ "title": "List rules packages"
+ }
+ ],
+ "ListTagsForResource": [
+ {
+ "input": {
+ "resourceArn": "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-gcwFliYu"
+ },
+ "output": {
+ "tags": [
+ {
+ "key": "Name",
+ "value": "Example"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists all tags associated with an assessment template.",
+ "id": "list-tags-for-resource-1481067025240",
+ "title": "List tags for resource"
+ }
+ ],
+ "PreviewAgents": [
+ {
+ "input": {
+ "maxResults": 123,
+ "previewAgentsArn": "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq"
+ },
+ "output": {
+ "agentPreviews": [
+ {
+ "agentId": "i-49113b93"
+ }
+ ],
+ "nextToken": "1"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Previews the agents installed on the EC2 instances that are part of the specified assessment target.",
+ "id": "preview-agents-1481067101888",
+ "title": "Preview agents"
+ }
+ ],
+ "RegisterCrossAccountAccessRole": [
+ {
+ "input": {
+ "roleArn": "arn:aws:iam::123456789012:role/inspector"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Registers the IAM role that Amazon Inspector uses to list your EC2 instances at the start of the assessment run or when you call the PreviewAgents action.",
+ "id": "register-cross-account-access-role-1481067178301",
+ "title": "Register cross account access role"
+ }
+ ],
+ "RemoveAttributesFromFindings": [
+ {
+ "input": {
+ "attributeKeys": [
+ "key=Example,value=example"
+ ],
+ "findingArns": [
+ "arn:aws:inspector:us-west-2:123456789012:target/0-0kFIPusq/template/0-8l1VIE0D/run/0-Z02cjjug/finding/0-T8yM9mEU"
+ ]
+ },
+ "output": {
+ "failedItems": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Removes entire attributes (key and value pairs) from the findings that are specified by the ARNs of the findings where an attribute with the specified key exists.",
+ "id": "remove-attributes-from-findings-1481067246548",
+ "title": "Remove attributes from findings"
+ }
+ ],
+ "SetTagsForResource": [
+ {
+ "input": {
+ "resourceArn": "arn:aws:inspector:us-west-2:123456789012:target/0-nvgVhaxX/template/0-7sbz2Kz0",
+ "tags": [
+ {
+ "key": "Example",
+ "value": "example"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Sets tags (key and value pairs) to the assessment template that is specified by the ARN of the assessment template.",
+ "id": "set-tags-for-resource-1481067329646",
+ "title": "Set tags for resource"
+ }
+ ],
+ "StartAssessmentRun": [
+ {
+ "input": {
+ "assessmentRunName": "examplerun",
+ "assessmentTemplateArn": "arn:aws:inspector:us-west-2:123456789012:target/0-nvgVhaxX/template/0-it5r2S4T"
+ },
+ "output": {
+ "assessmentRunArn": "arn:aws:inspector:us-west-2:123456789012:target/0-nvgVhaxX/template/0-it5r2S4T/run/0-jOoroxyY"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Starts the assessment run specified by the ARN of the assessment template. For this API to function properly, you must not exceed the limit of running up to 500 concurrent agents per AWS account.",
+ "id": "start-assessment-run-1481067407484",
+ "title": "Start assessment run"
+ }
+ ],
+ "StopAssessmentRun": [
+ {
+ "input": {
+ "assessmentRunArn": "arn:aws:inspector:us-west-2:123456789012:target/0-nvgVhaxX/template/0-it5r2S4T/run/0-11LMTAVe"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Stops the assessment run that is specified by the ARN of the assessment run.",
+ "id": "stop-assessment-run-1481067502857",
+ "title": "Stop assessment run"
+ }
+ ],
+ "SubscribeToEvent": [
+ {
+ "input": {
+ "event": "ASSESSMENT_RUN_COMPLETED",
+ "resourceArn": "arn:aws:inspector:us-west-2:123456789012:target/0-nvgVhaxX/template/0-7sbz2Kz0",
+ "topicArn": "arn:aws:sns:us-west-2:123456789012:exampletopic"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Enables the process of sending Amazon Simple Notification Service (SNS) notifications about a specified event to a specified SNS topic.",
+ "id": "subscribe-to-event-1481067686031",
+ "title": "Subscribe to event"
+ }
+ ],
+ "UnsubscribeFromEvent": [
+ {
+ "input": {
+ "event": "ASSESSMENT_RUN_COMPLETED",
+ "resourceArn": "arn:aws:inspector:us-west-2:123456789012:target/0-nvgVhaxX/template/0-7sbz2Kz0",
+ "topicArn": "arn:aws:sns:us-west-2:123456789012:exampletopic"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Disables the process of sending Amazon Simple Notification Service (SNS) notifications about a specified event to a specified SNS topic.",
+ "id": "unsubscribe-from-event-1481067781705",
+ "title": "Unsubscribe from event"
+ }
+ ],
+ "UpdateAssessmentTarget": [
+ {
+ "input": {
+ "assessmentTargetArn": "arn:aws:inspector:us-west-2:123456789012:target/0-nvgVhaxX",
+ "assessmentTargetName": "Example",
+ "resourceGroupArn": "arn:aws:inspector:us-west-2:123456789012:resourcegroup/0-yNbgL5Pt"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Updates the assessment target that is specified by the ARN of the assessment target.",
+ "id": "update-assessment-target-1481067866692",
+ "title": "Update assessment target"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/inspector/2016-02-16/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/inspector/2016-02-16/paginators-1.json
new file mode 100644
index 00000000..8dec0410
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/inspector/2016-02-16/paginators-1.json
@@ -0,0 +1,58 @@
+{
+ "pagination": {
+ "ListFindings": {
+ "result_key": "findingArns",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "ListAssessmentTemplates": {
+ "result_key": "assessmentTemplateArns",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "PreviewAgents": {
+ "result_key": "agentPreviews",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "ListEventSubscriptions": {
+ "result_key": "subscriptions",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "ListRulesPackages": {
+ "result_key": "rulesPackageArns",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "ListAssessmentRunAgents": {
+ "result_key": "assessmentRunAgents",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "ListAssessmentRuns": {
+ "result_key": "assessmentRunArns",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "ListAssessmentTargets": {
+ "result_key": "assessmentTargetArns",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "ListExclusions": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "exclusionArns"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/inspector/2016-02-16/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/inspector/2016-02-16/service-2.json.gz
new file mode 100644
index 00000000..450f6bd3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/inspector/2016-02-16/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/inspector2/2020-06-08/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/inspector2/2020-06-08/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..927b22e5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/inspector2/2020-06-08/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/inspector2/2020-06-08/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/inspector2/2020-06-08/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/inspector2/2020-06-08/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/inspector2/2020-06-08/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/inspector2/2020-06-08/paginators-1.json
new file mode 100644
index 00000000..0c1854b9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/inspector2/2020-06-08/paginators-1.json
@@ -0,0 +1,92 @@
+{
+ "pagination": {
+ "ListAccountPermissions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "permissions"
+ },
+ "ListCoverage": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "coveredResources"
+ },
+ "ListCoverageStatistics": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "countsByGroup"
+ },
+ "ListDelegatedAdminAccounts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "delegatedAdminAccounts"
+ },
+ "ListFilters": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "filters"
+ },
+ "ListFindingAggregations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "responses"
+ },
+ "ListFindings": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "findings"
+ },
+ "ListMembers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "members"
+ },
+ "ListUsageTotals": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "totals"
+ },
+ "SearchVulnerabilities": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "vulnerabilities"
+ },
+ "GetCisScanResultDetails": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "scanResultDetails"
+ },
+ "ListCisScanConfigurations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "scanConfigurations"
+ },
+ "ListCisScanResultsAggregatedByChecks": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "checkAggregations"
+ },
+ "ListCisScanResultsAggregatedByTargetResource": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "targetResourceAggregations"
+ },
+ "ListCisScans": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "scans"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/inspector2/2020-06-08/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/inspector2/2020-06-08/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..b01a0bfc
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/inspector2/2020-06-08/paginators-1.sdk-extras.json
@@ -0,0 +1,17 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "ListFindingAggregations": {
+ "non_aggregate_keys": [
+ "aggregationType"
+ ]
+ },
+ "ListCoverageStatistics": {
+ "non_aggregate_keys": [
+ "totalCounts"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/inspector2/2020-06-08/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/inspector2/2020-06-08/service-2.json.gz
new file mode 100644
index 00000000..c81cd5bc
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/inspector2/2020-06-08/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/internetmonitor/2021-06-03/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/internetmonitor/2021-06-03/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..a77824c5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/internetmonitor/2021-06-03/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/internetmonitor/2021-06-03/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/internetmonitor/2021-06-03/paginators-1.json
new file mode 100644
index 00000000..c08ea4f0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/internetmonitor/2021-06-03/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListHealthEvents": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "HealthEvents"
+ },
+ "ListMonitors": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Monitors"
+ },
+ "ListInternetEvents": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "InternetEvents"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/internetmonitor/2021-06-03/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/internetmonitor/2021-06-03/service-2.json.gz
new file mode 100644
index 00000000..beaee730
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/internetmonitor/2021-06-03/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/internetmonitor/2021-06-03/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/internetmonitor/2021-06-03/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/internetmonitor/2021-06-03/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/invoicing/2024-12-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/invoicing/2024-12-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..a3bd3cca
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/invoicing/2024-12-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/invoicing/2024-12-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/invoicing/2024-12-01/paginators-1.json
new file mode 100644
index 00000000..86020635
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/invoicing/2024-12-01/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListInvoiceUnits": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "InvoiceUnits"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/invoicing/2024-12-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/invoicing/2024-12-01/service-2.json.gz
new file mode 100644
index 00000000..df1f8ee5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/invoicing/2024-12-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/invoicing/2024-12-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/invoicing/2024-12-01/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/invoicing/2024-12-01/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iot-data/2015-05-28/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iot-data/2015-05-28/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..094d9f3d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iot-data/2015-05-28/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iot-data/2015-05-28/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iot-data/2015-05-28/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iot-data/2015-05-28/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iot-data/2015-05-28/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iot-data/2015-05-28/paginators-1.json
new file mode 100644
index 00000000..26d4a561
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iot-data/2015-05-28/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListRetainedMessages": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "retainedTopics"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iot-data/2015-05-28/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iot-data/2015-05-28/service-2.json.gz
new file mode 100644
index 00000000..f964bb04
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iot-data/2015-05-28/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iot-jobs-data/2017-09-29/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iot-jobs-data/2017-09-29/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..888700b4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iot-jobs-data/2017-09-29/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iot-jobs-data/2017-09-29/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iot-jobs-data/2017-09-29/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iot-jobs-data/2017-09-29/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iot-jobs-data/2017-09-29/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iot-jobs-data/2017-09-29/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iot-jobs-data/2017-09-29/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iot-jobs-data/2017-09-29/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iot-jobs-data/2017-09-29/service-2.json.gz
new file mode 100644
index 00000000..e674f363
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iot-jobs-data/2017-09-29/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iot-managed-integrations/2025-03-03/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iot-managed-integrations/2025-03-03/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..9f69baba
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iot-managed-integrations/2025-03-03/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iot-managed-integrations/2025-03-03/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iot-managed-integrations/2025-03-03/paginators-1.json
new file mode 100644
index 00000000..ecd0686d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iot-managed-integrations/2025-03-03/paginators-1.json
@@ -0,0 +1,70 @@
+{
+ "pagination": {
+ "ListCredentialLockers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListDestinations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "DestinationList"
+ },
+ "ListEventLogConfigurations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "EventLogConfigurationList"
+ },
+ "ListManagedThingSchemas": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListManagedThings": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListNotificationConfigurations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "NotificationConfigurationList"
+ },
+ "ListOtaTaskConfigurations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListOtaTaskExecutions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ExecutionSummaries"
+ },
+ "ListOtaTasks": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Tasks"
+ },
+ "ListProvisioningProfiles": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListSchemaVersions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iot-managed-integrations/2025-03-03/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iot-managed-integrations/2025-03-03/service-2.json.gz
new file mode 100644
index 00000000..123b2562
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iot-managed-integrations/2025-03-03/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iot/2015-05-28/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iot/2015-05-28/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..a6686825
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iot/2015-05-28/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iot/2015-05-28/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iot/2015-05-28/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iot/2015-05-28/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iot/2015-05-28/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iot/2015-05-28/paginators-1.json
new file mode 100644
index 00000000..4b227cd5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iot/2015-05-28/paginators-1.json
@@ -0,0 +1,390 @@
+{
+ "pagination": {
+ "ListCACertificates": {
+ "input_token": "marker",
+ "output_token": "nextMarker",
+ "limit_key": "pageSize",
+ "result_key": "certificates"
+ },
+ "ListCertificates": {
+ "input_token": "marker",
+ "output_token": "nextMarker",
+ "limit_key": "pageSize",
+ "result_key": "certificates"
+ },
+ "ListCertificatesByCA": {
+ "input_token": "marker",
+ "output_token": "nextMarker",
+ "limit_key": "pageSize",
+ "result_key": "certificates"
+ },
+ "ListOutgoingCertificates": {
+ "input_token": "marker",
+ "output_token": "nextMarker",
+ "limit_key": "pageSize",
+ "result_key": "outgoingCertificates"
+ },
+ "ListPolicies": {
+ "input_token": "marker",
+ "output_token": "nextMarker",
+ "limit_key": "pageSize",
+ "result_key": "policies"
+ },
+ "ListPolicyPrincipals": {
+ "input_token": "marker",
+ "output_token": "nextMarker",
+ "limit_key": "pageSize",
+ "result_key": "principals"
+ },
+ "ListPrincipalPolicies": {
+ "input_token": "marker",
+ "output_token": "nextMarker",
+ "limit_key": "pageSize",
+ "result_key": "policies"
+ },
+ "ListPrincipalThings": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "things"
+ },
+ "ListThingTypes": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "thingTypes"
+ },
+ "ListThings": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "things"
+ },
+ "ListTopicRules": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "rules"
+ },
+ "ListActiveViolations": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "activeViolations"
+ },
+ "ListAttachedPolicies": {
+ "input_token": "marker",
+ "limit_key": "pageSize",
+ "output_token": "nextMarker",
+ "result_key": "policies"
+ },
+ "ListAuditFindings": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "findings"
+ },
+ "ListAuditTasks": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "tasks"
+ },
+ "ListAuthorizers": {
+ "input_token": "marker",
+ "limit_key": "pageSize",
+ "output_token": "nextMarker",
+ "result_key": "authorizers"
+ },
+ "ListBillingGroups": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "billingGroups"
+ },
+ "ListIndices": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "indexNames"
+ },
+ "ListJobExecutionsForJob": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "executionSummaries"
+ },
+ "ListJobExecutionsForThing": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "executionSummaries"
+ },
+ "ListJobs": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "jobs"
+ },
+ "ListOTAUpdates": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "otaUpdates"
+ },
+ "ListRoleAliases": {
+ "input_token": "marker",
+ "limit_key": "pageSize",
+ "output_token": "nextMarker",
+ "result_key": "roleAliases"
+ },
+ "ListScheduledAudits": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "scheduledAudits"
+ },
+ "ListSecurityProfiles": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "securityProfileIdentifiers"
+ },
+ "ListSecurityProfilesForTarget": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "securityProfileTargetMappings"
+ },
+ "ListStreams": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "streams"
+ },
+ "ListTagsForResource": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "tags"
+ },
+ "ListTargetsForPolicy": {
+ "input_token": "marker",
+ "limit_key": "pageSize",
+ "output_token": "nextMarker",
+ "result_key": "targets"
+ },
+ "ListTargetsForSecurityProfile": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "securityProfileTargets"
+ },
+ "ListThingGroups": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "thingGroups"
+ },
+ "ListThingGroupsForThing": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "thingGroups"
+ },
+ "ListThingRegistrationTasks": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "taskIds"
+ },
+ "ListThingsInBillingGroup": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "things"
+ },
+ "ListThingsInThingGroup": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "things"
+ },
+ "ListV2LoggingLevels": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "logTargetConfigurations"
+ },
+ "ListViolationEvents": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "violationEvents"
+ },
+ "ListAuditMitigationActionsExecutions": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "actionsExecutions"
+ },
+ "ListAuditMitigationActionsTasks": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "tasks"
+ },
+ "ListAuditSuppressions": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "suppressions"
+ },
+ "ListDimensions": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "dimensionNames"
+ },
+ "ListDomainConfigurations": {
+ "input_token": "marker",
+ "limit_key": "pageSize",
+ "output_token": "nextMarker",
+ "result_key": "domainConfigurations"
+ },
+ "ListMitigationActions": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "actionIdentifiers"
+ },
+ "ListProvisioningTemplateVersions": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "versions"
+ },
+ "ListProvisioningTemplates": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "templates"
+ },
+ "ListThingRegistrationTaskReports": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "non_aggregate_keys": [
+ "reportType"
+ ],
+ "output_token": "nextToken",
+ "result_key": "resourceLinks"
+ },
+ "ListTopicRuleDestinations": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "destinationSummaries"
+ },
+ "ListThingPrincipals": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "principals"
+ },
+ "GetBehaviorModelTrainingSummaries": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "summaries"
+ },
+ "ListCustomMetrics": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "metricNames"
+ },
+ "ListDetectMitigationActionsExecutions": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "actionsExecutions"
+ },
+ "ListDetectMitigationActionsTasks": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "tasks"
+ },
+ "ListFleetMetrics": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "fleetMetrics"
+ },
+ "ListJobTemplates": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "jobTemplates"
+ },
+ "ListMetricValues": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "metricDatumList"
+ },
+ "ListManagedJobTemplates": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "managedJobTemplates"
+ },
+ "ListRelatedResourcesForAuditFinding": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "relatedResources"
+ },
+ "ListPackageVersions": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "packageVersionSummaries"
+ },
+ "ListPackages": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "packageSummaries"
+ },
+ "ListSbomValidationResults": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "validationResultSummaries"
+ },
+ "ListPrincipalThingsV2": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "principalThingObjects"
+ },
+ "ListThingPrincipalsV2": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "thingPrincipalObjects"
+ },
+ "ListCommandExecutions": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "commandExecutions"
+ },
+ "ListCommands": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "commands"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iot/2015-05-28/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iot/2015-05-28/service-2.json.gz
new file mode 100644
index 00000000..95deb9ab
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iot/2015-05-28/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotanalytics/2017-11-27/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iotanalytics/2017-11-27/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..aaf05b07
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotanalytics/2017-11-27/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotanalytics/2017-11-27/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iotanalytics/2017-11-27/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotanalytics/2017-11-27/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotanalytics/2017-11-27/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iotanalytics/2017-11-27/paginators-1.json
new file mode 100644
index 00000000..d1bfaaaa
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotanalytics/2017-11-27/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "ListChannels": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "channelSummaries"
+ },
+ "ListDatasetContents": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "datasetContentSummaries"
+ },
+ "ListDatasets": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "datasetSummaries"
+ },
+ "ListDatastores": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "datastoreSummaries"
+ },
+ "ListPipelines": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "pipelineSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotanalytics/2017-11-27/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iotanalytics/2017-11-27/service-2.json.gz
new file mode 100644
index 00000000..17822b65
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotanalytics/2017-11-27/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotdeviceadvisor/2020-09-18/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iotdeviceadvisor/2020-09-18/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..af557fa6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotdeviceadvisor/2020-09-18/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotdeviceadvisor/2020-09-18/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iotdeviceadvisor/2020-09-18/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotdeviceadvisor/2020-09-18/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotdeviceadvisor/2020-09-18/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iotdeviceadvisor/2020-09-18/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotdeviceadvisor/2020-09-18/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotdeviceadvisor/2020-09-18/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iotdeviceadvisor/2020-09-18/service-2.json.gz
new file mode 100644
index 00000000..d8d3bdcd
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotdeviceadvisor/2020-09-18/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotevents-data/2018-10-23/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iotevents-data/2018-10-23/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..4af8bb7f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotevents-data/2018-10-23/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotevents-data/2018-10-23/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iotevents-data/2018-10-23/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotevents-data/2018-10-23/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotevents-data/2018-10-23/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iotevents-data/2018-10-23/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotevents-data/2018-10-23/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotevents-data/2018-10-23/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iotevents-data/2018-10-23/service-2.json.gz
new file mode 100644
index 00000000..df16b37f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotevents-data/2018-10-23/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotevents/2018-07-27/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iotevents/2018-07-27/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..8ad50481
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotevents/2018-07-27/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotevents/2018-07-27/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iotevents/2018-07-27/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotevents/2018-07-27/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotevents/2018-07-27/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iotevents/2018-07-27/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotevents/2018-07-27/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotevents/2018-07-27/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iotevents/2018-07-27/service-2.json.gz
new file mode 100644
index 00000000..2683394e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotevents/2018-07-27/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotfleethub/2020-11-03/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iotfleethub/2020-11-03/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..2e141b85
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotfleethub/2020-11-03/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotfleethub/2020-11-03/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iotfleethub/2020-11-03/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotfleethub/2020-11-03/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotfleethub/2020-11-03/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iotfleethub/2020-11-03/paginators-1.json
new file mode 100644
index 00000000..74c96f51
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotfleethub/2020-11-03/paginators-1.json
@@ -0,0 +1,9 @@
+{
+ "pagination": {
+ "ListApplications": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "applicationSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotfleethub/2020-11-03/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iotfleethub/2020-11-03/service-2.json.gz
new file mode 100644
index 00000000..3c5c6c4d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotfleethub/2020-11-03/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotfleetwise/2021-06-17/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iotfleetwise/2021-06-17/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..3229eada
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotfleetwise/2021-06-17/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotfleetwise/2021-06-17/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iotfleetwise/2021-06-17/paginators-1.json
new file mode 100644
index 00000000..cc8dcba6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotfleetwise/2021-06-17/paginators-1.json
@@ -0,0 +1,88 @@
+{
+ "pagination": {
+ "GetVehicleStatus": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "campaigns"
+ },
+ "ListCampaigns": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "campaignSummaries"
+ },
+ "ListDecoderManifestNetworkInterfaces": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "networkInterfaces"
+ },
+ "ListDecoderManifestSignals": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "signalDecoders"
+ },
+ "ListDecoderManifests": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "summaries"
+ },
+ "ListFleets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "fleetSummaries"
+ },
+ "ListFleetsForVehicle": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "fleets"
+ },
+ "ListModelManifestNodes": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "nodes"
+ },
+ "ListModelManifests": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "summaries"
+ },
+ "ListSignalCatalogNodes": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "nodes"
+ },
+ "ListSignalCatalogs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "summaries"
+ },
+ "ListVehicles": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "vehicleSummaries"
+ },
+ "ListVehiclesInFleet": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "vehicles"
+ },
+ "ListStateTemplates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "summaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotfleetwise/2021-06-17/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iotfleetwise/2021-06-17/service-2.json.gz
new file mode 100644
index 00000000..a2d2038d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotfleetwise/2021-06-17/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotfleetwise/2021-06-17/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/iotfleetwise/2021-06-17/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotfleetwise/2021-06-17/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotsecuretunneling/2018-10-05/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iotsecuretunneling/2018-10-05/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..85a7005a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotsecuretunneling/2018-10-05/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotsecuretunneling/2018-10-05/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iotsecuretunneling/2018-10-05/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotsecuretunneling/2018-10-05/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotsecuretunneling/2018-10-05/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iotsecuretunneling/2018-10-05/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotsecuretunneling/2018-10-05/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotsecuretunneling/2018-10-05/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iotsecuretunneling/2018-10-05/service-2.json.gz
new file mode 100644
index 00000000..2d59f449
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotsecuretunneling/2018-10-05/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..cfc5efff
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/paginators-1.json
new file mode 100644
index 00000000..0237e4da
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/paginators-1.json
@@ -0,0 +1,136 @@
+{
+ "pagination": {
+ "GetAssetPropertyAggregates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "aggregatedValues"
+ },
+ "GetAssetPropertyValueHistory": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "assetPropertyValueHistory"
+ },
+ "ListAccessPolicies": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "accessPolicySummaries"
+ },
+ "ListAssetModels": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "assetModelSummaries"
+ },
+ "ListAssets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "assetSummaries"
+ },
+ "ListAssociatedAssets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "assetSummaries"
+ },
+ "ListDashboards": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "dashboardSummaries"
+ },
+ "ListGateways": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "gatewaySummaries"
+ },
+ "ListPortals": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "portalSummaries"
+ },
+ "ListProjectAssets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "assetIds"
+ },
+ "ListProjects": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "projectSummaries"
+ },
+ "ListAssetRelationships": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "assetRelationshipSummaries"
+ },
+ "GetInterpolatedAssetPropertyValues": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "interpolatedAssetPropertyValues"
+ },
+ "ListTimeSeries": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "TimeSeriesSummaries"
+ },
+ "ListBulkImportJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "jobSummaries"
+ },
+ "ListAssetModelProperties": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "assetModelPropertySummaries"
+ },
+ "ListAssetProperties": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "assetPropertySummaries"
+ },
+ "ExecuteQuery": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "rows"
+ },
+ "ListActions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "actionSummaries"
+ },
+ "ListAssetModelCompositeModels": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "assetModelCompositeModelSummaries"
+ },
+ "ListCompositionRelationships": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "compositionRelationshipSummaries"
+ },
+ "ListDatasets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "datasetSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..77dcd655
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/paginators-1.sdk-extras.json
@@ -0,0 +1,12 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "ExecuteQuery": {
+ "non_aggregate_keys": [
+ "columns"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/service-2.json.gz
new file mode 100644
index 00000000..5a56359d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/waiters-2.json
new file mode 100644
index 00000000..e51df5fe
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotsitewise/2019-12-02/waiters-2.json
@@ -0,0 +1,92 @@
+{
+ "version": 2,
+ "waiters": {
+ "AssetModelNotExists": {
+ "delay": 3,
+ "maxAttempts": 20,
+ "operation": "DescribeAssetModel",
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "error",
+ "expected": "ResourceNotFoundException"
+ }
+ ]
+ },
+ "AssetModelActive": {
+ "delay": 3,
+ "maxAttempts": 20,
+ "operation": "DescribeAssetModel",
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "assetModelStatus.state",
+ "expected": "ACTIVE"
+ },
+ {
+ "state": "failure",
+ "matcher": "path",
+ "argument": "assetModelStatus.state",
+ "expected": "FAILED"
+ }
+ ]
+ },
+ "AssetNotExists": {
+ "delay": 3,
+ "maxAttempts": 20,
+ "operation": "DescribeAsset",
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "error",
+ "expected": "ResourceNotFoundException"
+ }
+ ]
+ },
+ "AssetActive": {
+ "delay": 3,
+ "maxAttempts": 20,
+ "operation": "DescribeAsset",
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "assetStatus.state",
+ "expected": "ACTIVE"
+ },
+ {
+ "state": "failure",
+ "matcher": "path",
+ "argument": "assetStatus.state",
+ "expected": "FAILED"
+ }
+ ]
+ },
+ "PortalNotExists": {
+ "delay": 3,
+ "maxAttempts": 20,
+ "operation": "DescribePortal",
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "error",
+ "expected": "ResourceNotFoundException"
+ }
+ ]
+ },
+ "PortalActive": {
+ "delay": 3,
+ "maxAttempts": 20,
+ "operation": "DescribePortal",
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "portalStatus.state",
+ "expected": "ACTIVE"
+ }
+ ]
+ }
+ }
+ }
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotthingsgraph/2018-09-06/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iotthingsgraph/2018-09-06/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..3f9ca5fa
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotthingsgraph/2018-09-06/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotthingsgraph/2018-09-06/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iotthingsgraph/2018-09-06/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotthingsgraph/2018-09-06/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotthingsgraph/2018-09-06/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iotthingsgraph/2018-09-06/paginators-1.json
new file mode 100644
index 00000000..bc92f846
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotthingsgraph/2018-09-06/paginators-1.json
@@ -0,0 +1,64 @@
+{
+ "pagination": {
+ "GetFlowTemplateRevisions": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "summaries"
+ },
+ "GetSystemTemplateRevisions": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "summaries"
+ },
+ "ListFlowExecutionMessages": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "messages"
+ },
+ "ListTagsForResource": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "tags"
+ },
+ "SearchEntities": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "descriptions"
+ },
+ "SearchFlowExecutions": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "summaries"
+ },
+ "SearchFlowTemplates": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "summaries"
+ },
+ "SearchSystemInstances": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "summaries"
+ },
+ "SearchSystemTemplates": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "summaries"
+ },
+ "SearchThings": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "things"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotthingsgraph/2018-09-06/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iotthingsgraph/2018-09-06/service-2.json.gz
new file mode 100644
index 00000000..6cc71111
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotthingsgraph/2018-09-06/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iottwinmaker/2021-11-29/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iottwinmaker/2021-11-29/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..e3ae3168
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iottwinmaker/2021-11-29/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iottwinmaker/2021-11-29/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iottwinmaker/2021-11-29/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iottwinmaker/2021-11-29/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iottwinmaker/2021-11-29/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iottwinmaker/2021-11-29/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iottwinmaker/2021-11-29/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iottwinmaker/2021-11-29/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iottwinmaker/2021-11-29/service-2.json.gz
new file mode 100644
index 00000000..b63e8da7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iottwinmaker/2021-11-29/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iottwinmaker/2021-11-29/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/iottwinmaker/2021-11-29/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iottwinmaker/2021-11-29/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotwireless/2020-11-22/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iotwireless/2020-11-22/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..8a21e711
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotwireless/2020-11-22/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotwireless/2020-11-22/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iotwireless/2020-11-22/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotwireless/2020-11-22/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotwireless/2020-11-22/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/iotwireless/2020-11-22/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotwireless/2020-11-22/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/iotwireless/2020-11-22/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/iotwireless/2020-11-22/service-2.json.gz
new file mode 100644
index 00000000..6b5d5057
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/iotwireless/2020-11-22/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ivs-realtime/2020-07-14/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ivs-realtime/2020-07-14/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..a2234997
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ivs-realtime/2020-07-14/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ivs-realtime/2020-07-14/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ivs-realtime/2020-07-14/paginators-1.json
new file mode 100644
index 00000000..a7ae6129
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ivs-realtime/2020-07-14/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "ListPublicKeys": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "publicKeys"
+ },
+ "ListIngestConfigurations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "ingestConfigurations"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ivs-realtime/2020-07-14/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ivs-realtime/2020-07-14/service-2.json.gz
new file mode 100644
index 00000000..7b8b6f23
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ivs-realtime/2020-07-14/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ivs-realtime/2020-07-14/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/ivs-realtime/2020-07-14/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ivs-realtime/2020-07-14/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ivs/2020-07-14/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ivs/2020-07-14/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..eed3f79a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ivs/2020-07-14/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ivs/2020-07-14/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ivs/2020-07-14/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ivs/2020-07-14/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ivs/2020-07-14/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ivs/2020-07-14/paginators-1.json
new file mode 100644
index 00000000..572d1c73
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ivs/2020-07-14/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "ListChannels": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "channels"
+ },
+ "ListStreamKeys": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "streamKeys"
+ },
+ "ListStreams": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "streams"
+ },
+ "ListPlaybackKeyPairs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "keyPairs"
+ },
+ "ListRecordingConfigurations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "recordingConfigurations"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ivs/2020-07-14/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ivs/2020-07-14/service-2.json.gz
new file mode 100644
index 00000000..fbc43946
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ivs/2020-07-14/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ivschat/2020-07-14/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ivschat/2020-07-14/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..43eeeafe
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ivschat/2020-07-14/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ivschat/2020-07-14/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ivschat/2020-07-14/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ivschat/2020-07-14/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ivschat/2020-07-14/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ivschat/2020-07-14/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ivschat/2020-07-14/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ivschat/2020-07-14/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ivschat/2020-07-14/service-2.json.gz
new file mode 100644
index 00000000..ceaacf60
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ivschat/2020-07-14/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ivschat/2020-07-14/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/ivschat/2020-07-14/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ivschat/2020-07-14/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kafka/2018-11-14/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kafka/2018-11-14/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..210209b2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kafka/2018-11-14/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kafka/2018-11-14/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kafka/2018-11-14/paginators-1.json
new file mode 100644
index 00000000..92e6d9fd
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kafka/2018-11-14/paginators-1.json
@@ -0,0 +1,76 @@
+{
+ "pagination": {
+ "ListClusters": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ClusterInfoList"
+ },
+ "ListNodes": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "NodeInfoList"
+ },
+ "ListConfigurations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Configurations"
+ },
+ "ListClusterOperations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ClusterOperationInfoList"
+ },
+ "ListConfigurationRevisions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Revisions"
+ },
+ "ListKafkaVersions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "KafkaVersions"
+ },
+ "ListScramSecrets": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SecretArnList"
+ },
+ "ListClustersV2": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ClusterInfoList"
+ },
+ "ListVpcConnections": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "VpcConnections"
+ },
+ "ListClientVpcConnections": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ClientVpcConnections"
+ },
+ "ListClusterOperationsV2": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ClusterOperationInfoList"
+ },
+ "ListReplicators": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Replicators"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kafka/2018-11-14/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kafka/2018-11-14/service-2.json.gz
new file mode 100644
index 00000000..d0210668
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kafka/2018-11-14/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kafkaconnect/2021-09-14/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kafkaconnect/2021-09-14/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..af69e4f9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kafkaconnect/2021-09-14/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kafkaconnect/2021-09-14/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kafkaconnect/2021-09-14/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kafkaconnect/2021-09-14/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kafkaconnect/2021-09-14/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kafkaconnect/2021-09-14/paginators-1.json
new file mode 100644
index 00000000..d84b26fc
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kafkaconnect/2021-09-14/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListConnectors": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "connectors"
+ },
+ "ListCustomPlugins": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "customPlugins"
+ },
+ "ListWorkerConfigurations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "workerConfigurations"
+ },
+ "ListConnectorOperations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "connectorOperations"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kafkaconnect/2021-09-14/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kafkaconnect/2021-09-14/service-2.json.gz
new file mode 100644
index 00000000..6bdaf213
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kafkaconnect/2021-09-14/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kafkaconnect/2021-09-14/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/kafkaconnect/2021-09-14/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kafkaconnect/2021-09-14/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kendra-ranking/2022-10-19/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kendra-ranking/2022-10-19/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..e38d9600
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kendra-ranking/2022-10-19/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kendra-ranking/2022-10-19/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kendra-ranking/2022-10-19/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kendra-ranking/2022-10-19/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kendra-ranking/2022-10-19/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kendra-ranking/2022-10-19/service-2.json.gz
new file mode 100644
index 00000000..7a123b5a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kendra-ranking/2022-10-19/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kendra/2019-02-03/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kendra/2019-02-03/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..33132481
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kendra/2019-02-03/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kendra/2019-02-03/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kendra/2019-02-03/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kendra/2019-02-03/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kendra/2019-02-03/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kendra/2019-02-03/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kendra/2019-02-03/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kendra/2019-02-03/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kendra/2019-02-03/service-2.json.gz
new file mode 100644
index 00000000..191de1e4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kendra/2019-02-03/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/keyspaces/2022-02-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/keyspaces/2022-02-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..ee9f5554
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/keyspaces/2022-02-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/keyspaces/2022-02-10/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/keyspaces/2022-02-10/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/keyspaces/2022-02-10/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/keyspaces/2022-02-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/keyspaces/2022-02-10/paginators-1.json
new file mode 100644
index 00000000..4145b28b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/keyspaces/2022-02-10/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListKeyspaces": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "keyspaces"
+ },
+ "ListTables": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "tables"
+ },
+ "ListTagsForResource": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "tags"
+ },
+ "ListTypes": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "types"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/keyspaces/2022-02-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/keyspaces/2022-02-10/service-2.json.gz
new file mode 100644
index 00000000..ffaf8933
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/keyspaces/2022-02-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/keyspaces/2022-02-10/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/keyspaces/2022-02-10/waiters-2.json
new file mode 100644
index 00000000..4b20636a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/keyspaces/2022-02-10/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-archived-media/2017-09-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-archived-media/2017-09-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..67f23cb8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-archived-media/2017-09-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-archived-media/2017-09-30/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-archived-media/2017-09-30/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-archived-media/2017-09-30/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-archived-media/2017-09-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-archived-media/2017-09-30/paginators-1.json
new file mode 100644
index 00000000..a9a70417
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-archived-media/2017-09-30/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "ListFragments": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Fragments"
+ },
+ "GetImages": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Images"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-archived-media/2017-09-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-archived-media/2017-09-30/service-2.json.gz
new file mode 100644
index 00000000..aa55c14a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-archived-media/2017-09-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-media/2017-09-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-media/2017-09-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..6c1403ce
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-media/2017-09-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-media/2017-09-30/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-media/2017-09-30/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-media/2017-09-30/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-media/2017-09-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-media/2017-09-30/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-media/2017-09-30/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-media/2017-09-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-media/2017-09-30/service-2.json.gz
new file mode 100644
index 00000000..428ac744
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-media/2017-09-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-signaling/2019-12-04/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-signaling/2019-12-04/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..6c1403ce
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-signaling/2019-12-04/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-signaling/2019-12-04/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-signaling/2019-12-04/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-signaling/2019-12-04/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-signaling/2019-12-04/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-signaling/2019-12-04/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-signaling/2019-12-04/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-signaling/2019-12-04/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-signaling/2019-12-04/service-2.json.gz
new file mode 100644
index 00000000..abab8d31
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-signaling/2019-12-04/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-webrtc-storage/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-webrtc-storage/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..e428a8ba
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-webrtc-storage/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-webrtc-storage/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-webrtc-storage/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-webrtc-storage/2018-05-10/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-webrtc-storage/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-webrtc-storage/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..6c16a94b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesis-video-webrtc-storage/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesis/2013-12-02/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kinesis/2013-12-02/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..ba196014
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesis/2013-12-02/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesis/2013-12-02/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kinesis/2013-12-02/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesis/2013-12-02/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesis/2013-12-02/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kinesis/2013-12-02/paginators-1.json
new file mode 100644
index 00000000..3d680e67
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesis/2013-12-02/paginators-1.json
@@ -0,0 +1,43 @@
+{
+ "pagination": {
+ "DescribeStream": {
+ "input_token": "ExclusiveStartShardId",
+ "limit_key": "Limit",
+ "more_results": "StreamDescription.HasMoreShards",
+ "output_token": "StreamDescription.Shards[-1].ShardId",
+ "result_key": "StreamDescription.Shards",
+ "non_aggregate_keys": [
+ "StreamDescription.StreamARN",
+ "StreamDescription.StreamName",
+ "StreamDescription.StreamStatus",
+ "StreamDescription.RetentionPeriodHours",
+ "StreamDescription.EnhancedMonitoring",
+ "StreamDescription.EncryptionType",
+ "StreamDescription.KeyId",
+ "StreamDescription.StreamCreationTimestamp"
+ ]
+ },
+ "ListStreams": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "more_results": "HasMoreStreams",
+ "output_token": "NextToken",
+ "result_key": [
+ "StreamNames",
+ "StreamSummaries"
+ ]
+ },
+ "ListShards": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Shards"
+ },
+ "ListStreamConsumers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Consumers"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesis/2013-12-02/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kinesis/2013-12-02/service-2.json.gz
new file mode 100644
index 00000000..30fb2de8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesis/2013-12-02/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesis/2013-12-02/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/kinesis/2013-12-02/waiters-2.json
new file mode 100644
index 00000000..d61efe43
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesis/2013-12-02/waiters-2.json
@@ -0,0 +1,30 @@
+{
+ "version": 2,
+ "waiters": {
+ "StreamExists": {
+ "delay": 10,
+ "operation": "DescribeStream",
+ "maxAttempts": 18,
+ "acceptors": [
+ {
+ "expected": "ACTIVE",
+ "matcher": "path",
+ "state": "success",
+ "argument": "StreamDescription.StreamStatus"
+ }
+ ]
+ },
+ "StreamNotExists": {
+ "delay": 10,
+ "operation": "DescribeStream",
+ "maxAttempts": 18,
+ "acceptors": [
+ {
+ "expected": "ResourceNotFoundException",
+ "matcher": "error",
+ "state": "success"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalytics/2015-08-14/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalytics/2015-08-14/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..bcb9af0c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalytics/2015-08-14/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalytics/2015-08-14/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalytics/2015-08-14/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalytics/2015-08-14/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalytics/2015-08-14/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalytics/2015-08-14/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalytics/2015-08-14/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalytics/2015-08-14/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalytics/2015-08-14/service-2.json.gz
new file mode 100644
index 00000000..0165dd65
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalytics/2015-08-14/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalyticsv2/2018-05-23/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalyticsv2/2018-05-23/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..ae981beb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalyticsv2/2018-05-23/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalyticsv2/2018-05-23/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalyticsv2/2018-05-23/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalyticsv2/2018-05-23/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalyticsv2/2018-05-23/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalyticsv2/2018-05-23/paginators-1.json
new file mode 100644
index 00000000..eb315fdd
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalyticsv2/2018-05-23/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListApplicationSnapshots": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "SnapshotSummaries"
+ },
+ "ListApplications": {
+ "input_token": "NextToken",
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "result_key": "ApplicationSummaries"
+ },
+ "ListApplicationOperations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "ApplicationOperationInfoList"
+ },
+ "ListApplicationVersions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "ApplicationVersionSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalyticsv2/2018-05-23/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalyticsv2/2018-05-23/service-2.json.gz
new file mode 100644
index 00000000..217322fa
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesisanalyticsv2/2018-05-23/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesisvideo/2017-09-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kinesisvideo/2017-09-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..67f23cb8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesisvideo/2017-09-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesisvideo/2017-09-30/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kinesisvideo/2017-09-30/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesisvideo/2017-09-30/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesisvideo/2017-09-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kinesisvideo/2017-09-30/paginators-1.json
new file mode 100644
index 00000000..9d837318
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesisvideo/2017-09-30/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListStreams": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "StreamInfoList"
+ },
+ "ListSignalingChannels": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ChannelInfoList"
+ },
+ "DescribeMappedResourceConfiguration": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "MappedResourceConfigurationList"
+ },
+ "ListEdgeAgentConfigurations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "EdgeConfigs"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kinesisvideo/2017-09-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kinesisvideo/2017-09-30/service-2.json.gz
new file mode 100644
index 00000000..b7439ce8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kinesisvideo/2017-09-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kms/2014-11-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kms/2014-11-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..5419f89b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kms/2014-11-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kms/2014-11-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kms/2014-11-01/examples-1.json
new file mode 100644
index 00000000..c770d0ed
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kms/2014-11-01/examples-1.json
@@ -0,0 +1,1750 @@
+{
+ "version": "1.0",
+ "examples": {
+ "CancelKeyDeletion": [
+ {
+ "input": {
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "output": {
+ "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The identifier of the KMS key whose deletion you are canceling. You can use the key ID or the Amazon Resource Name (ARN) of the KMS key."
+ },
+ "output": {
+ "KeyId": "The ARN of the KMS key whose deletion you canceled."
+ }
+ },
+ "description": "The following example cancels deletion of the specified KMS key.",
+ "id": "to-cancel-deletion-of-a-cmk-1477428535102",
+ "title": "To cancel deletion of a KMS key"
+ }
+ ],
+ "ConnectCustomKeyStore": [
+ {
+ "input": {
+ "CustomKeyStoreId": "cks-1234567890abcdef0"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ "CustomKeyStoreId": "The ID of the AWS KMS custom key store."
+ },
+ "output": {
+ }
+ },
+ "description": "This example connects an AWS KMS custom key store to its AWS CloudHSM cluster. This operation does not return any data. To verify that the custom key store is connected, use the <code>DescribeCustomKeyStores</code> operation.",
+ "id": "to-connect-a-custom-key-store-to-its-cloudhsm-cluster-1628626947750",
+ "title": "To connect a custom key store to its CloudHSM cluster"
+ }
+ ],
+ "CreateAlias": [
+ {
+ "input": {
+ "AliasName": "alias/ExampleAlias",
+ "TargetKeyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "comments": {
+ "input": {
+ "AliasName": "The alias to create. Aliases must begin with 'alias/'. Do not use aliases that begin with 'alias/aws' because they are reserved for use by AWS.",
+ "TargetKeyId": "The identifier of the KMS key whose alias you are creating. You can use the key ID or the Amazon Resource Name (ARN) of the KMS key."
+ }
+ },
+ "description": "The following example creates an alias for the specified KMS key.",
+ "id": "to-create-an-alias-1477505685119",
+ "title": "To create an alias"
+ }
+ ],
+ "CreateCustomKeyStore": [
+ {
+ "input": {
+ "CloudHsmClusterId": "cluster-1a23b4cdefg",
+ "CustomKeyStoreName": "ExampleKeyStore",
+ "KeyStorePassword": "kmsPswd",
+ "TrustAnchorCertificate": "<certificate-goes-here>"
+ },
+ "output": {
+ "CustomKeyStoreId": "cks-1234567890abcdef0"
+ },
+ "comments": {
+ "input": {
+ "CloudHsmClusterId": "The ID of the CloudHSM cluster.",
+ "CustomKeyStoreName": "A friendly name for the custom key store.",
+ "KeyStorePassword": "The password for the kmsuser CU account in the specified cluster.",
+ "TrustAnchorCertificate": "The content of the customerCA.crt file that you created when you initialized the cluster."
+ },
+ "output": {
+ "CustomKeyStoreId": "The ID of the new custom key store."
+ }
+ },
+ "description": "This example creates a custom key store that is associated with an AWS CloudHSM cluster.",
+ "id": "to-create-an-aws-cloudhsm-custom-key-store-1628627769469",
+ "title": "To create an AWS CloudHSM custom key store"
+ }
+ ],
+ "CreateGrant": [
+ {
+ "input": {
+ "GranteePrincipal": "arn:aws:iam::111122223333:role/ExampleRole",
+ "KeyId": "arn:aws:kms:us-east-2:444455556666:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "Operations": [
+ "Encrypt",
+ "Decrypt"
+ ]
+ },
+ "output": {
+ "GrantId": "0c237476b39f8bc44e45212e08498fbe3151305030726c0590dd8d3e9f3d6a60",
+ "GrantToken": "AQpAM2RhZTk1MGMyNTk2ZmZmMzEyYWVhOWViN2I1MWM4Mzc0MWFiYjc0ZDE1ODkyNGFlNTIzODZhMzgyZjBlNGY3NiKIAgEBAgB4Pa6VDCWW__MSrqnre1HIN0Grt00ViSSuUjhqOC8OT3YAAADfMIHcBgkqhkiG9w0BBwaggc4wgcsCAQAwgcUGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMmqLyBTAegIn9XlK5AgEQgIGXZQjkBcl1dykDdqZBUQ6L1OfUivQy7JVYO2-ZJP7m6f1g8GzV47HX5phdtONAP7K_HQIflcgpkoCqd_fUnE114mSmiagWkbQ5sqAVV3ov-VeqgrvMe5ZFEWLMSluvBAqdjHEdMIkHMlhlj4ENZbzBfo9Wxk8b8SnwP4kc4gGivedzFXo-dwN8fxjjq_ZZ9JFOj2ijIbj5FyogDCN0drOfi8RORSEuCEmPvjFRMFAwcmwFkN2NPp89amA"
+ },
+ "comments": {
+ "input": {
+ "GranteePrincipal": "The identity that is given permission to perform the operations specified in the grant.",
+ "KeyId": "The identifier of the KMS key to which the grant applies. You can use the key ID or the Amazon Resource Name (ARN) of the KMS key.",
+ "Operations": "A list of operations that the grant allows."
+ },
+ "output": {
+ "GrantId": "The unique identifier of the grant.",
+ "GrantToken": "The grant token."
+ }
+ },
+ "description": "The following example creates a grant that allows the specified IAM role to encrypt data with the specified KMS key.",
+ "id": "to-create-a-grant-1477972226782",
+ "title": "To create a grant"
+ }
+ ],
+ "CreateKey": [
+ {
+ "input": {
+ },
+ "output": {
+ "KeyMetadata": {
+ "AWSAccountId": "111122223333",
+ "Arn": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "CreationDate": "2017-07-05T14:04:55-07:00",
+ "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
+ "Description": "",
+ "Enabled": true,
+ "EncryptionAlgorithms": [
+ "SYMMETRIC_DEFAULT"
+ ],
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
+ "KeyManager": "CUSTOMER",
+ "KeySpec": "SYMMETRIC_DEFAULT",
+ "KeyState": "Enabled",
+ "KeyUsage": "ENCRYPT_DECRYPT",
+ "MultiRegion": false,
+ "Origin": "AWS_KMS"
+ }
+ },
+ "comments": {
+ "input": {
+ "Tags": "One or more tags. Each tag consists of a tag key and a tag value."
+ },
+ "output": {
+ "KeyMetadata": "Detailed information about the KMS key that this operation creates."
+ }
+ },
+ "description": "The following example creates a symmetric KMS key for encryption and decryption. No parameters are required for this operation.",
+ "id": "to-create-a-cmk-1478028992966",
+ "title": "To create a KMS key"
+ },
+ {
+ "input": {
+ "KeySpec": "RSA_4096",
+ "KeyUsage": "ENCRYPT_DECRYPT"
+ },
+ "output": {
+ "KeyMetadata": {
+ "AWSAccountId": "111122223333",
+ "Arn": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "CreationDate": "2021-04-05T14:04:55-07:00",
+ "CustomerMasterKeySpec": "RSA_4096",
+ "Description": "",
+ "Enabled": true,
+ "EncryptionAlgorithms": [
+ "RSAES_OAEP_SHA_1",
+ "RSAES_OAEP_SHA_256"
+ ],
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
+ "KeyManager": "CUSTOMER",
+ "KeySpec": "RSA_4096",
+ "KeyState": "Enabled",
+ "KeyUsage": "ENCRYPT_DECRYPT",
+ "MultiRegion": false,
+ "Origin": "AWS_KMS"
+ }
+ },
+ "comments": {
+ "input": {
+ "KeySpec": "Describes the type of key material in the KMS key.",
+ "KeyUsage": "The cryptographic operations for which you can use the KMS key."
+ },
+ "output": {
+ "KeyMetadata": "Detailed information about the KMS key that this operation creates."
+ }
+ },
+ "description": "This example creates a KMS key that contains an asymmetric RSA key pair for encryption and decryption. The key spec and key usage can't be changed after the key is created.",
+ "id": "to-create-an-asymmetric-rsa-kms-key-for-encryption-and-decryption-1630533897833",
+ "title": "To create an asymmetric RSA KMS key for encryption and decryption"
+ },
+ {
+ "input": {
+ "KeySpec": "ECC_NIST_P521",
+ "KeyUsage": "SIGN_VERIFY"
+ },
+ "output": {
+ "KeyMetadata": {
+ "AWSAccountId": "111122223333",
+ "Arn": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "CreationDate": "2019-12-02T07:48:55-07:00",
+ "CustomerMasterKeySpec": "ECC_NIST_P521",
+ "Description": "",
+ "Enabled": true,
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
+ "KeyManager": "CUSTOMER",
+ "KeySpec": "ECC_NIST_P521",
+ "KeyState": "Enabled",
+ "KeyUsage": "SIGN_VERIFY",
+ "MultiRegion": false,
+ "Origin": "AWS_KMS",
+ "SigningAlgorithms": [
+ "ECDSA_SHA_512"
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ "KeySpec": "Describes the type of key material in the KMS key.",
+ "KeyUsage": "The cryptographic operations for which you can use the KMS key."
+ },
+ "output": {
+ "KeyMetadata": "Detailed information about the KMS key that this operation creates."
+ }
+ },
+ "description": "This example creates a KMS key that contains an asymmetric elliptic curve (ECC) key pair for signing and verification. The key usage is required even though \"SIGN_VERIFY\" is the only valid value for ECC KMS keys. The key spec and key usage can't be changed after the key is created.",
+ "id": "to-create-an-asymmetric-elliptic-curve-kms-key-for-signing-and-verification-1630541089401",
+ "title": "To create an asymmetric elliptic curve KMS key for signing and verification"
+ },
+ {
+ "input": {
+ "MultiRegion": true
+ },
+ "output": {
+ "KeyMetadata": {
+ "AWSAccountId": "111122223333",
+ "Arn": "arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef12345678990ab",
+ "CreationDate": "2021-09-02T016:15:21-09:00",
+ "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
+ "Description": "",
+ "Enabled": true,
+ "EncryptionAlgorithms": [
+ "SYMMETRIC_DEFAULT"
+ ],
+ "KeyId": "mrk-1234abcd12ab34cd56ef12345678990ab",
+ "KeyManager": "CUSTOMER",
+ "KeySpec": "SYMMETRIC_DEFAULT",
+ "KeyState": "Enabled",
+ "KeyUsage": "ENCRYPT_DECRYPT",
+ "MultiRegion": true,
+ "MultiRegionConfiguration": {
+ "MultiRegionKeyType": "PRIMARY",
+ "PrimaryKey": {
+ "Arn": "arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef12345678990ab",
+ "Region": "us-west-2"
+ },
+ "ReplicaKeys": [
+
+ ]
+ },
+ "Origin": "AWS_KMS"
+ }
+ },
+ "comments": {
+ "input": {
+ "MultiRegion": "Indicates whether the KMS key is a multi-Region (True) or regional (False) key."
+ },
+ "output": {
+ "KeyMetadata": "Detailed information about the KMS key that this operation creates."
+ }
+ },
+ "description": "This example creates a multi-Region primary symmetric encryption key. Because the default values for all parameters create a symmetric encryption key, only the MultiRegion parameter is required for this KMS key.",
+ "id": "to-create-a-multi-region-primary-kms-key-1630599158567",
+ "title": "To create a multi-Region primary KMS key"
+ },
+ {
+ "input": {
+ "Origin": "EXTERNAL"
+ },
+ "output": {
+ "KeyMetadata": {
+ "AWSAccountId": "111122223333",
+ "Arn": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "CreationDate": "2019-12-02T07:48:55-07:00",
+ "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
+ "Description": "",
+ "Enabled": false,
+ "EncryptionAlgorithms": [
+ "SYMMETRIC_DEFAULT"
+ ],
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
+ "KeyManager": "CUSTOMER",
+ "KeySpec": "SYMMETRIC_DEFAULT",
+ "KeyState": "PendingImport",
+ "KeyUsage": "ENCRYPT_DECRYPT",
+ "MultiRegion": false,
+ "Origin": "EXTERNAL"
+ }
+ },
+ "comments": {
+ "input": {
+ "Origin": "The source of the key material for the KMS key."
+ },
+ "output": {
+ "KeyMetadata": "Detailed information about the KMS key that this operation creates."
+ }
+ },
+ "description": "This example creates a KMS key with no key material. When the operation is complete, you can import your own key material into the KMS key. To create this KMS key, set the Origin parameter to EXTERNAL. ",
+ "id": "to-create-a-kms-key-for-imported-key-material-1630603607560",
+ "title": "To create a KMS key for imported key material"
+ },
+ {
+ "input": {
+ "CustomKeyStoreId": "cks-1234567890abcdef0",
+ "Origin": "AWS_CLOUDHSM"
+ },
+ "output": {
+ "KeyMetadata": {
+ "AWSAccountId": "111122223333",
+ "Arn": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "CloudHsmClusterId": "cluster-1a23b4cdefg",
+ "CreationDate": "2019-12-02T07:48:55-07:00",
+ "CustomKeyStoreId": "cks-1234567890abcdef0",
+ "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
+ "Description": "",
+ "Enabled": true,
+ "EncryptionAlgorithms": [
+ "SYMMETRIC_DEFAULT"
+ ],
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
+ "KeyManager": "CUSTOMER",
+ "KeySpec": "SYMMETRIC_DEFAULT",
+ "KeyState": "Enabled",
+ "KeyUsage": "ENCRYPT_DECRYPT",
+ "MultiRegion": false,
+ "Origin": "AWS_CLOUDHSM"
+ }
+ },
+ "comments": {
+ "input": {
+ "CustomKeyStoreId": "Identifies the custom key store that hosts the KMS key.",
+ "Origin": "Indicates the source of the key material for the KMS key."
+ },
+ "output": {
+ "KeyMetadata": "Detailed information about the KMS key that this operation creates."
+ }
+ },
+ "description": "This example creates a KMS key in the specified custom key store. The operation creates the KMS key and its metadata in AWS KMS and the key material in the AWS CloudHSM cluster associated with the custom key store. This example requires the Origin and CustomKeyStoreId parameters.",
+ "id": "to-create-a-kms-key-in-a-custom-key-store-1630604382908",
+ "title": "To create a KMS key in a custom key store"
+ },
+ {
+ "input": {
+ "KeySpec": "HMAC_384",
+ "KeyUsage": "GENERATE_VERIFY_MAC"
+ },
+ "output": {
+ "KeyMetadata": {
+ "AWSAccountId": "111122223333",
+ "Arn": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "CreationDate": "2022-04-05T14:04:55-07:00",
+ "CustomerMasterKeySpec": "HMAC_384",
+ "Description": "",
+ "Enabled": true,
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
+ "KeyManager": "CUSTOMER",
+ "KeySpec": "HMAC_384",
+ "KeyState": "Enabled",
+ "KeyUsage": "GENERATE_VERIFY_MAC",
+ "MacAlgorithms": [
+ "HMAC_SHA_384"
+ ],
+ "MultiRegion": false,
+ "Origin": "AWS_KMS"
+ }
+ },
+ "comments": {
+ "input": {
+ "KeySpec": "Describes the type of key material in the KMS key.",
+ "KeyUsage": "The cryptographic operations for which you can use the KMS key."
+ },
+ "output": {
+ "KeyMetadata": "Detailed information about the KMS key that this operation creates."
+ }
+ },
+ "description": "This example creates a 384-bit symmetric HMAC KMS key. The GENERATE_VERIFY_MAC key usage value is required even though it's the only valid value for HMAC KMS keys. The key spec and key usage can't be changed after the key is created. ",
+ "id": "to-create-an-hmac-kms-key-1630628752841",
+ "title": "To create an HMAC KMS key"
+ }
+ ],
+ "Decrypt": [
+ {
+ "input": {
+ "CiphertextBlob": "<binary data>",
+ "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "output": {
+ "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "Plaintext": "<binary data>"
+ },
+ "comments": {
+ "input": {
+ "CiphertextBlob": "The encrypted data (ciphertext).",
+ "KeyId": "A key identifier for the KMS key to use to decrypt the data."
+ },
+ "output": {
+ "KeyId": "The Amazon Resource Name (ARN) of the KMS key that was used to decrypt the data.",
+ "Plaintext": "The decrypted (plaintext) data."
+ }
+ },
+ "description": "The following example decrypts data that was encrypted with a KMS key.",
+ "id": "to-decrypt-data-1478281622886",
+ "title": "To decrypt data"
+ }
+ ],
+ "DeleteAlias": [
+ {
+ "input": {
+ "AliasName": "alias/ExampleAlias"
+ },
+ "comments": {
+ "input": {
+ "AliasName": "The alias to delete."
+ }
+ },
+ "description": "The following example deletes the specified alias.",
+ "id": "to-delete-an-alias-1478285209338",
+ "title": "To delete an alias"
+ }
+ ],
+ "DeleteCustomKeyStore": [
+ {
+ "input": {
+ "CustomKeyStoreId": "cks-1234567890abcdef0"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ "CustomKeyStoreId": "The ID of the custom key store to be deleted."
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes a custom key store from AWS KMS. This operation does not delete the AWS CloudHSM cluster that was associated with the CloudHSM cluster. This operation doesn't return any data. To verify that the operation was successful, use the DescribeCustomKeyStores operation. ",
+ "id": "to-delete-a-custom-key-store-from-aws-kms-1628630837145",
+ "title": "To delete a custom key store from AWS KMS"
+ }
+ ],
+ "DeleteImportedKeyMaterial": [
+ {
+ "input": {
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The identifier of the KMS key whose imported key material you are deleting. You can use the key ID or the Amazon Resource Name (ARN) of the KMS key."
+ }
+ },
+ "description": "The following example deletes the imported key material from the specified KMS key.",
+ "id": "to-delete-imported-key-material-1478561674507",
+ "title": "To delete imported key material"
+ }
+ ],
+ "DescribeCustomKeyStores": [
+ {
+ "input": {
+ },
+ "output": {
+ "CustomKeyStores": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ "CustomKeyStores": "Details about each custom key store in the account and Region."
+ }
+ },
+ "description": "This example gets detailed information about all AWS KMS custom key stores in an AWS account and Region. To get all key stores, do not enter a custom key store name or ID.",
+ "id": "to-get-detailed-information-about-custom-key-stores-in-the-account-and-region-1628628556811",
+ "title": "To get detailed information about custom key stores in the account and Region"
+ },
+ {
+ "input": {
+ "CustomKeyStoreName": "ExampleKeyStore"
+ },
+ "output": {
+ "CustomKeyStores": [
+ {
+ "CloudHsmClusterId": "cluster-1a23b4cdefg",
+ "ConnectionState": "CONNECTED",
+ "CreationDate": "1.499288695918E9",
+ "CustomKeyStoreId": "cks-1234567890abcdef0",
+ "CustomKeyStoreName": "ExampleKeyStore",
+ "TrustAnchorCertificate": "<certificate appears here>"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ "CustomKeyStoreName": "The friendly name of the custom key store."
+ },
+ "output": {
+ "CustomKeyStores": "Detailed information about the specified custom key store."
+ }
+ },
+ "description": "This example gets detailed information about a particular AWS KMS custom key store that is associate with an AWS CloudHSM cluster. To limit the output to a particular custom key store, provide the custom key store name or ID. ",
+ "id": "to-get-detailed-information-about-a-custom-key-store-associated-with-a-cloudhsm-cluster-1628628885843",
+ "title": "To get detailed information about a custom key store associated with a CloudHSM cluster."
+ }
+ ],
+ "DescribeKey": [
+ {
+ "input": {
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "output": {
+ "KeyMetadata": {
+ "AWSAccountId": "111122223333",
+ "Arn": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "CreationDate": "2017-07-05T14:04:55-07:00",
+ "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
+ "Description": "",
+ "Enabled": true,
+ "EncryptionAlgorithms": [
+ "SYMMETRIC_DEFAULT"
+ ],
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
+ "KeyManager": "CUSTOMER",
+ "KeySpec": "SYMMETRIC_DEFAULT",
+ "KeyState": "Enabled",
+ "KeyUsage": "ENCRYPT_DECRYPT",
+ "MultiRegion": false,
+ "Origin": "AWS_KMS"
+ }
+ },
+ "comments": {
+ "input": {
+ "KeyId": "An identifier for the KMS key. You can use the key ID, key ARN, alias name, alias ARN of the KMS key."
+ },
+ "output": {
+ "KeyMetadata": "An object that contains information about the specified KMS key."
+ }
+ },
+ "description": "The following example gets metadata for a symmetric encryption KMS key.",
+ "id": "get-key-details-1478565820907",
+ "title": "To get details about a KMS key"
+ },
+ {
+ "input": {
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "output": {
+ "KeyMetadata": {
+ "AWSAccountId": "111122223333",
+ "Arn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "CreationDate": 1571767572.317,
+ "CustomerMasterKeySpec": "RSA_2048",
+ "Description": "",
+ "Enabled": false,
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
+ "KeyManager": "CUSTOMER",
+ "KeySpec": "RSA_2048",
+ "KeyState": "Disabled",
+ "KeyUsage": "SIGN_VERIFY",
+ "MultiRegion": false,
+ "Origin": "AWS_KMS",
+ "SigningAlgorithms": [
+ "RSASSA_PKCS1_V1_5_SHA_256",
+ "RSASSA_PKCS1_V1_5_SHA_384",
+ "RSASSA_PKCS1_V1_5_SHA_512",
+ "RSASSA_PSS_SHA_256",
+ "RSASSA_PSS_SHA_384",
+ "RSASSA_PSS_SHA_512"
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ "KeyId": "An identifier for the KMS key. You can use the key ID, key ARN, alias name, alias ARN of the KMS key."
+ },
+ "output": {
+ "KeyMetadata": "An object that contains information about the specified KMS key."
+ }
+ },
+ "description": "The following example gets metadata for an asymmetric RSA KMS key used for signing and verification.",
+ "id": "to-get-details-about-an-rsa-asymmetric-kms-key-1637971611761",
+ "title": "To get details about an RSA asymmetric KMS key"
+ },
+ {
+ "input": {
+ "KeyId": "arn:aws:kms:ap-northeast-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab"
+ },
+ "output": {
+ "KeyMetadata": {
+ "AWSAccountId": "111122223333",
+ "Arn": "arn:aws:kms:ap-northeast-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab",
+ "CreationDate": 1586329200.918,
+ "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
+ "Description": "",
+ "Enabled": true,
+ "EncryptionAlgorithms": [
+ "SYMMETRIC_DEFAULT"
+ ],
+ "KeyId": "mrk-1234abcd12ab34cd56ef1234567890ab",
+ "KeyManager": "CUSTOMER",
+ "KeyState": "Enabled",
+ "KeyUsage": "ENCRYPT_DECRYPT",
+ "MultiRegion": true,
+ "MultiRegionConfiguration": {
+ "MultiRegionKeyType": "PRIMARY",
+ "PrimaryKey": {
+ "Arn": "arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab",
+ "Region": "us-west-2"
+ },
+ "ReplicaKeys": [
+ {
+ "Arn": "arn:aws:kms:eu-west-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab",
+ "Region": "eu-west-1"
+ },
+ {
+ "Arn": "arn:aws:kms:ap-northeast-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab",
+ "Region": "ap-northeast-1"
+ },
+ {
+ "Arn": "arn:aws:kms:sa-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab",
+ "Region": "sa-east-1"
+ }
+ ]
+ },
+ "Origin": "AWS_KMS"
+ }
+ },
+ "comments": {
+ "input": {
+ "KeyId": "An identifier for the KMS key. You can use the key ID, key ARN, alias name, alias ARN of the KMS key."
+ },
+ "output": {
+ "KeyMetadata": "An object that contains information about the specified KMS key."
+ }
+ },
+ "description": "The following example gets metadata for a multi-Region replica key. This multi-Region key is a symmetric encryption key. DescribeKey returns information about the primary key and all of its replicas.",
+ "id": "to-get-details-about-a-multi-region-key-1637969624239",
+ "title": "To get details about a multi-Region key"
+ },
+ {
+ "input": {
+ "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "output": {
+ "KeyMetadata": {
+ "AWSAccountId": "123456789012",
+ "Arn": "arn:aws:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "CreationDate": 1566160362.664,
+ "CustomerMasterKeySpec": "HMAC_256",
+ "Description": "Development test key",
+ "Enabled": true,
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
+ "KeyManager": "CUSTOMER",
+ "KeyState": "Enabled",
+ "KeyUsage": "GENERATE_VERIFY_MAC",
+ "MacAlgorithms": [
+ "HMAC_SHA_256"
+ ],
+ "MultiRegion": false,
+ "Origin": "AWS_KMS"
+ }
+ },
+ "comments": {
+ "input": {
+ "KeyId": "An identifier for the KMS key. You can use the key ID, key ARN, alias name, alias ARN of the KMS key."
+ },
+ "output": {
+ "KeyMetadata": "An object that contains information about the specified KMS key."
+ }
+ },
+ "description": "The following example gets the metadata of an HMAC KMS key. ",
+ "id": "to-get-details-about-an-hmac-kms-key-1637970472619",
+ "title": "To get details about an HMAC KMS key"
+ }
+ ],
+ "DisableKey": [
+ {
+ "input": {
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The identifier of the KMS key to disable. You can use the key ID or the Amazon Resource Name (ARN) of the KMS key."
+ }
+ },
+ "description": "The following example disables the specified KMS key.",
+ "id": "to-disable-a-cmk-1478566583659",
+ "title": "To disable a KMS key"
+ }
+ ],
+ "DisableKeyRotation": [
+ {
+ "input": {
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The identifier of the KMS key whose key material will no longer be rotated. You can use the key ID or the Amazon Resource Name (ARN) of the KMS key."
+ }
+ },
+ "description": "The following example disables automatic annual rotation of the key material for the specified KMS key.",
+ "id": "to-disable-automatic-rotation-of-key-material-1478624396092",
+ "title": "To disable automatic rotation of key material"
+ }
+ ],
+ "DisconnectCustomKeyStore": [
+ {
+ "input": {
+ "CustomKeyStoreId": "cks-1234567890abcdef0"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ "CustomKeyStoreId": "The ID of the custom key store."
+ },
+ "output": {
+ }
+ },
+ "description": "This example disconnects an AWS KMS custom key store from its AWS CloudHSM cluster. This operation doesn't return any data. To verify that the custom key store is disconnected, use the <code>DescribeCustomKeyStores</code> operation.",
+ "id": "to-disconnect-a-custom-key-store-from-its-cloudhsm-cluster-1628627955156",
+ "title": "To disconnect a custom key store from its CloudHSM cluster"
+ }
+ ],
+ "EnableKey": [
+ {
+ "input": {
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The identifier of the KMS key to enable. You can use the key ID or the Amazon Resource Name (ARN) of the KMS key."
+ }
+ },
+ "description": "The following example enables the specified KMS key.",
+ "id": "to-enable-a-cmk-1478627501129",
+ "title": "To enable a KMS key"
+ }
+ ],
+ "EnableKeyRotation": [
+ {
+ "input": {
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The identifier of the KMS key whose key material will be rotated annually. You can use the key ID or the Amazon Resource Name (ARN) of the KMS key."
+ }
+ },
+ "description": "The following example enables automatic annual rotation of the key material for the specified KMS key.",
+ "id": "to-enable-automatic-rotation-of-key-material-1478629109677",
+ "title": "To enable automatic rotation of key material"
+ }
+ ],
+ "Encrypt": [
+ {
+ "input": {
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
+ "Plaintext": "<binary data>"
+ },
+ "output": {
+ "CiphertextBlob": "<binary data>",
+ "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The identifier of the KMS key to use for encryption. You can use the key ID or Amazon Resource Name (ARN) of the KMS key, or the name or ARN of an alias that refers to the KMS key.",
+ "Plaintext": "The data to encrypt."
+ },
+ "output": {
+ "CiphertextBlob": "The encrypted data (ciphertext).",
+ "KeyId": "The ARN of the KMS key that was used to encrypt the data."
+ }
+ },
+ "description": "The following example encrypts data with the specified KMS key.",
+ "id": "to-encrypt-data-1478906026012",
+ "title": "To encrypt data"
+ }
+ ],
+ "GenerateDataKey": [
+ {
+ "input": {
+ "KeyId": "alias/ExampleAlias",
+ "KeySpec": "AES_256"
+ },
+ "output": {
+ "CiphertextBlob": "<binary data>",
+ "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "Plaintext": "<binary data>"
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The identifier of the KMS key to use to encrypt the data key. You can use the key ID or Amazon Resource Name (ARN) of the KMS key, or the name or ARN of an alias that refers to the KMS key.",
+ "KeySpec": "Specifies the type of data key to return."
+ },
+ "output": {
+ "CiphertextBlob": "The encrypted data key.",
+ "KeyId": "The ARN of the KMS key that was used to encrypt the data key.",
+ "Plaintext": "The unencrypted (plaintext) data key."
+ }
+ },
+ "description": "The following example generates a 256-bit symmetric data encryption key (data key) in two formats. One is the unencrypted (plainext) data key, and the other is the data key encrypted with the specified KMS key.",
+ "id": "to-generate-a-data-key-1478912956062",
+ "title": "To generate a data key"
+ }
+ ],
+ "GenerateDataKeyPair": [
+ {
+ "input": {
+ "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "KeyPairSpec": "RSA_3072"
+ },
+ "output": {
+ "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "KeyPairSpec": "RSA_3072",
+ "PrivateKeyCiphertextBlob": "<binary data>",
+ "PrivateKeyPlaintext": "<binary data>",
+ "PublicKey": "<binary data>"
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The key ID of the symmetric encryption KMS key that encrypts the private RSA key in the data key pair.",
+ "KeyPairSpec": "The requested key spec of the RSA data key pair."
+ },
+ "output": {
+ "KeyId": "The key ARN of the symmetric encryption KMS key that was used to encrypt the private key.",
+ "KeyPairSpec": "The actual key spec of the RSA data key pair.",
+ "PrivateKeyCiphertextBlob": "The encrypted private key of the RSA data key pair.",
+ "PrivateKeyPlaintext": "The plaintext private key of the RSA data key pair.",
+ "PublicKey": "The public key (plaintext) of the RSA data key pair."
+ }
+ },
+ "description": "This example generates an RSA data key pair for encryption and decryption. The operation returns a plaintext public key and private key, and a copy of the private key that is encrypted under a symmetric encryption KMS key that you specify.",
+ "id": "to-generate-an-rsa-key-pair-for-encryption-and-decryption-1628619376878",
+ "title": "To generate an RSA key pair for encryption and decryption"
+ }
+ ],
+ "GenerateDataKeyPairWithoutPlaintext": [
+ {
+ "input": {
+ "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "KeyPairSpec": "ECC_NIST_P521"
+ },
+ "output": {
+ "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "KeyPairSpec": "ECC_NIST_P521",
+ "PrivateKeyCiphertextBlob": "<binary data>",
+ "PublicKey": "<binary data>"
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The symmetric encryption KMS key that encrypts the private key of the ECC data key pair.",
+ "KeyPairSpec": "The requested key spec of the ECC asymmetric data key pair."
+ },
+ "output": {
+ "KeyId": "The key ARN of the symmetric encryption KMS key that encrypted the private key in the ECC asymmetric data key pair.",
+ "KeyPairSpec": "The actual key spec of the ECC asymmetric data key pair.",
+ "PrivateKeyCiphertextBlob": "The encrypted private key of the asymmetric ECC data key pair.",
+ "PublicKey": "The public key (plaintext)."
+ }
+ },
+ "description": "This example returns an asymmetric elliptic curve (ECC) data key pair. The private key is encrypted under the symmetric encryption KMS key that you specify. This operation doesn't return a plaintext (unencrypted) private key.",
+ "id": "to-generate-an-asymmetric-data-key-pair-without-a-plaintext-key-1628620971564",
+ "title": "To generate an asymmetric data key pair without a plaintext key"
+ }
+ ],
+ "GenerateDataKeyWithoutPlaintext": [
+ {
+ "input": {
+ "KeyId": "alias/ExampleAlias",
+ "KeySpec": "AES_256"
+ },
+ "output": {
+ "CiphertextBlob": "<binary data>",
+ "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The identifier of the KMS key to use to encrypt the data key. You can use the key ID or Amazon Resource Name (ARN) of the KMS key, or the name or ARN of an alias that refers to the KMS key.",
+ "KeySpec": "Specifies the type of data key to return."
+ },
+ "output": {
+ "CiphertextBlob": "The encrypted data key.",
+ "KeyId": "The ARN of the KMS key that was used to encrypt the data key."
+ }
+ },
+ "description": "The following example generates an encrypted copy of a 256-bit symmetric data encryption key (data key). The data key is encrypted with the specified KMS key.",
+ "id": "to-generate-an-encrypted-data-key-1478914121134",
+ "title": "To generate an encrypted data key"
+ }
+ ],
+ "GenerateMac": [
+ {
+ "input": {
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
+ "MacAlgorithm": "HMAC_SHA_384",
+ "Message": "Hello World"
+ },
+ "output": {
+ "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "Mac": "<HMAC_TAG>",
+ "MacAlgorithm": "HMAC_SHA_384"
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The HMAC KMS key input to the HMAC algorithm.",
+ "MacAlgorithm": "The HMAC algorithm requested for the operation.",
+ "Message": "The message input to the HMAC algorithm."
+ },
+ "output": {
+ "KeyId": "The key ARN of the HMAC KMS key used in the operation.",
+ "Mac": "The HMAC tag that results from this operation.",
+ "MacAlgorithm": "The HMAC algorithm used in the operation."
+ }
+ },
+ "description": "This example generates an HMAC for a message, an HMAC KMS key, and a MAC algorithm. The algorithm must be supported by the specified HMAC KMS key.",
+ "id": "to-generate-an-hmac-for-a-message-1631570135665",
+ "title": "To generate an HMAC for a message"
+ }
+ ],
+ "GenerateRandom": [
+ {
+ "input": {
+ "NumberOfBytes": 32
+ },
+ "output": {
+ "Plaintext": "<binary data>"
+ },
+ "comments": {
+ "input": {
+ "NumberOfBytes": "The length of the random data, specified in number of bytes."
+ },
+ "output": {
+ "Plaintext": "The random data."
+ }
+ },
+ "description": "The following example generates 32 bytes of random data.",
+ "id": "to-generate-random-data-1479163645600",
+ "title": "To generate random data"
+ }
+ ],
+ "GetKeyPolicy": [
+ {
+ "input": {
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
+ "PolicyName": "default"
+ },
+ "output": {
+ "Policy": "{\n \"Version\" : \"2012-10-17\",\n \"Id\" : \"key-default-1\",\n \"Statement\" : [ {\n \"Sid\" : \"Enable IAM User Permissions\",\n \"Effect\" : \"Allow\",\n \"Principal\" : {\n \"AWS\" : \"arn:aws:iam::111122223333:root\"\n },\n \"Action\" : \"kms:*\",\n \"Resource\" : \"*\"\n } ]\n}"
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The identifier of the KMS key whose key policy you want to retrieve. You can use the key ID or the Amazon Resource Name (ARN) of the KMS key.",
+ "PolicyName": "The name of the key policy to retrieve."
+ },
+ "output": {
+ "Policy": "The key policy document."
+ }
+ },
+ "description": "The following example retrieves the key policy for the specified KMS key.",
+ "id": "to-retrieve-a-key-policy-1479170128325",
+ "title": "To retrieve a key policy"
+ }
+ ],
+ "GetKeyRotationStatus": [
+ {
+ "input": {
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "output": {
+ "KeyRotationEnabled": true
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The identifier of the KMS key whose key material rotation status you want to retrieve. You can use the key ID or the Amazon Resource Name (ARN) of the KMS key."
+ },
+ "output": {
+ "KeyRotationEnabled": "A boolean that indicates the key material rotation status. Returns true when automatic annual rotation of the key material is enabled, or false when it is not."
+ }
+ },
+ "description": "The following example retrieves the status of automatic annual rotation of the key material for the specified KMS key.",
+ "id": "to-retrieve-the-rotation-status-for-a-cmk-1479172287408",
+ "title": "To retrieve the rotation status for a KMS key"
+ }
+ ],
+ "GetParametersForImport": [
+ {
+ "input": {
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
+ "WrappingAlgorithm": "RSAES_OAEP_SHA_1",
+ "WrappingKeySpec": "RSA_2048"
+ },
+ "output": {
+ "ImportToken": "<binary data>",
+ "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "ParametersValidTo": "2016-12-01T14:52:17-08:00",
+ "PublicKey": "<binary data>"
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The identifier of the KMS key for which to retrieve the public key and import token. You can use the key ID or the Amazon Resource Name (ARN) of the KMS key.",
+ "WrappingAlgorithm": "The algorithm that you will use to encrypt the key material before importing it.",
+ "WrappingKeySpec": "The type of wrapping key (public key) to return in the response."
+ },
+ "output": {
+ "ImportToken": "The import token to send with a subsequent ImportKeyMaterial request.",
+ "KeyId": "The ARN of the KMS key for which you are retrieving the public key and import token. This is the same KMS key specified in the request.",
+ "ParametersValidTo": "The time at which the import token and public key are no longer valid.",
+ "PublicKey": "The public key to use to encrypt the key material before importing it."
+ }
+ },
+ "description": "The following example retrieves the public key and import token for the specified KMS key.",
+ "id": "to-retrieve-the-public-key-and-import-token-for-a-cmk-1480626483211",
+ "title": "To retrieve the public key and import token for a KMS key"
+ }
+ ],
+ "GetPublicKey": [
+ {
+ "input": {
+ "KeyId": "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"
+ },
+ "output": {
+ "CustomerMasterKeySpec": "RSA_4096",
+ "EncryptionAlgorithms": [
+ "RSAES_OAEP_SHA_1",
+ "RSAES_OAEP_SHA_256"
+ ],
+ "KeyId": "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321",
+ "KeyUsage": "ENCRYPT_DECRYPT",
+ "PublicKey": "<binary data>"
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The key ARN of the asymmetric KMS key."
+ },
+ "output": {
+ "CustomerMasterKeySpec": "The key spec of the asymmetric KMS key from which the public key was downloaded.",
+ "EncryptionAlgorithms": "The encryption algorithms supported by the asymmetric KMS key that was downloaded.",
+ "KeyId": "The key ARN of the asymmetric KMS key from which the public key was downloaded.",
+ "KeyUsage": "The key usage of the asymmetric KMS key from which the public key was downloaded.",
+ "PublicKey": "The public key (plaintext) of the asymmetric KMS key."
+ }
+ },
+ "description": "This example gets the public key of an asymmetric RSA KMS key used for encryption and decryption. The operation returns the key spec, key usage, and encryption or signing algorithms to help you use the public key correctly outside of AWS KMS.",
+ "id": "to-download-the-public-key-of-an-asymmetric-kms-key-1628621691873",
+ "title": "To download the public key of an asymmetric KMS key"
+ }
+ ],
+ "ImportKeyMaterial": [
+ {
+ "input": {
+ "EncryptedKeyMaterial": "<binary data>",
+ "ExpirationModel": "KEY_MATERIAL_DOES_NOT_EXPIRE",
+ "ImportToken": "<binary data>",
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "comments": {
+ "input": {
+ "EncryptedKeyMaterial": "The encrypted key material to import.",
+ "ExpirationModel": "A value that specifies whether the key material expires.",
+ "ImportToken": "The import token that you received in the response to a previous GetParametersForImport request.",
+ "KeyId": "The identifier of the KMS key to import the key material into. You can use the key ID or the Amazon Resource Name (ARN) of the KMS key."
+ }
+ },
+ "description": "The following example imports key material into the specified KMS key.",
+ "id": "to-import-key-material-into-a-cmk-1480630551969",
+ "title": "To import key material into a KMS key"
+ }
+ ],
+ "ListAliases": [
+ {
+ "output": {
+ "Aliases": [
+ {
+ "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/aws/acm",
+ "AliasName": "alias/aws/acm",
+ "TargetKeyId": "da03f6f7-d279-427a-9cae-de48d07e5b66"
+ },
+ {
+ "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/aws/ebs",
+ "AliasName": "alias/aws/ebs",
+ "TargetKeyId": "25a217e7-7170-4b8c-8bf6-045ea5f70e5b"
+ },
+ {
+ "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/aws/rds",
+ "AliasName": "alias/aws/rds",
+ "TargetKeyId": "7ec3104e-c3f2-4b5c-bf42-bfc4772c6685"
+ },
+ {
+ "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/aws/redshift",
+ "AliasName": "alias/aws/redshift",
+ "TargetKeyId": "08f7a25a-69e2-4fb5-8f10-393db27326fa"
+ },
+ {
+ "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/aws/s3",
+ "AliasName": "alias/aws/s3",
+ "TargetKeyId": "d2b0f1a3-580d-4f79-b836-bc983be8cfa5"
+ },
+ {
+ "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/example1",
+ "AliasName": "alias/example1",
+ "TargetKeyId": "4da1e216-62d0-46c5-a7c0-5f3a3d2f8046"
+ },
+ {
+ "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/example2",
+ "AliasName": "alias/example2",
+ "TargetKeyId": "f32fef59-2cc2-445b-8573-2d73328acbee"
+ },
+ {
+ "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/example3",
+ "AliasName": "alias/example3",
+ "TargetKeyId": "1374ef38-d34e-4d5f-b2c9-4e0daee38855"
+ }
+ ],
+ "Truncated": false
+ },
+ "comments": {
+ "output": {
+ "Aliases": "A list of aliases, including the key ID of the KMS key that each alias refers to.",
+ "Truncated": "A boolean that indicates whether there are more items in the list. Returns true when there are more items, or false when there are not."
+ }
+ },
+ "description": "The following example lists aliases.",
+ "id": "to-list-aliases-1480729693349",
+ "title": "To list aliases"
+ }
+ ],
+ "ListGrants": [
+ {
+ "input": {
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "output": {
+ "Grants": [
+ {
+ "CreationDate": "2016-10-25T14:37:41-07:00",
+ "GrantId": "91ad875e49b04a9d1f3bdeb84d821f9db6ea95e1098813f6d47f0c65fbe2a172",
+ "GranteePrincipal": "acm.us-east-2.amazonaws.com",
+ "IssuingAccount": "arn:aws:iam::111122223333:root",
+ "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "Operations": [
+ "Encrypt",
+ "ReEncryptFrom",
+ "ReEncryptTo"
+ ],
+ "RetiringPrincipal": "acm.us-east-2.amazonaws.com"
+ },
+ {
+ "CreationDate": "2016-10-25T14:37:41-07:00",
+ "GrantId": "a5d67d3e207a8fc1f4928749ee3e52eb0440493a8b9cf05bbfad91655b056200",
+ "GranteePrincipal": "acm.us-east-2.amazonaws.com",
+ "IssuingAccount": "arn:aws:iam::111122223333:root",
+ "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "Operations": [
+ "ReEncryptFrom",
+ "ReEncryptTo"
+ ],
+ "RetiringPrincipal": "acm.us-east-2.amazonaws.com"
+ },
+ {
+ "CreationDate": "2016-10-25T14:37:41-07:00",
+ "GrantId": "c541aaf05d90cb78846a73b346fc43e65be28b7163129488c738e0c9e0628f4f",
+ "GranteePrincipal": "acm.us-east-2.amazonaws.com",
+ "IssuingAccount": "arn:aws:iam::111122223333:root",
+ "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "Operations": [
+ "Encrypt",
+ "ReEncryptFrom",
+ "ReEncryptTo"
+ ],
+ "RetiringPrincipal": "acm.us-east-2.amazonaws.com"
+ },
+ {
+ "CreationDate": "2016-10-25T14:37:41-07:00",
+ "GrantId": "dd2052c67b4c76ee45caf1dc6a1e2d24e8dc744a51b36ae2f067dc540ce0105c",
+ "GranteePrincipal": "acm.us-east-2.amazonaws.com",
+ "IssuingAccount": "arn:aws:iam::111122223333:root",
+ "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "Operations": [
+ "Encrypt",
+ "ReEncryptFrom",
+ "ReEncryptTo"
+ ],
+ "RetiringPrincipal": "acm.us-east-2.amazonaws.com"
+ }
+ ],
+ "Truncated": true
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The identifier of the KMS key whose grants you want to list. You can use the key ID or the Amazon Resource Name (ARN) of the KMS key."
+ },
+ "output": {
+ "Grants": "A list of grants.",
+ "Truncated": "A boolean that indicates whether there are more items in the list. Returns true when there are more items, or false when there are not."
+ }
+ },
+ "description": "The following example lists grants for the specified KMS key.",
+ "id": "to-list-grants-for-a-cmk-1481067365389",
+ "title": "To list grants for a KMS key"
+ }
+ ],
+ "ListKeyPolicies": [
+ {
+ "input": {
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "output": {
+ "PolicyNames": [
+ "default"
+ ],
+ "Truncated": false
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The identifier of the KMS key whose key policies you want to list. You can use the key ID or the Amazon Resource Name (ARN) of the KMS key."
+ },
+ "output": {
+ "PolicyNames": "A list of key policy names.",
+ "Truncated": "A boolean that indicates whether there are more items in the list. Returns true when there are more items, or false when there are not."
+ }
+ },
+ "description": "The following example lists key policies for the specified KMS key.",
+ "id": "to-list-key-policies-for-a-cmk-1481069780998",
+ "title": "To list key policies for a KMS key"
+ }
+ ],
+ "ListKeys": [
+ {
+ "output": {
+ "Keys": [
+ {
+ "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/0d990263-018e-4e65-a703-eff731de951e",
+ "KeyId": "0d990263-018e-4e65-a703-eff731de951e"
+ },
+ {
+ "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/144be297-0ae1-44ac-9c8f-93cd8c82f841",
+ "KeyId": "144be297-0ae1-44ac-9c8f-93cd8c82f841"
+ },
+ {
+ "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/21184251-b765-428e-b852-2c7353e72571",
+ "KeyId": "21184251-b765-428e-b852-2c7353e72571"
+ },
+ {
+ "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/214fe92f-5b03-4ae1-b350-db2a45dbe10c",
+ "KeyId": "214fe92f-5b03-4ae1-b350-db2a45dbe10c"
+ },
+ {
+ "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/339963f2-e523-49d3-af24-a0fe752aa458",
+ "KeyId": "339963f2-e523-49d3-af24-a0fe752aa458"
+ },
+ {
+ "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/b776a44b-df37-4438-9be4-a27494e4271a",
+ "KeyId": "b776a44b-df37-4438-9be4-a27494e4271a"
+ },
+ {
+ "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/deaf6c9e-cf2c-46a6-bf6d-0b6d487cffbb",
+ "KeyId": "deaf6c9e-cf2c-46a6-bf6d-0b6d487cffbb"
+ }
+ ],
+ "Truncated": false
+ },
+ "comments": {
+ "output": {
+ "Keys": "A list of KMS keys, including the key ID and Amazon Resource Name (ARN) of each one.",
+ "Truncated": "A boolean that indicates whether there are more items in the list. Returns true when there are more items, or false when there are not."
+ }
+ },
+ "description": "The following example lists KMS keys.",
+ "id": "to-list-cmks-1481071643069",
+ "title": "To list KMS keys"
+ }
+ ],
+ "ListResourceTags": [
+ {
+ "input": {
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "output": {
+ "Tags": [
+ {
+ "TagKey": "CostCenter",
+ "TagValue": "87654"
+ },
+ {
+ "TagKey": "CreatedBy",
+ "TagValue": "ExampleUser"
+ },
+ {
+ "TagKey": "Purpose",
+ "TagValue": "Test"
+ }
+ ],
+ "Truncated": false
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The identifier of the KMS key whose tags you are listing. You can use the key ID or the Amazon Resource Name (ARN) of the KMS key."
+ },
+ "output": {
+ "Tags": "A list of tags.",
+ "Truncated": "A boolean that indicates whether there are more items in the list. Returns true when there are more items, or false when there are not."
+ }
+ },
+ "description": "The following example lists tags for a KMS key.",
+ "id": "to-list-tags-for-a-cmk-1483996855796",
+ "title": "To list tags for a KMS key"
+ }
+ ],
+ "ListRetirableGrants": [
+ {
+ "input": {
+ "RetiringPrincipal": "arn:aws:iam::111122223333:role/ExampleRole"
+ },
+ "output": {
+ "Grants": [
+ {
+ "CreationDate": "2016-12-07T11:09:35-08:00",
+ "GrantId": "0c237476b39f8bc44e45212e08498fbe3151305030726c0590dd8d3e9f3d6a60",
+ "GranteePrincipal": "arn:aws:iam::111122223333:role/ExampleRole",
+ "IssuingAccount": "arn:aws:iam::444455556666:root",
+ "KeyId": "arn:aws:kms:us-east-2:444455556666:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "Operations": [
+ "Decrypt",
+ "Encrypt"
+ ],
+ "RetiringPrincipal": "arn:aws:iam::111122223333:role/ExampleRole"
+ }
+ ],
+ "Truncated": false
+ },
+ "comments": {
+ "input": {
+ "RetiringPrincipal": "The retiring principal whose grants you want to list. Use the Amazon Resource Name (ARN) of a principal such as an AWS account (root), IAM user, federated user, or assumed role user."
+ },
+ "output": {
+ "Grants": "A list of grants that the specified principal can retire.",
+ "Truncated": "A boolean that indicates whether there are more items in the list. Returns true when there are more items, or false when there are not."
+ }
+ },
+ "description": "The following example lists the grants that the specified principal (identity) can retire.",
+ "id": "to-list-grants-that-the-specified-principal-can-retire-1481140499620",
+ "title": "To list grants that the specified principal can retire"
+ }
+ ],
+ "PutKeyPolicy": [
+ {
+ "input": {
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
+ "Policy": "{\n \"Version\": \"2012-10-17\",\n \"Id\": \"custom-policy-2016-12-07\",\n \"Statement\": [\n {\n \"Sid\": \"Enable IAM User Permissions\",\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"AWS\": \"arn:aws:iam::111122223333:root\"\n },\n \"Action\": \"kms:*\",\n \"Resource\": \"*\"\n },\n {\n \"Sid\": \"Allow access for Key Administrators\",\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"AWS\": [\n \"arn:aws:iam::111122223333:user/ExampleAdminUser\",\n \"arn:aws:iam::111122223333:role/ExampleAdminRole\"\n ]\n },\n \"Action\": [\n \"kms:Create*\",\n \"kms:Describe*\",\n \"kms:Enable*\",\n \"kms:List*\",\n \"kms:Put*\",\n \"kms:Update*\",\n \"kms:Revoke*\",\n \"kms:Disable*\",\n \"kms:Get*\",\n \"kms:Delete*\",\n \"kms:ScheduleKeyDeletion\",\n \"kms:CancelKeyDeletion\"\n ],\n \"Resource\": \"*\"\n },\n {\n \"Sid\": \"Allow use of the key\",\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"AWS\": \"arn:aws:iam::111122223333:role/ExamplePowerUserRole\"\n },\n \"Action\": [\n \"kms:Encrypt\",\n \"kms:Decrypt\",\n \"kms:ReEncrypt*\",\n \"kms:GenerateDataKey*\",\n \"kms:DescribeKey\"\n ],\n \"Resource\": \"*\"\n },\n {\n \"Sid\": \"Allow attachment of persistent resources\",\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"AWS\": \"arn:aws:iam::111122223333:role/ExamplePowerUserRole\"\n },\n \"Action\": [\n \"kms:CreateGrant\",\n \"kms:ListGrants\",\n \"kms:RevokeGrant\"\n ],\n \"Resource\": \"*\",\n \"Condition\": {\n \"Bool\": {\n \"kms:GrantIsForAWSResource\": \"true\"\n }\n }\n }\n ]\n}\n",
+ "PolicyName": "default"
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The identifier of the KMS key to attach the key policy to. You can use the key ID or the Amazon Resource Name (ARN) of the KMS key.",
+ "Policy": "The key policy document.",
+ "PolicyName": "The name of the key policy."
+ }
+ },
+ "description": "The following example attaches a key policy to the specified KMS key.",
+ "id": "to-attach-a-key-policy-to-a-cmk-1481147345018",
+ "title": "To attach a key policy to a KMS key"
+ }
+ ],
+ "ReEncrypt": [
+ {
+ "input": {
+ "CiphertextBlob": "<binary data>",
+ "DestinationKeyId": "0987dcba-09fe-87dc-65ba-ab0987654321"
+ },
+ "output": {
+ "CiphertextBlob": "<binary data>",
+ "KeyId": "arn:aws:kms:us-east-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321",
+ "SourceKeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "comments": {
+ "input": {
+ "CiphertextBlob": "The data to reencrypt.",
+ "DestinationKeyId": "The identifier of the KMS key to use to reencrypt the data. You can use any valid key identifier.",
+ "SourceKeyId": "The identifier of the KMS key to use to decrypt the data. You can use any valid key identifier."
+ },
+ "output": {
+ "CiphertextBlob": "The reencrypted data.",
+ "KeyId": "The ARN of the KMS key that was used to reencrypt the data.",
+ "SourceKeyId": "The ARN of the KMS key that was originally used to encrypt the data."
+ }
+ },
+ "description": "The following example reencrypts data with the specified KMS key.",
+ "id": "to-reencrypt-data-1481230358001",
+ "title": "To reencrypt data"
+ }
+ ],
+ "ReplicateKey": [
+ {
+ "input": {
+ "KeyId": "arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab",
+ "ReplicaRegion": "us-west-2"
+ },
+ "output": {
+ "ReplicaKeyMetadata": {
+ "AWSAccountId": "111122223333",
+ "Arn": "arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab",
+ "CreationDate": 1607472987.918,
+ "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
+ "Description": "",
+ "Enabled": true,
+ "EncryptionAlgorithms": [
+ "SYMMETRIC_DEFAULT"
+ ],
+ "KeyId": "mrk-1234abcd12ab34cd56ef1234567890ab",
+ "KeyManager": "CUSTOMER",
+ "KeyState": "Enabled",
+ "KeyUsage": "ENCRYPT_DECRYPT",
+ "MultiRegion": true,
+ "MultiRegionConfiguration": {
+ "MultiRegionKeyType": "REPLICA",
+ "PrimaryKey": {
+ "Arn": "arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab",
+ "Region": "us-east-1"
+ },
+ "ReplicaKeys": [
+ {
+ "Arn": "arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab",
+ "Region": "us-west-2"
+ }
+ ]
+ },
+ "Origin": "AWS_KMS"
+ },
+ "ReplicaPolicy": "{\n \"Version\" : \"2012-10-17\",\n \"Id\" : \"key-default-1\",...}",
+ "ReplicaTags": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The key ID or key ARN of the multi-Region primary key",
+ "ReplicaRegion": "The Region of the new replica."
+ },
+ "output": {
+ "ReplicaKeyMetadata": "An object that displays detailed information about the replica key.",
+ "ReplicaPolicy": "The key policy of the replica key. If you don't specify a key policy, the replica key gets the default key policy for a KMS key.",
+ "ReplicaTags": "The tags on the replica key, if any."
+ }
+ },
+ "description": "This example creates a multi-Region replica key in us-west-2 of a multi-Region primary key in us-east-1. ",
+ "id": "to-replicate-a-multi-region-key-in-a-different-aws-region-1628622402887",
+ "title": "To replicate a multi-Region key in a different AWS Region"
+ }
+ ],
+ "RetireGrant": [
+ {
+ "input": {
+ "GrantId": "0c237476b39f8bc44e45212e08498fbe3151305030726c0590dd8d3e9f3d6a60",
+ "KeyId": "arn:aws:kms:us-east-2:444455556666:key/1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "comments": {
+ "input": {
+ "GrantId": "The identifier of the grant to retire.",
+ "KeyId": "The Amazon Resource Name (ARN) of the KMS key associated with the grant."
+ }
+ },
+ "description": "The following example retires a grant.",
+ "id": "to-retire-a-grant-1481327028297",
+ "title": "To retire a grant"
+ }
+ ],
+ "RevokeGrant": [
+ {
+ "input": {
+ "GrantId": "0c237476b39f8bc44e45212e08498fbe3151305030726c0590dd8d3e9f3d6a60",
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "comments": {
+ "input": {
+ "GrantId": "The identifier of the grant to revoke.",
+ "KeyId": "The identifier of the KMS key associated with the grant. You can use the key ID or the Amazon Resource Name (ARN) of the KMS key."
+ }
+ },
+ "description": "The following example revokes a grant.",
+ "id": "to-revoke-a-grant-1481329549302",
+ "title": "To revoke a grant"
+ }
+ ],
+ "ScheduleKeyDeletion": [
+ {
+ "input": {
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
+ "PendingWindowInDays": 7
+ },
+ "output": {
+ "DeletionDate": "2016-12-17T16:00:00-08:00",
+ "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The identifier of the KMS key to schedule for deletion. You can use the key ID or the Amazon Resource Name (ARN) of the KMS key.",
+ "PendingWindowInDays": "The waiting period, specified in number of days. After the waiting period ends, KMS deletes the KMS key."
+ },
+ "output": {
+ "DeletionDate": "The date and time after which KMS deletes the KMS key.",
+ "KeyId": "The ARN of the KMS key that is scheduled for deletion."
+ }
+ },
+ "description": "The following example schedules the specified KMS key for deletion.",
+ "id": "to-schedule-a-cmk-for-deletion-1481331111094",
+ "title": "To schedule a KMS key for deletion"
+ }
+ ],
+ "Sign": [
+ {
+ "input": {
+ "KeyId": "alias/ECC_signing_key",
+ "Message": "<message to be signed>",
+ "MessageType": "RAW",
+ "SigningAlgorithm": "ECDSA_SHA_384"
+ },
+ "output": {
+ "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "Signature": "<binary data>",
+ "SigningAlgorithm": "ECDSA_SHA_384"
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The asymmetric KMS key to be used to generate the digital signature. This example uses an alias of the KMS key.",
+ "Message": "Message to be signed. Use Base-64 for the CLI.",
+ "MessageType": "Indicates whether the message is RAW or a DIGEST.",
+ "SigningAlgorithm": "The requested signing algorithm. This must be an algorithm that the KMS key supports."
+ },
+ "output": {
+ "KeyId": "The key ARN of the asymmetric KMS key that was used to sign the message.",
+ "Signature": "The digital signature of the message.",
+ "SigningAlgorithm": "The actual signing algorithm that was used to generate the signature."
+ }
+ },
+ "description": "This operation uses the private key in an asymmetric elliptic curve (ECC) KMS key to generate a digital signature for a given message.",
+ "id": "to-digitally-sign-a-message-with-an-asymmetric-kms-key-1628631433832",
+ "title": "To digitally sign a message with an asymmetric KMS key."
+ }
+ ],
+ "TagResource": [
+ {
+ "input": {
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
+ "Tags": [
+ {
+ "TagKey": "Purpose",
+ "TagValue": "Test"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The identifier of the KMS key you are tagging. You can use the key ID or the Amazon Resource Name (ARN) of the KMS key.",
+ "Tags": "A list of tags."
+ }
+ },
+ "description": "The following example tags a KMS key.",
+ "id": "to-tag-a-cmk-1483997246518",
+ "title": "To tag a KMS key"
+ }
+ ],
+ "UntagResource": [
+ {
+ "input": {
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
+ "TagKeys": [
+ "Purpose",
+ "CostCenter"
+ ]
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The identifier of the KMS key whose tags you are removing.",
+ "TagKeys": "A list of tag keys. Provide only the tag keys, not the tag values."
+ }
+ },
+ "description": "The following example removes tags from a KMS key.",
+ "id": "to-remove-tags-from-a-cmk-1483997590962",
+ "title": "To remove tags from a KMS key"
+ }
+ ],
+ "UpdateAlias": [
+ {
+ "input": {
+ "AliasName": "alias/ExampleAlias",
+ "TargetKeyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "comments": {
+ "input": {
+ "AliasName": "The alias to update.",
+ "TargetKeyId": "The identifier of the KMS key that the alias will refer to after this operation succeeds. You can use the key ID or the Amazon Resource Name (ARN) of the KMS key."
+ }
+ },
+ "description": "The following example updates the specified alias to refer to the specified KMS key.",
+ "id": "to-update-an-alias-1481572726920",
+ "title": "To update an alias"
+ }
+ ],
+ "UpdateCustomKeyStore": [
+ {
+ "input": {
+ "CustomKeyStoreId": "cks-1234567890abcdef0",
+ "KeyStorePassword": "ExamplePassword"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ "CustomKeyStoreId": "The ID of the custom key store that you are updating.",
+ "KeyStorePassword": "The password for the kmsuser crypto user in the CloudHSM cluster."
+ },
+ "output": {
+ }
+ },
+ "description": "This example tells KMS the password for the kmsuser crypto user in the AWS CloudHSM cluster that is associated with the AWS KMS custom key store. (It does not change the password in the CloudHSM cluster.) This operation does not return any data.",
+ "id": "to-edit-the-properties-of-a-custom-key-store-1628629851834",
+ "title": "To edit the password of a custom key store"
+ },
+ {
+ "input": {
+ "CustomKeyStoreId": "cks-1234567890abcdef0",
+ "NewCustomKeyStoreName": "DevelopmentKeys"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ "CustomKeyStoreId": "The ID of the custom key store that you are updating.",
+ "NewCustomKeyStoreName": "A new friendly name for the custom key store."
+ },
+ "output": {
+ }
+ },
+ "description": "This example changes the friendly name of the AWS KMS custom key store to the name that you specify. This operation does not return any data. To verify that the operation worked, use the DescribeCustomKeyStores operation.",
+ "id": "to-edit-the-friendly-name-of-a-custom-key-store-1630451340904",
+ "title": "To edit the friendly name of a custom key store"
+ },
+ {
+ "input": {
+ "CloudHsmClusterId": "cluster-1a23b4cdefg",
+ "CustomKeyStoreId": "cks-1234567890abcdef0"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ "CloudHsmClusterId": "The ID of the AWS CloudHSM cluster that you want to associate with the custom key store. This cluster must be related to the original CloudHSM cluster for this key store.",
+ "CustomKeyStoreId": "The ID of the custom key store that you are updating."
+ },
+ "output": {
+ }
+ },
+ "description": "This example changes the cluster that is associated with a custom key store to a related cluster, such as a different backup of the same cluster. This operation does not return any data. To verify that the operation worked, use the DescribeCustomKeyStores operation.",
+ "id": "to-associate-the-custom-key-store-with-a-different-but-related-aws-cloudhsm-cluster-1630451842438",
+ "title": "To associate the custom key store with a different, but related, AWS CloudHSM cluster."
+ }
+ ],
+ "UpdateKeyDescription": [
+ {
+ "input": {
+ "Description": "Example description that indicates the intended use of this KMS key.",
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
+ },
+ "comments": {
+ "input": {
+ "Description": "The updated description.",
+ "KeyId": "The identifier of the KMS key whose description you are updating. You can use the key ID or the Amazon Resource Name (ARN) of the KMS key."
+ }
+ },
+ "description": "The following example updates the description of the specified KMS key.",
+ "id": "to-update-the-description-of-a-cmk-1481574808619",
+ "title": "To update the description of a KMS key"
+ }
+ ],
+ "Verify": [
+ {
+ "input": {
+ "KeyId": "alias/ECC_signing_key",
+ "Message": "<message to be verified>",
+ "MessageType": "RAW",
+ "Signature": "<binary data>",
+ "SigningAlgorithm": "ECDSA_SHA_384"
+ },
+ "output": {
+ "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "SignatureValid": true,
+ "SigningAlgorithm": "ECDSA_SHA_384"
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The asymmetric KMS key to be used to verify the digital signature. This example uses an alias to identify the KMS key.",
+ "Message": "The message that was signed.",
+ "MessageType": "Indicates whether the message is RAW or a DIGEST.",
+ "Signature": "The signature to be verified.",
+ "SigningAlgorithm": "The signing algorithm to be used to verify the signature."
+ },
+ "output": {
+ "KeyId": "The key ARN of the asymmetric KMS key that was used to verify the digital signature.",
+ "SignatureValid": "A value of 'true' Indicates that the signature was verified. If verification fails, the call to Verify fails.",
+ "SigningAlgorithm": "The signing algorithm that was used to verify the signature."
+ }
+ },
+ "description": "This operation uses the public key in an elliptic curve (ECC) asymmetric key to verify a digital signature within AWS KMS. ",
+ "id": "to-use-an-asymmetric-kms-key-to-verify-a-digital-signature-1628633365663",
+ "title": "To use an asymmetric KMS key to verify a digital signature"
+ }
+ ],
+ "VerifyMac": [
+ {
+ "input": {
+ "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
+ "Mac": "<HMAC_TAG>",
+ "MacAlgorithm": "HMAC_SHA_384",
+ "Message": "Hello World"
+ },
+ "output": {
+ "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
+ "MacAlgorithm": "HMAC_SHA_384",
+ "MacValid": true
+ },
+ "comments": {
+ "input": {
+ "KeyId": "The HMAC KMS key input to the HMAC algorithm.",
+ "Mac": "The HMAC to be verified.",
+ "MacAlgorithm": "The HMAC algorithm requested for the operation.",
+ "Message": "The message input to the HMAC algorithm."
+ },
+ "output": {
+ "KeyId": "The key ARN of the HMAC key used in the operation.",
+ "MacAlgorithm": "The HMAC algorithm used in the operation.",
+ "MacValid": "A value of 'true' indicates that verification succeeded. If verification fails, the call to VerifyMac fails."
+ }
+ },
+ "description": "This example verifies an HMAC for a particular message, HMAC KMS keys, and MAC algorithm. A value of 'true' in the MacValid value in the response indicates that the HMAC is valid.",
+ "id": "to-verify-an-hmac-1631570863401",
+ "title": "To verify an HMAC"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kms/2014-11-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/kms/2014-11-01/paginators-1.json
new file mode 100644
index 00000000..0c48130a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kms/2014-11-01/paginators-1.json
@@ -0,0 +1,60 @@
+{
+ "pagination": {
+ "ListAliases": {
+ "limit_key": "Limit",
+ "input_token": "Marker",
+ "output_token": "NextMarker",
+ "more_results": "Truncated",
+ "result_key": "Aliases"
+ },
+ "ListGrants": {
+ "limit_key": "Limit",
+ "input_token": "Marker",
+ "output_token": "NextMarker",
+ "more_results": "Truncated",
+ "result_key": "Grants"
+ },
+ "ListKeyPolicies": {
+ "limit_key": "Limit",
+ "input_token": "Marker",
+ "output_token": "NextMarker",
+ "more_results": "Truncated",
+ "result_key": "PolicyNames"
+ },
+ "ListKeys": {
+ "limit_key": "Limit",
+ "input_token": "Marker",
+ "output_token": "NextMarker",
+ "more_results": "Truncated",
+ "result_key": "Keys"
+ },
+ "DescribeCustomKeyStores": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "more_results": "Truncated",
+ "output_token": "NextMarker",
+ "result_key": "CustomKeyStores"
+ },
+ "ListResourceTags": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "more_results": "Truncated",
+ "output_token": "NextMarker",
+ "result_key": "Tags"
+ },
+ "ListRetirableGrants": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "more_results": "Truncated",
+ "output_token": "NextMarker",
+ "result_key": "Grants"
+ },
+ "ListKeyRotations": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "more_results": "Truncated",
+ "output_token": "NextMarker",
+ "result_key": "Rotations"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/kms/2014-11-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/kms/2014-11-01/service-2.json.gz
new file mode 100644
index 00000000..2e96be07
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/kms/2014-11-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lakeformation/2017-03-31/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lakeformation/2017-03-31/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..ae31f752
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lakeformation/2017-03-31/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lakeformation/2017-03-31/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/lakeformation/2017-03-31/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lakeformation/2017-03-31/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lakeformation/2017-03-31/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/lakeformation/2017-03-31/paginators-1.json
new file mode 100644
index 00000000..5970057b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lakeformation/2017-03-31/paginators-1.json
@@ -0,0 +1,40 @@
+{
+ "pagination": {
+ "GetWorkUnits": {
+ "input_token": "NextToken",
+ "limit_key": "PageSize",
+ "output_token": "NextToken",
+ "result_key": "WorkUnitRanges"
+ },
+ "ListDataCellsFilter": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "DataCellsFilters"
+ },
+ "ListLFTags": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LFTags"
+ },
+ "SearchDatabasesByLFTags": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "DatabaseList"
+ },
+ "SearchTablesByLFTags": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TableList"
+ },
+ "ListLFTagExpressions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LFTagExpressions"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lakeformation/2017-03-31/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/lakeformation/2017-03-31/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..aea980d6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lakeformation/2017-03-31/paginators-1.sdk-extras.json
@@ -0,0 +1,12 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "GetWorkUnits": {
+ "non_aggregate_keys": [
+ "QueryId"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lakeformation/2017-03-31/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lakeformation/2017-03-31/service-2.json.gz
new file mode 100644
index 00000000..00bd737a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lakeformation/2017-03-31/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lambda/2014-11-11/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lambda/2014-11-11/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..343b3b06
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lambda/2014-11-11/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lambda/2014-11-11/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lambda/2014-11-11/service-2.json.gz
new file mode 100644
index 00000000..8aa96928
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lambda/2014-11-11/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lambda/2015-03-31/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lambda/2015-03-31/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..4e0d52de
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lambda/2015-03-31/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lambda/2015-03-31/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/lambda/2015-03-31/examples-1.json
new file mode 100644
index 00000000..c33c1bbe
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lambda/2015-03-31/examples-1.json
@@ -0,0 +1,1513 @@
+{
+ "version": "1.0",
+ "examples": {
+ "AddLayerVersionPermission": [
+ {
+ "input": {
+ "Action": "lambda:GetLayerVersion",
+ "LayerName": "my-layer",
+ "Principal": "223456789012",
+ "StatementId": "xaccount",
+ "VersionNumber": 1
+ },
+ "output": {
+ "RevisionId": "35d87451-f796-4a3f-a618-95a3671b0a0c",
+ "Statement": "{\"Sid\":\"xaccount\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::223456789012:root\"},\"Action\":\"lambda:GetLayerVersion\",\"Resource\":\"arn:aws:lambda:us-east-2:123456789012:layer:my-layer:1\"}"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example grants permission for the account 223456789012 to use version 1 of a layer named my-layer.",
+ "id": "to-add-permissions-to-a-layer-version-1586479797163",
+ "title": "To add permissions to a layer version"
+ }
+ ],
+ "AddPermission": [
+ {
+ "input": {
+ "Action": "lambda:InvokeFunction",
+ "FunctionName": "my-function",
+ "Principal": "s3.amazonaws.com",
+ "SourceAccount": "123456789012",
+ "SourceArn": "arn:aws:s3:::my-bucket-1xpuxmplzrlbh/*",
+ "StatementId": "s3"
+ },
+ "output": {
+ "Statement": "{\"Sid\":\"s3\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"s3.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-east-2:123456789012:function:my-function\",\"Condition\":{\"StringEquals\":{\"AWS:SourceAccount\":\"123456789012\"},\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:s3:::my-bucket-1xpuxmplzrlbh\"}}}"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example adds permission for Amazon S3 to invoke a Lambda function named my-function for notifications from a bucket named my-bucket-1xpuxmplzrlbh in account 123456789012.",
+ "id": "add-permission-1474651469455",
+ "title": "To grant Amazon S3 permission to invoke a function"
+ },
+ {
+ "input": {
+ "Action": "lambda:InvokeFunction",
+ "FunctionName": "my-function",
+ "Principal": "223456789012",
+ "StatementId": "xaccount"
+ },
+ "output": {
+ "Statement": "{\"Sid\":\"xaccount\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::223456789012:root\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-east-2:123456789012:function:my-function\"}"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example adds permission for account 223456789012 invoke a Lambda function named my-function.",
+ "id": "add-permission-1474651469456",
+ "title": "To grant another account permission to invoke a function"
+ }
+ ],
+ "CreateAlias": [
+ {
+ "input": {
+ "Description": "alias for live version of function",
+ "FunctionName": "my-function",
+ "FunctionVersion": "1",
+ "Name": "LIVE"
+ },
+ "output": {
+ "AliasArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function:LIVE",
+ "Description": "alias for live version of function",
+ "FunctionVersion": "1",
+ "Name": "LIVE",
+ "RevisionId": "873282ed-xmpl-4dc8-a069-d0c647e470c6"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates an alias named LIVE that points to version 1 of the my-function Lambda function.",
+ "id": "to-create-an-alias-for-a-lambda-function-1586480324259",
+ "title": "To create an alias for a Lambda function"
+ }
+ ],
+ "CreateEventSourceMapping": [
+ {
+ "input": {
+ "BatchSize": 5,
+ "EventSourceArn": "arn:aws:sqs:us-west-2:123456789012:my-queue",
+ "FunctionName": "my-function"
+ },
+ "output": {
+ "BatchSize": 5,
+ "EventSourceArn": "arn:aws:sqs:us-west-2:123456789012:my-queue",
+ "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function",
+ "LastModified": 1569284520.333,
+ "State": "Creating",
+ "StateTransitionReason": "USER_INITIATED",
+ "UUID": "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates a mapping between an SQS queue and the my-function Lambda function.",
+ "id": "to-create-a-mapping-between-an-event-source-and-an-aws-lambda-function-1586480555467",
+ "title": "To create a mapping between an event source and an AWS Lambda function"
+ }
+ ],
+ "CreateFunction": [
+ {
+ "input": {
+ "Code": {
+ "S3Bucket": "my-bucket-1xpuxmplzrlbh",
+ "S3Key": "function.zip"
+ },
+ "Description": "Process image objects from Amazon S3.",
+ "Environment": {
+ "Variables": {
+ "BUCKET": "my-bucket-1xpuxmplzrlbh",
+ "PREFIX": "inbound"
+ }
+ },
+ "FunctionName": "my-function",
+ "Handler": "index.handler",
+ "KMSKeyArn": "arn:aws:kms:us-west-2:123456789012:key/b0844d6c-xmpl-4463-97a4-d49f50839966",
+ "MemorySize": 256,
+ "Publish": true,
+ "Role": "arn:aws:iam::123456789012:role/lambda-role",
+ "Runtime": "nodejs12.x",
+ "Tags": {
+ "DEPARTMENT": "Assets"
+ },
+ "Timeout": 15,
+ "TracingConfig": {
+ "Mode": "Active"
+ }
+ },
+ "output": {
+ "CodeSha256": "YFgDgEKG3ugvF1+pX64gV6tu9qNuIYNUdgJm8nCxsm4=",
+ "CodeSize": 5797206,
+ "Description": "Process image objects from Amazon S3.",
+ "Environment": {
+ "Variables": {
+ "BUCKET": "my-bucket-1xpuxmplzrlbh",
+ "PREFIX": "inbound"
+ }
+ },
+ "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function",
+ "FunctionName": "my-function",
+ "Handler": "index.handler",
+ "KMSKeyArn": "arn:aws:kms:us-west-2:123456789012:key/b0844d6c-xmpl-4463-97a4-d49f50839966",
+ "LastModified": "2020-04-10T19:06:32.563+0000",
+ "LastUpdateStatus": "Successful",
+ "MemorySize": 256,
+ "RevisionId": "b75dcd81-xmpl-48a8-a75a-93ba8b5b9727",
+ "Role": "arn:aws:iam::123456789012:role/lambda-role",
+ "Runtime": "nodejs12.x",
+ "State": "Active",
+ "Timeout": 15,
+ "TracingConfig": {
+ "Mode": "Active"
+ },
+ "Version": "1"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates a function with a deployment package in Amazon S3 and enables X-Ray tracing and environment variable encryption.",
+ "id": "to-create-a-function-1586492061186",
+ "title": "To create a function"
+ }
+ ],
+ "DeleteAlias": [
+ {
+ "input": {
+ "FunctionName": "my-function",
+ "Name": "BLUE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes an alias named BLUE from a function named my-function",
+ "id": "to-delete-a-lambda-function-alias-1481660370804",
+ "title": "To delete a Lambda function alias"
+ }
+ ],
+ "DeleteEventSourceMapping": [
+ {
+ "input": {
+ "UUID": "14e0db71-xmpl-4eb5-b481-8945cf9d10c2"
+ },
+ "output": {
+ "BatchSize": 5,
+ "EventSourceArn": "arn:aws:sqs:us-west-2:123456789012:my-queue",
+ "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
+ "LastModified": "2016-11-21T19:49:20.006+0000",
+ "State": "Enabled",
+ "StateTransitionReason": "USER_INITIATED",
+ "UUID": "14e0db71-xmpl-4eb5-b481-8945cf9d10c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes an event source mapping. To get a mapping's UUID, use ListEventSourceMappings.",
+ "id": "to-delete-a-lambda-function-event-source-mapping-1481658973862",
+ "title": "To delete a Lambda function event source mapping"
+ }
+ ],
+ "DeleteFunction": [
+ {
+ "input": {
+ "FunctionName": "my-function",
+ "Qualifier": "1"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes version 1 of a Lambda function named my-function.",
+ "id": "to-delete-a-lambda-function-1481648553696",
+ "title": "To delete a version of a Lambda function"
+ }
+ ],
+ "DeleteFunctionConcurrency": [
+ {
+ "input": {
+ "FunctionName": "my-function"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes the reserved concurrent execution limit from a function named my-function.",
+ "id": "to-remove-the-reserved-concurrent-execution-limit-from-a-function-1586480714680",
+ "title": "To remove the reserved concurrent execution limit from a function"
+ }
+ ],
+ "DeleteFunctionEventInvokeConfig": [
+ {
+ "input": {
+ "FunctionName": "my-function",
+ "Qualifier": "GREEN"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes the asynchronous invocation configuration for the GREEN alias of a function named my-function.",
+ "id": "to-delete-an-asynchronous-invocation-configuration-1586481102187",
+ "title": "To delete an asynchronous invocation configuration"
+ }
+ ],
+ "DeleteLayerVersion": [
+ {
+ "input": {
+ "LayerName": "my-layer",
+ "VersionNumber": 2
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes version 2 of a layer named my-layer.",
+ "id": "to-delete-a-version-of-a-lambda-layer-1586481157547",
+ "title": "To delete a version of a Lambda layer"
+ }
+ ],
+ "DeleteProvisionedConcurrencyConfig": [
+ {
+ "input": {
+ "FunctionName": "my-function",
+ "Qualifier": "GREEN"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes the provisioned concurrency configuration for the GREEN alias of a function named my-function.",
+ "id": "to-delete-a-provisioned-concurrency-configuration-1586481032551",
+ "title": "To delete a provisioned concurrency configuration"
+ }
+ ],
+ "GetAccountSettings": [
+ {
+ "input": {
+ },
+ "output": {
+ "AccountLimit": {
+ "CodeSizeUnzipped": 262144000,
+ "CodeSizeZipped": 52428800,
+ "ConcurrentExecutions": 1000,
+ "TotalCodeSize": 80530636800,
+ "UnreservedConcurrentExecutions": 1000
+ },
+ "AccountUsage": {
+ "FunctionCount": 4,
+ "TotalCodeSize": 9426
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation takes no parameters and returns details about storage and concurrency quotas in the current Region.",
+ "id": "to-get-account-settings-1481657495274",
+ "title": "To get account settings"
+ }
+ ],
+ "GetAlias": [
+ {
+ "input": {
+ "FunctionName": "my-function",
+ "Name": "BLUE"
+ },
+ "output": {
+ "AliasArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function:BLUE",
+ "Description": "Production environment BLUE.",
+ "FunctionVersion": "3",
+ "Name": "BLUE",
+ "RevisionId": "594f41fb-xmpl-4c20-95c7-6ca5f2a92c93"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns details about an alias named BLUE for a function named my-function",
+ "id": "to-retrieve-a-lambda-function-alias-1481648742254",
+ "title": "To get a Lambda function alias"
+ }
+ ],
+ "GetEventSourceMapping": [
+ {
+ "input": {
+ "UUID": "14e0db71-xmpl-4eb5-b481-8945cf9d10c2"
+ },
+ "output": {
+ "BatchSize": 500,
+ "BisectBatchOnFunctionError": false,
+ "DestinationConfig": {
+ },
+ "EventSourceArn": "arn:aws:sqs:us-east-2:123456789012:mySQSqueue",
+ "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:myFunction",
+ "LastModified": "2016-11-21T19:49:20.006+0000",
+ "LastProcessingResult": "No records processed",
+ "MaximumRecordAgeInSeconds": 604800,
+ "MaximumRetryAttempts": 10000,
+ "State": "Creating",
+ "StateTransitionReason": "User action",
+ "UUID": "14e0db71-xmpl-4eb5-b481-8945cf9d10c2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns details about an event source mapping. To get a mapping's UUID, use ListEventSourceMappings.",
+ "id": "to-get-a-lambda-functions-event-source-mapping-1481661622799",
+ "title": "To get a Lambda function's event source mapping"
+ }
+ ],
+ "GetFunction": [
+ {
+ "input": {
+ "FunctionName": "my-function",
+ "Qualifier": "1"
+ },
+ "output": {
+ "Code": {
+ "Location": "https://awslambda-us-west-2-tasks.s3.us-west-2.amazonaws.com/snapshots/123456789012/my-function-e7d9d1ed-xmpl-4f79-904a-4b87f2681f30?versionId=sH3TQwBOaUy...",
+ "RepositoryType": "S3"
+ },
+ "Configuration": {
+ "CodeSha256": "YFgDgEKG3ugvF1+pX64gV6tu9qNuIYNUdgJm8nCxsm4=",
+ "CodeSize": 5797206,
+ "Description": "Process image objects from Amazon S3.",
+ "Environment": {
+ "Variables": {
+ "BUCKET": "my-bucket-1xpuxmplzrlbh",
+ "PREFIX": "inbound"
+ }
+ },
+ "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function",
+ "FunctionName": "my-function",
+ "Handler": "index.handler",
+ "KMSKeyArn": "arn:aws:kms:us-west-2:123456789012:key/b0844d6c-xmpl-4463-97a4-d49f50839966",
+ "LastModified": "2020-04-10T19:06:32.563+0000",
+ "LastUpdateStatus": "Successful",
+ "MemorySize": 256,
+ "RevisionId": "b75dcd81-xmpl-48a8-a75a-93ba8b5b9727",
+ "Role": "arn:aws:iam::123456789012:role/lambda-role",
+ "Runtime": "nodejs12.x",
+ "State": "Active",
+ "Timeout": 15,
+ "TracingConfig": {
+ "Mode": "Active"
+ },
+ "Version": "$LATEST"
+ },
+ "Tags": {
+ "DEPARTMENT": "Assets"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns code and configuration details for version 1 of a function named my-function.",
+ "id": "to-get-a-lambda-function-1481661622799",
+ "title": "To get a Lambda function"
+ }
+ ],
+ "GetFunctionConcurrency": [
+ {
+ "input": {
+ "FunctionName": "my-function"
+ },
+ "output": {
+ "ReservedConcurrentExecutions": 250
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the reserved concurrency setting for a function named my-function.",
+ "id": "to-get-the-reserved-concurrency-setting-for-a-function-1586481279992",
+ "title": "To get the reserved concurrency setting for a function"
+ }
+ ],
+ "GetFunctionConfiguration": [
+ {
+ "input": {
+ "FunctionName": "my-function",
+ "Qualifier": "1"
+ },
+ "output": {
+ "CodeSha256": "YFgDgEKG3ugvF1+pX64gV6tu9qNuIYNUdgJm8nCxsm4=",
+ "CodeSize": 5797206,
+ "Description": "Process image objects from Amazon S3.",
+ "Environment": {
+ "Variables": {
+ "BUCKET": "my-bucket-1xpuxmplzrlbh",
+ "PREFIX": "inbound"
+ }
+ },
+ "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function",
+ "FunctionName": "my-function",
+ "Handler": "index.handler",
+ "KMSKeyArn": "arn:aws:kms:us-west-2:123456789012:key/b0844d6c-xmpl-4463-97a4-d49f50839966",
+ "LastModified": "2020-04-10T19:06:32.563+0000",
+ "LastUpdateStatus": "Successful",
+ "MemorySize": 256,
+ "RevisionId": "b75dcd81-xmpl-48a8-a75a-93ba8b5b9727",
+ "Role": "arn:aws:iam::123456789012:role/lambda-role",
+ "Runtime": "nodejs12.x",
+ "State": "Active",
+ "Timeout": 15,
+ "TracingConfig": {
+ "Mode": "Active"
+ },
+ "Version": "$LATEST"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns and configuration details for version 1 of a function named my-function.",
+ "id": "to-get-a-lambda-functions-event-source-mapping-1481661622799",
+ "title": "To get a Lambda function's event source mapping"
+ }
+ ],
+ "GetFunctionEventInvokeConfig": [
+ {
+ "input": {
+ "FunctionName": "my-function",
+ "Qualifier": "BLUE"
+ },
+ "output": {
+ "DestinationConfig": {
+ "OnFailure": {
+ "Destination": "arn:aws:sqs:us-east-2:123456789012:failed-invocations"
+ },
+ "OnSuccess": {
+ }
+ },
+ "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function:BLUE",
+ "LastModified": "2016-11-21T19:49:20.006+0000",
+ "MaximumEventAgeInSeconds": 3600,
+ "MaximumRetryAttempts": 0
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the asynchronous invocation configuration for the BLUE alias of a function named my-function.",
+ "id": "to-get-an-asynchronous-invocation-configuration-1586481338463",
+ "title": "To get an asynchronous invocation configuration"
+ }
+ ],
+ "GetLayerVersion": [
+ {
+ "input": {
+ "LayerName": "my-layer",
+ "VersionNumber": 1
+ },
+ "output": {
+ "CompatibleRuntimes": [
+ "python3.6",
+ "python3.7"
+ ],
+ "Content": {
+ "CodeSha256": "tv9jJO+rPbXUUXuRKi7CwHzKtLDkDRJLB3cC3Z/ouXo=",
+ "CodeSize": 169,
+ "Location": "https://awslambda-us-east-2-layers.s3.us-east-2.amazonaws.com/snapshots/123456789012/my-layer-4aaa2fbb-ff77-4b0a-ad92-5b78a716a96a?versionId=27iWyA73cCAYqyH..."
+ },
+ "CreatedDate": "2018-11-14T23:03:52.894+0000",
+ "Description": "My Python layer",
+ "LayerArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer",
+ "LayerVersionArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:1",
+ "LicenseInfo": "MIT",
+ "Version": 1
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information for version 1 of a layer named my-layer.",
+ "id": "to-get-information-about-a-lambda-layer-version-1586481457839",
+ "title": "To get information about a Lambda layer version"
+ }
+ ],
+ "GetLayerVersionByArn": [
+ {
+ "input": {
+ "Arn": "arn:aws:lambda:ca-central-1:123456789012:layer:blank-python-lib:3"
+ },
+ "output": {
+ "CompatibleRuntimes": [
+ "python3.8"
+ ],
+ "Content": {
+ "CodeSha256": "6x+xmpl/M3BnQUk7gS9sGmfeFsR/npojXoA3fZUv4eU=",
+ "CodeSize": 9529009,
+ "Location": "https://awslambda-us-east-2-layers.s3.us-east-2.amazonaws.com/snapshots/123456789012/blank-python-lib-e5212378-xmpl-44ee-8398-9d8ec5113949?versionId=WbZnvf..."
+ },
+ "CreatedDate": "2020-03-31T00:35:18.949+0000",
+ "Description": "Dependencies for the blank-python sample app.",
+ "LayerArn": "arn:aws:lambda:us-east-2:123456789012:layer:blank-python-lib",
+ "LayerVersionArn": "arn:aws:lambda:us-east-2:123456789012:layer:blank-python-lib:3",
+ "Version": 3
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information about the layer version with the specified Amazon Resource Name (ARN).",
+ "id": "to-get-information-about-a-lambda-layer-version-1586481457839",
+ "title": "To get information about a Lambda layer version"
+ }
+ ],
+ "GetPolicy": [
+ {
+ "input": {
+ "FunctionName": "my-function",
+ "Qualifier": "1"
+ },
+ "output": {
+ "Policy": "{\"Version\":\"2012-10-17\",\"Id\":\"default\",\"Statement\":[{\"Sid\":\"xaccount\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::123456789012:root\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-east-2:123456789012:function:my-function:1\"}]}",
+ "RevisionId": "4843f2f6-7c59-4fda-b484-afd0bc0e22b8"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the resource-based policy for version 1 of a Lambda function named my-function.",
+ "id": "to-retrieve-a-lambda-function-policy-1481649319053",
+ "title": "To retrieve a Lambda function policy"
+ }
+ ],
+ "GetProvisionedConcurrencyConfig": [
+ {
+ "input": {
+ "FunctionName": "my-function",
+ "Qualifier": "BLUE"
+ },
+ "output": {
+ "AllocatedProvisionedConcurrentExecutions": 100,
+ "AvailableProvisionedConcurrentExecutions": 100,
+ "LastModified": "2019-12-31T20:28:49+0000",
+ "RequestedProvisionedConcurrentExecutions": 100,
+ "Status": "READY"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns details for the provisioned concurrency configuration for the BLUE alias of the specified function.",
+ "id": "to-get-a-provisioned-concurrency-configuration-1586490192690",
+ "title": "To get a provisioned concurrency configuration"
+ },
+ {
+ "input": {
+ "FunctionName": "my-function",
+ "Qualifier": "BLUE"
+ },
+ "output": {
+ "AllocatedProvisionedConcurrentExecutions": 100,
+ "AvailableProvisionedConcurrentExecutions": 100,
+ "LastModified": "2019-12-31T20:28:49+0000",
+ "RequestedProvisionedConcurrentExecutions": 100,
+ "Status": "READY"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example displays details for the provisioned concurrency configuration for the BLUE alias of the specified function.",
+ "id": "to-view-a-provisioned-concurrency-configuration-1586490192690",
+ "title": "To view a provisioned concurrency configuration"
+ }
+ ],
+ "Invoke": [
+ {
+ "input": {
+ "FunctionName": "my-function",
+ "Payload": "{}",
+ "Qualifier": "1"
+ },
+ "output": {
+ "Payload": "200 SUCCESS",
+ "StatusCode": 200
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example invokes version 1 of a function named my-function with an empty event payload.",
+ "id": "to-invoke-a-lambda-function-1481659683915",
+ "title": "To invoke a Lambda function"
+ },
+ {
+ "input": {
+ "FunctionName": "my-function",
+ "InvocationType": "Event",
+ "Payload": "{}",
+ "Qualifier": "1"
+ },
+ "output": {
+ "Payload": "",
+ "StatusCode": 202
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example invokes version 1 of a function named my-function asynchronously.",
+ "id": "to-invoke-a-lambda-function-async-1481659683915",
+ "title": "To invoke a Lambda function asynchronously"
+ }
+ ],
+ "InvokeAsync": [
+ {
+ "input": {
+ "FunctionName": "my-function",
+ "InvokeArgs": "{}"
+ },
+ "output": {
+ "Status": 202
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example invokes a Lambda function asynchronously",
+ "id": "to-invoke-a-lambda-function-asynchronously-1481649694923",
+ "title": "To invoke a Lambda function asynchronously"
+ }
+ ],
+ "ListAliases": [
+ {
+ "input": {
+ "FunctionName": "my-function"
+ },
+ "output": {
+ "Aliases": [
+ {
+ "AliasArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function:BETA",
+ "Description": "Production environment BLUE.",
+ "FunctionVersion": "2",
+ "Name": "BLUE",
+ "RevisionId": "a410117f-xmpl-494e-8035-7e204bb7933b",
+ "RoutingConfig": {
+ "AdditionalVersionWeights": {
+ "1": 0.7
+ }
+ }
+ },
+ {
+ "AliasArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function:LIVE",
+ "Description": "Production environment GREEN.",
+ "FunctionVersion": "1",
+ "Name": "GREEN",
+ "RevisionId": "21d40116-xmpl-40ba-9360-3ea284da1bb5"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns a list of aliases for a function named my-function.",
+ "id": "to-list-a-functions-aliases-1481650199732",
+ "title": "To list a function's aliases"
+ }
+ ],
+ "ListEventSourceMappings": [
+ {
+ "input": {
+ "FunctionName": "my-function"
+ },
+ "output": {
+ "EventSourceMappings": [
+ {
+ "BatchSize": 5,
+ "EventSourceArn": "arn:aws:sqs:us-west-2:123456789012:mySQSqueue",
+ "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function",
+ "LastModified": 1569284520.333,
+ "State": "Enabled",
+ "StateTransitionReason": "USER_INITIATED",
+ "UUID": "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns a list of the event source mappings for a function named my-function.",
+ "id": "to-list-the-event-source-mappings-for-a-function-1586490285906",
+ "title": "To list the event source mappings for a function"
+ }
+ ],
+ "ListFunctionEventInvokeConfigs": [
+ {
+ "input": {
+ "FunctionName": "my-function"
+ },
+ "output": {
+ "FunctionEventInvokeConfigs": [
+ {
+ "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function:GREEN",
+ "LastModified": 1577824406.719,
+ "MaximumEventAgeInSeconds": 1800,
+ "MaximumRetryAttempts": 2
+ },
+ {
+ "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function:BLUE",
+ "LastModified": 1577824396.653,
+ "MaximumEventAgeInSeconds": 3600,
+ "MaximumRetryAttempts": 0
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns a list of asynchronous invocation configurations for a function named my-function.",
+ "id": "to-view-a-list-of-asynchronous-invocation-configurations-1586490355611",
+ "title": "To view a list of asynchronous invocation configurations"
+ }
+ ],
+ "ListFunctions": [
+ {
+ "input": {
+ },
+ "output": {
+ "Functions": [
+ {
+ "CodeSha256": "dBG9m8SGdmlEjw/JYXlhhvCrAv5TxvXsbL/RMr0fT/I=",
+ "CodeSize": 294,
+ "Description": "",
+ "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:helloworld",
+ "FunctionName": "helloworld",
+ "Handler": "helloworld.handler",
+ "LastModified": "2019-09-23T18:32:33.857+0000",
+ "MemorySize": 128,
+ "RevisionId": "1718e831-badf-4253-9518-d0644210af7b",
+ "Role": "arn:aws:iam::123456789012:role/service-role/MyTestFunction-role-zgur6bf4",
+ "Runtime": "nodejs10.x",
+ "Timeout": 3,
+ "TracingConfig": {
+ "Mode": "PassThrough"
+ },
+ "Version": "$LATEST"
+ },
+ {
+ "CodeSha256": "sU0cJ2/hOZevwV/lTxCuQqK3gDZP3i8gUoqUUVRmY6E=",
+ "CodeSize": 266,
+ "Description": "",
+ "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function",
+ "FunctionName": "my-function",
+ "Handler": "index.handler",
+ "LastModified": "2019-10-01T16:47:28.490+0000",
+ "MemorySize": 256,
+ "RevisionId": "93017fc9-59cb-41dc-901b-4845ce4bf668",
+ "Role": "arn:aws:iam::123456789012:role/service-role/helloWorldPython-role-uy3l9qyq",
+ "Runtime": "nodejs10.x",
+ "Timeout": 3,
+ "TracingConfig": {
+ "Mode": "PassThrough"
+ },
+ "Version": "$LATEST",
+ "VpcConfig": {
+ "SecurityGroupIds": [
+
+ ],
+ "SubnetIds": [
+
+ ],
+ "VpcId": ""
+ }
+ }
+ ],
+ "NextMarker": ""
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation returns a list of Lambda functions.",
+ "id": "to-get-a-list-of-lambda-functions-1481650507425",
+ "title": "To get a list of Lambda functions"
+ }
+ ],
+ "ListLayerVersions": [
+ {
+ "input": {
+ "LayerName": "blank-java-lib"
+ },
+ "output": {
+ "LayerVersions": [
+ {
+ "CompatibleRuntimes": [
+ "java8"
+ ],
+ "CreatedDate": "2020-03-18T23:38:42.284+0000",
+ "Description": "Dependencies for the blank-java sample app.",
+ "LayerVersionArn": "arn:aws:lambda:us-east-2:123456789012:layer:blank-java-lib:7",
+ "Version": 7
+ },
+ {
+ "CompatibleRuntimes": [
+ "java8"
+ ],
+ "CreatedDate": "2020-03-17T07:24:21.960+0000",
+ "Description": "Dependencies for the blank-java sample app.",
+ "LayerVersionArn": "arn:aws:lambda:us-east-2:123456789012:layer:blank-java-lib:6",
+ "Version": 6
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example displays information about the versions for the layer named blank-java-lib",
+ "id": "to-list-versions-of-a-layer-1586490857297",
+ "title": "To list versions of a layer"
+ }
+ ],
+ "ListLayers": [
+ {
+ "input": {
+ "CompatibleRuntime": "python3.7"
+ },
+ "output": {
+ "Layers": [
+ {
+ "LatestMatchingVersion": {
+ "CompatibleRuntimes": [
+ "python3.6",
+ "python3.7"
+ ],
+ "CreatedDate": "2018-11-15T00:37:46.592+0000",
+ "Description": "My layer",
+ "LayerVersionArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:2",
+ "Version": 2
+ },
+ "LayerArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer",
+ "LayerName": "my-layer"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns information about layers that are compatible with the Python 3.7 runtime.",
+ "id": "to-list-the-layers-that-are-compatible-with-your-functions-runtime-1586490857297",
+ "title": "To list the layers that are compatible with your function's runtime"
+ }
+ ],
+ "ListProvisionedConcurrencyConfigs": [
+ {
+ "input": {
+ "FunctionName": "my-function"
+ },
+ "output": {
+ "ProvisionedConcurrencyConfigs": [
+ {
+ "AllocatedProvisionedConcurrentExecutions": 100,
+ "AvailableProvisionedConcurrentExecutions": 100,
+ "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function:GREEN",
+ "LastModified": "2019-12-31T20:29:00+0000",
+ "RequestedProvisionedConcurrentExecutions": 100,
+ "Status": "READY"
+ },
+ {
+ "AllocatedProvisionedConcurrentExecutions": 100,
+ "AvailableProvisionedConcurrentExecutions": 100,
+ "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function:BLUE",
+ "LastModified": "2019-12-31T20:28:49+0000",
+ "RequestedProvisionedConcurrentExecutions": 100,
+ "Status": "READY"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns a list of provisioned concurrency configurations for a function named my-function.",
+ "id": "to-get-a-list-of-provisioned-concurrency-configurations-1586491032592",
+ "title": "To get a list of provisioned concurrency configurations"
+ }
+ ],
+ "ListTags": [
+ {
+ "input": {
+ "Resource": "arn:aws:lambda:us-west-2:123456789012:function:my-function"
+ },
+ "output": {
+ "Tags": {
+ "Category": "Web Tools",
+ "Department": "Sales"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example displays the tags attached to the my-function Lambda function.",
+ "id": "to-retrieve-the-list-of-tags-for-a-lambda-function-1586491111498",
+ "title": "To retrieve the list of tags for a Lambda function"
+ }
+ ],
+ "ListVersionsByFunction": [
+ {
+ "input": {
+ "FunctionName": "my-function"
+ },
+ "output": {
+ "Versions": [
+ {
+ "CodeSha256": "YFgDgEKG3ugvF1+pX64gV6tu9qNuIYNUdgJm8nCxsm4=",
+ "CodeSize": 5797206,
+ "Description": "Process image objects from Amazon S3.",
+ "Environment": {
+ "Variables": {
+ "BUCKET": "my-bucket-1xpuxmplzrlbh",
+ "PREFIX": "inbound"
+ }
+ },
+ "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function",
+ "FunctionName": "my-function",
+ "Handler": "index.handler",
+ "KMSKeyArn": "arn:aws:kms:us-west-2:123456789012:key/b0844d6c-xmpl-4463-97a4-d49f50839966",
+ "LastModified": "2020-04-10T19:06:32.563+0000",
+ "MemorySize": 256,
+ "RevisionId": "850ca006-2d98-4ff4-86db-8766e9d32fe9",
+ "Role": "arn:aws:iam::123456789012:role/lambda-role",
+ "Runtime": "nodejs12.x",
+ "Timeout": 15,
+ "TracingConfig": {
+ "Mode": "Active"
+ },
+ "Version": "$LATEST"
+ },
+ {
+ "CodeSha256": "YFgDgEKG3ugvF1+pX64gV6tu9qNuIYNUdgJm8nCxsm4=",
+ "CodeSize": 5797206,
+ "Description": "Process image objects from Amazon S3.",
+ "Environment": {
+ "Variables": {
+ "BUCKET": "my-bucket-1xpuxmplzrlbh",
+ "PREFIX": "inbound"
+ }
+ },
+ "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function",
+ "FunctionName": "my-function",
+ "Handler": "index.handler",
+ "KMSKeyArn": "arn:aws:kms:us-west-2:123456789012:key/b0844d6c-xmpl-4463-97a4-d49f50839966",
+ "LastModified": "2020-04-10T19:06:32.563+0000",
+ "MemorySize": 256,
+ "RevisionId": "b75dcd81-xmpl-48a8-a75a-93ba8b5b9727",
+ "Role": "arn:aws:iam::123456789012:role/lambda-role",
+ "Runtime": "nodejs12.x",
+ "Timeout": 5,
+ "TracingConfig": {
+ "Mode": "Active"
+ },
+ "Version": "1"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns a list of versions of a function named my-function",
+ "id": "to-list-versions-1481650603750",
+ "title": "To list versions of a function"
+ }
+ ],
+ "PublishLayerVersion": [
+ {
+ "input": {
+ "CompatibleRuntimes": [
+ "python3.6",
+ "python3.7"
+ ],
+ "Content": {
+ "S3Bucket": "lambda-layers-us-west-2-123456789012",
+ "S3Key": "layer.zip"
+ },
+ "Description": "My Python layer",
+ "LayerName": "my-layer",
+ "LicenseInfo": "MIT"
+ },
+ "output": {
+ "CompatibleRuntimes": [
+ "python3.6",
+ "python3.7"
+ ],
+ "Content": {
+ "CodeSha256": "tv9jJO+rPbXUUXuRKi7CwHzKtLDkDRJLB3cC3Z/ouXo=",
+ "CodeSize": 169,
+ "Location": "https://awslambda-us-west-2-layers.s3.us-west-2.amazonaws.com/snapshots/123456789012/my-layer-4aaa2fbb-ff77-4b0a-ad92-5b78a716a96a?versionId=27iWyA73cCAYqyH..."
+ },
+ "CreatedDate": "2018-11-14T23:03:52.894+0000",
+ "Description": "My Python layer",
+ "LayerArn": "arn:aws:lambda:us-west-2:123456789012:layer:my-layer",
+ "LayerVersionArn": "arn:aws:lambda:us-west-2:123456789012:layer:my-layer:1",
+ "LicenseInfo": "MIT",
+ "Version": 1
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates a new Python library layer version. The command retrieves the layer content a file named layer.zip in the specified S3 bucket.",
+ "id": "to-create-a-lambda-layer-version-1586491213595",
+ "title": "To create a Lambda layer version"
+ }
+ ],
+ "PublishVersion": [
+ {
+ "input": {
+ "CodeSha256": "",
+ "Description": "",
+ "FunctionName": "myFunction"
+ },
+ "output": {
+ "CodeSha256": "YFgDgEKG3ugvF1+pX64gV6tu9qNuIYNUdgJm8nCxsm4=",
+ "CodeSize": 5797206,
+ "Description": "Process image objects from Amazon S3.",
+ "Environment": {
+ "Variables": {
+ "BUCKET": "my-bucket-1xpuxmplzrlbh",
+ "PREFIX": "inbound"
+ }
+ },
+ "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function",
+ "FunctionName": "my-function",
+ "Handler": "index.handler",
+ "KMSKeyArn": "arn:aws:kms:us-west-2:123456789012:key/b0844d6c-xmpl-4463-97a4-d49f50839966",
+ "LastModified": "2020-04-10T19:06:32.563+0000",
+ "LastUpdateStatus": "Successful",
+ "MemorySize": 256,
+ "RevisionId": "b75dcd81-xmpl-48a8-a75a-93ba8b5b9727",
+ "Role": "arn:aws:iam::123456789012:role/lambda-role",
+ "Runtime": "nodejs12.x",
+ "State": "Active",
+ "Timeout": 5,
+ "TracingConfig": {
+ "Mode": "Active"
+ },
+ "Version": "1"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation publishes a version of a Lambda function",
+ "id": "to-publish-a-version-of-a-lambda-function-1481650704986",
+ "title": "To publish a version of a Lambda function"
+ }
+ ],
+ "PutFunctionConcurrency": [
+ {
+ "input": {
+ "FunctionName": "my-function",
+ "ReservedConcurrentExecutions": 100
+ },
+ "output": {
+ "ReservedConcurrentExecutions": 100
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example configures 100 reserved concurrent executions for the my-function function.",
+ "id": "to-configure-a-reserved-concurrency-limit-for-a-function-1586491405956",
+ "title": "To configure a reserved concurrency limit for a function"
+ }
+ ],
+ "PutFunctionEventInvokeConfig": [
+ {
+ "input": {
+ "FunctionName": "my-function",
+ "MaximumEventAgeInSeconds": 3600,
+ "MaximumRetryAttempts": 0
+ },
+ "output": {
+ "DestinationConfig": {
+ "OnFailure": {
+ },
+ "OnSuccess": {
+ }
+ },
+ "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function:$LATEST",
+ "LastModified": "2016-11-21T19:49:20.006+0000",
+ "MaximumEventAgeInSeconds": 3600,
+ "MaximumRetryAttempts": 0
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example sets a maximum event age of one hour and disables retries for the specified function.",
+ "id": "to-configure-error-handling-for-asynchronous-invocation-1586491524021",
+ "title": "To configure error handling for asynchronous invocation"
+ }
+ ],
+ "PutProvisionedConcurrencyConfig": [
+ {
+ "input": {
+ "FunctionName": "my-function",
+ "ProvisionedConcurrentExecutions": 100,
+ "Qualifier": "BLUE"
+ },
+ "output": {
+ "AllocatedProvisionedConcurrentExecutions": 0,
+ "LastModified": "2019-11-21T19:32:12+0000",
+ "RequestedProvisionedConcurrentExecutions": 100,
+ "Status": "IN_PROGRESS"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example allocates 100 provisioned concurrency for the BLUE alias of the specified function.",
+ "id": "to-allocate-provisioned-concurrency-1586491651377",
+ "title": "To allocate provisioned concurrency"
+ }
+ ],
+ "RemoveLayerVersionPermission": [
+ {
+ "input": {
+ "LayerName": "my-layer",
+ "StatementId": "xaccount",
+ "VersionNumber": 1
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes permission for an account to configure a layer version.",
+ "id": "to-delete-layer-version-permissions-1586491829416",
+ "title": "To delete layer-version permissions"
+ }
+ ],
+ "RemovePermission": [
+ {
+ "input": {
+ "FunctionName": "my-function",
+ "Qualifier": "PROD",
+ "StatementId": "xaccount"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example removes a permissions statement named xaccount from the PROD alias of a function named my-function.",
+ "id": "to-remove-a-lambda-functions-permissions-1481661337021",
+ "title": "To remove a Lambda function's permissions"
+ }
+ ],
+ "TagResource": [
+ {
+ "input": {
+ "Resource": "arn:aws:lambda:us-west-2:123456789012:function:my-function",
+ "Tags": {
+ "DEPARTMENT": "Department A"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example adds a tag with the key name DEPARTMENT and a value of 'Department A' to the specified Lambda function.",
+ "id": "to-add-tags-to-an-existing-lambda-function-1586491890446",
+ "title": "To add tags to an existing Lambda function"
+ }
+ ],
+ "UntagResource": [
+ {
+ "input": {
+ "Resource": "arn:aws:lambda:us-west-2:123456789012:function:my-function",
+ "TagKeys": [
+ "DEPARTMENT"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example removes the tag with the key name DEPARTMENT tag from the my-function Lambda function.",
+ "id": "to-remove-tags-from-an-existing-lambda-function-1586491956425",
+ "title": "To remove tags from an existing Lambda function"
+ }
+ ],
+ "UpdateAlias": [
+ {
+ "input": {
+ "FunctionName": "my-function",
+ "FunctionVersion": "2",
+ "Name": "BLUE",
+ "RoutingConfig": {
+ "AdditionalVersionWeights": {
+ "1": 0.7
+ }
+ }
+ },
+ "output": {
+ "AliasArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function:BLUE",
+ "Description": "Production environment BLUE.",
+ "FunctionVersion": "2",
+ "Name": "BLUE",
+ "RevisionId": "594f41fb-xmpl-4c20-95c7-6ca5f2a92c93",
+ "RoutingConfig": {
+ "AdditionalVersionWeights": {
+ "1": 0.7
+ }
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example updates the alias named BLUE to send 30% of traffic to version 2 and 70% to version 1.",
+ "id": "to-update-a-function-alias-1481650817950",
+ "title": "To update a function alias"
+ }
+ ],
+ "UpdateEventSourceMapping": [
+ {
+ "input": {
+ "BatchSize": 123,
+ "Enabled": true,
+ "FunctionName": "myFunction",
+ "UUID": "1234xCy789012"
+ },
+ "output": {
+ "BatchSize": 123,
+ "EventSourceArn": "arn:aws:s3:::examplebucket/*",
+ "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:myFunction",
+ "LastModified": "2016-11-21T19:49:20.006+0000",
+ "LastProcessingResult": "",
+ "State": "",
+ "StateTransitionReason": "",
+ "UUID": "1234xCy789012"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation updates a Lambda function event source mapping",
+ "id": "to-update-a-lambda-function-event-source-mapping-1481650907413",
+ "title": "To update a Lambda function event source mapping"
+ }
+ ],
+ "UpdateFunctionCode": [
+ {
+ "input": {
+ "FunctionName": "my-function",
+ "S3Bucket": "my-bucket-1xpuxmplzrlbh",
+ "S3Key": "function.zip"
+ },
+ "output": {
+ "CodeSha256": "PFn4S+er27qk+UuZSTKEQfNKG/XNn7QJs90mJgq6oH8=",
+ "CodeSize": 308,
+ "Description": "",
+ "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
+ "FunctionName": "my-function",
+ "Handler": "index.handler",
+ "LastModified": "2019-08-14T22:26:11.234+0000",
+ "MemorySize": 128,
+ "RevisionId": "873282ed-xmpl-4dc8-a069-d0c647e470c6",
+ "Role": "arn:aws:iam::123456789012:role/lambda-role",
+ "Runtime": "nodejs12.x",
+ "Timeout": 3,
+ "TracingConfig": {
+ "Mode": "PassThrough"
+ },
+ "Version": "$LATEST"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example replaces the code of the unpublished ($LATEST) version of a function named my-function with the contents of the specified zip file in Amazon S3.",
+ "id": "to-update-a-lambda-functions-code-1481650992672",
+ "title": "To update a Lambda function's code"
+ }
+ ],
+ "UpdateFunctionConfiguration": [
+ {
+ "input": {
+ "FunctionName": "my-function",
+ "MemorySize": 256
+ },
+ "output": {
+ "CodeSha256": "PFn4S+er27qk+UuZSTKEQfNKG/XNn7QJs90mJgq6oH8=",
+ "CodeSize": 308,
+ "Description": "",
+ "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
+ "FunctionName": "my-function",
+ "Handler": "index.handler",
+ "LastModified": "2019-08-14T22:26:11.234+0000",
+ "MemorySize": 256,
+ "RevisionId": "873282ed-xmpl-4dc8-a069-d0c647e470c6",
+ "Role": "arn:aws:iam::123456789012:role/lambda-role",
+ "Runtime": "nodejs12.x",
+ "Timeout": 3,
+ "TracingConfig": {
+ "Mode": "PassThrough"
+ },
+ "Version": "$LATEST"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example modifies the memory size to be 256 MB for the unpublished ($LATEST) version of a function named my-function.",
+ "id": "to-update-a-lambda-functions-configuration-1481651096447",
+ "title": "To update a Lambda function's configuration"
+ }
+ ],
+ "UpdateFunctionEventInvokeConfig": [
+ {
+ "input": {
+ "DestinationConfig": {
+ "OnFailure": {
+ "Destination": "arn:aws:sqs:us-east-2:123456789012:destination"
+ }
+ },
+ "FunctionName": "my-function"
+ },
+ "output": {
+ "DestinationConfig": {
+ "OnFailure": {
+ "Destination": "arn:aws:sqs:us-east-2:123456789012:destination"
+ },
+ "OnSuccess": {
+ }
+ },
+ "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function:$LATEST",
+ "LastModified": 1573687896.493,
+ "MaximumEventAgeInSeconds": 3600,
+ "MaximumRetryAttempts": 0
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example adds an on-failure destination to the existing asynchronous invocation configuration for a function named my-function.",
+ "id": "to-update-an-asynchronous-invocation-configuration-1586492061186",
+ "title": "To update an asynchronous invocation configuration"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lambda/2015-03-31/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/lambda/2015-03-31/paginators-1.json
new file mode 100644
index 00000000..7ae81bfd
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lambda/2015-03-31/paginators-1.json
@@ -0,0 +1,70 @@
+{
+ "pagination": {
+ "ListEventSourceMappings": {
+ "input_token": "Marker",
+ "output_token": "NextMarker",
+ "limit_key": "MaxItems",
+ "result_key": "EventSourceMappings"
+ },
+ "ListFunctions": {
+ "input_token": "Marker",
+ "output_token": "NextMarker",
+ "limit_key": "MaxItems",
+ "result_key": "Functions"
+ },
+ "ListAliases": {
+ "input_token": "Marker",
+ "output_token": "NextMarker",
+ "limit_key": "MaxItems",
+ "result_key": "Aliases"
+ },
+ "ListLayerVersions": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "output_token": "NextMarker",
+ "result_key": "LayerVersions"
+ },
+ "ListLayers": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "output_token": "NextMarker",
+ "result_key": "Layers"
+ },
+ "ListVersionsByFunction": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "output_token": "NextMarker",
+ "result_key": "Versions"
+ },
+ "ListFunctionEventInvokeConfigs": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "output_token": "NextMarker",
+ "result_key": "FunctionEventInvokeConfigs"
+ },
+ "ListProvisionedConcurrencyConfigs": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "output_token": "NextMarker",
+ "result_key": "ProvisionedConcurrencyConfigs"
+ },
+ "ListCodeSigningConfigs": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "output_token": "NextMarker",
+ "result_key": "CodeSigningConfigs"
+ },
+ "ListFunctionsByCodeSigningConfig": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "output_token": "NextMarker",
+ "result_key": "FunctionArns"
+ },
+ "ListFunctionUrlConfigs": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "output_token": "NextMarker",
+ "result_key": "FunctionUrlConfigs"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lambda/2015-03-31/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lambda/2015-03-31/service-2.json.gz
new file mode 100644
index 00000000..a0dc2b6e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lambda/2015-03-31/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lambda/2015-03-31/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/lambda/2015-03-31/waiters-2.json
new file mode 100644
index 00000000..86e24b0c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lambda/2015-03-31/waiters-2.json
@@ -0,0 +1,152 @@
+{
+ "version": 2,
+ "waiters": {
+ "FunctionExists": {
+ "delay": 1,
+ "operation": "GetFunction",
+ "maxAttempts": 20,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "status",
+ "expected": 200
+ },
+ {
+ "state": "retry",
+ "matcher": "error",
+ "expected": "ResourceNotFoundException"
+ }
+ ]
+ },
+ "FunctionActive": {
+ "delay": 5,
+ "maxAttempts": 60,
+ "operation": "GetFunctionConfiguration",
+ "description": "Waits for the function's State to be Active. This waiter uses GetFunctionConfiguration API. This should be used after new function creation.",
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "Active"
+ },
+ {
+ "state": "failure",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "Failed"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "Pending"
+ }
+ ]
+ },
+ "FunctionUpdated": {
+ "delay": 5,
+ "maxAttempts": 60,
+ "operation": "GetFunctionConfiguration",
+ "description": "Waits for the function's LastUpdateStatus to be Successful. This waiter uses GetFunctionConfiguration API. This should be used after function updates.",
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "LastUpdateStatus",
+ "expected": "Successful"
+ },
+ {
+ "state": "failure",
+ "matcher": "path",
+ "argument": "LastUpdateStatus",
+ "expected": "Failed"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "LastUpdateStatus",
+ "expected": "InProgress"
+ }
+ ]
+ },
+ "FunctionActiveV2": {
+ "delay": 1,
+ "maxAttempts": 300,
+ "operation": "GetFunction",
+ "description": "Waits for the function's State to be Active. This waiter uses GetFunction API. This should be used after new function creation.",
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "Configuration.State",
+ "expected": "Active"
+ },
+ {
+ "state": "failure",
+ "matcher": "path",
+ "argument": "Configuration.State",
+ "expected": "Failed"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "Configuration.State",
+ "expected": "Pending"
+ }
+ ]
+ },
+ "FunctionUpdatedV2": {
+ "delay": 1,
+ "maxAttempts": 300,
+ "operation": "GetFunction",
+ "description": "Waits for the function's LastUpdateStatus to be Successful. This waiter uses GetFunction API. This should be used after function updates.",
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "Configuration.LastUpdateStatus",
+ "expected": "Successful"
+ },
+ {
+ "state": "failure",
+ "matcher": "path",
+ "argument": "Configuration.LastUpdateStatus",
+ "expected": "Failed"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "Configuration.LastUpdateStatus",
+ "expected": "InProgress"
+ }
+ ]
+ },
+ "PublishedVersionActive": {
+ "delay": 5,
+ "maxAttempts": 312,
+ "operation": "GetFunctionConfiguration",
+ "description": "Waits for the published version's State to be Active. This waiter uses GetFunctionConfiguration API. This should be used after new version is published.",
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "Active"
+ },
+ {
+ "state": "failure",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "Failed"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "Pending"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/launch-wizard/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/launch-wizard/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..05d05357
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/launch-wizard/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/launch-wizard/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/launch-wizard/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..7f610953
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/launch-wizard/2018-05-10/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListDeploymentEvents": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "deploymentEvents"
+ },
+ "ListDeployments": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "deployments"
+ },
+ "ListWorkloadDeploymentPatterns": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "workloadDeploymentPatterns"
+ },
+ "ListWorkloads": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "workloads"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/launch-wizard/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/launch-wizard/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..fabf3b38
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/launch-wizard/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lex-models/2017-04-19/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lex-models/2017-04-19/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..ccac24d4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lex-models/2017-04-19/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lex-models/2017-04-19/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/lex-models/2017-04-19/examples-1.json
new file mode 100644
index 00000000..0982d973
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lex-models/2017-04-19/examples-1.json
@@ -0,0 +1,758 @@
+{
+ "version": "1.0",
+ "examples": {
+ "GetBot": [
+ {
+ "input": {
+ "name": "DocOrderPizza",
+ "versionOrAlias": "$LATEST"
+ },
+ "output": {
+ "version": "$LATEST",
+ "name": "DocOrderPizzaBot",
+ "abortStatement": {
+ "messages": [
+ {
+ "content": "I don't understand. Can you try again?",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "I'm sorry, I don't understand.",
+ "contentType": "PlainText"
+ }
+ ]
+ },
+ "checksum": "20172ee3-fa06-49b2-bbc5-667c090303e9",
+ "childDirected": true,
+ "clarificationPrompt": {
+ "maxAttempts": 1,
+ "messages": [
+ {
+ "content": "I'm sorry, I didn't hear that. Can you repeate what you just said?",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "Can you say that again?",
+ "contentType": "PlainText"
+ }
+ ]
+ },
+ "createdDate": 1494360160.133,
+ "description": "Orders a pizza from a local pizzeria.",
+ "idleSessionTTLInSeconds": 300,
+ "intents": [
+ {
+ "intentName": "DocOrderPizza",
+ "intentVersion": "$LATEST"
+ }
+ ],
+ "lastUpdatedDate": 1494360160.133,
+ "locale": "en-US",
+ "status": "NOT_BUILT"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example shows how to get configuration information for a bot.",
+ "id": "to-get-information-about-a-bot-1494431724188",
+ "title": "To get information about a bot"
+ }
+ ],
+ "GetBots": [
+ {
+ "input": {
+ "maxResults": 5,
+ "nextToken": ""
+ },
+ "output": {
+ "bots": [
+ {
+ "version": "$LATEST",
+ "name": "DocOrderPizzaBot",
+ "createdDate": 1494360160.133,
+ "description": "Orders a pizza from a local pizzeria.",
+ "lastUpdatedDate": 1494360160.133,
+ "status": "NOT_BUILT"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example shows how to get a list of all of the bots in your account.",
+ "id": "to-get-a-list-of-bots-1494432220036",
+ "title": "To get a list of bots"
+ }
+ ],
+ "GetIntent": [
+ {
+ "input": {
+ "version": "$LATEST",
+ "name": "DocOrderPizza"
+ },
+ "output": {
+ "version": "$LATEST",
+ "name": "DocOrderPizza",
+ "checksum": "ca9bc13d-afc8-4706-bbaf-091f7a5935d6",
+ "conclusionStatement": {
+ "messages": [
+ {
+ "content": "All right, I ordered you a {Crust} crust {Type} pizza with {Sauce} sauce.",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "OK, your {Crust} crust {Type} pizza with {Sauce} sauce is on the way.",
+ "contentType": "PlainText"
+ }
+ ],
+ "responseCard": "foo"
+ },
+ "confirmationPrompt": {
+ "maxAttempts": 1,
+ "messages": [
+ {
+ "content": "Should I order your {Crust} crust {Type} pizza with {Sauce} sauce?",
+ "contentType": "PlainText"
+ }
+ ]
+ },
+ "createdDate": 1494359783.453,
+ "description": "Order a pizza from a local pizzeria.",
+ "fulfillmentActivity": {
+ "type": "ReturnIntent"
+ },
+ "lastUpdatedDate": 1494359783.453,
+ "rejectionStatement": {
+ "messages": [
+ {
+ "content": "Ok, I'll cancel your order.",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "I cancelled your order.",
+ "contentType": "PlainText"
+ }
+ ]
+ },
+ "sampleUtterances": [
+ "Order me a pizza.",
+ "Order me a {Type} pizza.",
+ "I want a {Crust} crust {Type} pizza",
+ "I want a {Crust} crust {Type} pizza with {Sauce} sauce."
+ ],
+ "slots": [
+ {
+ "name": "Type",
+ "description": "The type of pizza to order.",
+ "priority": 1,
+ "sampleUtterances": [
+ "Get me a {Type} pizza.",
+ "A {Type} pizza please.",
+ "I'd like a {Type} pizza."
+ ],
+ "slotConstraint": "Required",
+ "slotType": "DocPizzaType",
+ "slotTypeVersion": "$LATEST",
+ "valueElicitationPrompt": {
+ "maxAttempts": 1,
+ "messages": [
+ {
+ "content": "What type of pizza would you like?",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "Vegie or cheese pizza?",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "I can get you a vegie or a cheese pizza.",
+ "contentType": "PlainText"
+ }
+ ]
+ }
+ },
+ {
+ "name": "Crust",
+ "description": "The type of pizza crust to order.",
+ "priority": 2,
+ "sampleUtterances": [
+ "Make it a {Crust} crust.",
+ "I'd like a {Crust} crust."
+ ],
+ "slotConstraint": "Required",
+ "slotType": "DocPizzaCrustType",
+ "slotTypeVersion": "$LATEST",
+ "valueElicitationPrompt": {
+ "maxAttempts": 1,
+ "messages": [
+ {
+ "content": "What type of crust would you like?",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "Thick or thin crust?",
+ "contentType": "PlainText"
+ }
+ ]
+ }
+ },
+ {
+ "name": "Sauce",
+ "description": "The type of sauce to use on the pizza.",
+ "priority": 3,
+ "sampleUtterances": [
+ "Make it {Sauce} sauce.",
+ "I'd like {Sauce} sauce."
+ ],
+ "slotConstraint": "Required",
+ "slotType": "DocPizzaSauceType",
+ "slotTypeVersion": "$LATEST",
+ "valueElicitationPrompt": {
+ "maxAttempts": 1,
+ "messages": [
+ {
+ "content": "White or red sauce?",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "Garlic or tomato sauce?",
+ "contentType": "PlainText"
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example shows how to get information about an intent.",
+ "id": "to-get-a-information-about-an-intent-1494432574147",
+ "title": "To get a information about an intent"
+ }
+ ],
+ "GetIntents": [
+ {
+ "input": {
+ "maxResults": 10,
+ "nextToken": ""
+ },
+ "output": {
+ "intents": [
+ {
+ "version": "$LATEST",
+ "name": "DocOrderPizza",
+ "createdDate": 1494359783.453,
+ "description": "Order a pizza from a local pizzeria.",
+ "lastUpdatedDate": 1494359783.453
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example shows how to get a list of all of the intents in your account.",
+ "id": "to-get-a-list-of-intents-1494432416363",
+ "title": "To get a list of intents"
+ }
+ ],
+ "GetSlotType": [
+ {
+ "input": {
+ "version": "$LATEST",
+ "name": "DocPizzaCrustType"
+ },
+ "output": {
+ "version": "$LATEST",
+ "name": "DocPizzaCrustType",
+ "checksum": "210b3d5a-90a3-4b22-ac7e-f50c2c71095f",
+ "createdDate": 1494359274.403,
+ "description": "Available crust types",
+ "enumerationValues": [
+ {
+ "value": "thick"
+ },
+ {
+ "value": "thin"
+ }
+ ],
+ "lastUpdatedDate": 1494359274.403
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example shows how to get information about a slot type.",
+ "id": "to-get-information-about-a-slot-type-1494432961004",
+ "title": "To get information about a slot type"
+ }
+ ],
+ "GetSlotTypes": [
+ {
+ "input": {
+ "maxResults": 10,
+ "nextToken": ""
+ },
+ "output": {
+ "slotTypes": [
+ {
+ "version": "$LATEST",
+ "name": "DocPizzaCrustType",
+ "createdDate": 1494359274.403,
+ "description": "Available crust types",
+ "lastUpdatedDate": 1494359274.403
+ },
+ {
+ "version": "$LATEST",
+ "name": "DocPizzaSauceType",
+ "createdDate": 1494356442.23,
+ "description": "Available pizza sauces",
+ "lastUpdatedDate": 1494356442.23
+ },
+ {
+ "version": "$LATEST",
+ "name": "DocPizzaType",
+ "createdDate": 1494359198.656,
+ "description": "Available pizzas",
+ "lastUpdatedDate": 1494359198.656
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example shows how to get a list of all of the slot types in your account.",
+ "id": "to-get-a-list-of-slot-types-1494432757458",
+ "title": "To get a list of slot types"
+ }
+ ],
+ "PutBot": [
+ {
+ "input": {
+ "name": "DocOrderPizzaBot",
+ "abortStatement": {
+ "messages": [
+ {
+ "content": "I don't understand. Can you try again?",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "I'm sorry, I don't understand.",
+ "contentType": "PlainText"
+ }
+ ]
+ },
+ "childDirected": true,
+ "clarificationPrompt": {
+ "maxAttempts": 1,
+ "messages": [
+ {
+ "content": "I'm sorry, I didn't hear that. Can you repeat what you just said?",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "Can you say that again?",
+ "contentType": "PlainText"
+ }
+ ]
+ },
+ "description": "Orders a pizza from a local pizzeria.",
+ "idleSessionTTLInSeconds": 300,
+ "intents": [
+ {
+ "intentName": "DocOrderPizza",
+ "intentVersion": "$LATEST"
+ }
+ ],
+ "locale": "en-US",
+ "processBehavior": "SAVE"
+ },
+ "output": {
+ "version": "$LATEST",
+ "name": "DocOrderPizzaBot",
+ "abortStatement": {
+ "messages": [
+ {
+ "content": "I don't understand. Can you try again?",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "I'm sorry, I don't understand.",
+ "contentType": "PlainText"
+ }
+ ]
+ },
+ "checksum": "20172ee3-fa06-49b2-bbc5-667c090303e9",
+ "childDirected": true,
+ "clarificationPrompt": {
+ "maxAttempts": 1,
+ "messages": [
+ {
+ "content": "I'm sorry, I didn't hear that. Can you repeate what you just said?",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "Can you say that again?",
+ "contentType": "PlainText"
+ }
+ ]
+ },
+ "createdDate": 1494360160.133,
+ "description": "Orders a pizza from a local pizzeria.",
+ "idleSessionTTLInSeconds": 300,
+ "intents": [
+ {
+ "intentName": "DocOrderPizza",
+ "intentVersion": "$LATEST"
+ }
+ ],
+ "lastUpdatedDate": 1494360160.133,
+ "locale": "en-US",
+ "status": "NOT_BUILT"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example shows how to create a bot for ordering pizzas.",
+ "id": "to-create-a-bot-1494360003886",
+ "title": "To create a bot"
+ }
+ ],
+ "PutIntent": [
+ {
+ "input": {
+ "name": "DocOrderPizza",
+ "conclusionStatement": {
+ "messages": [
+ {
+ "content": "All right, I ordered you a {Crust} crust {Type} pizza with {Sauce} sauce.",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "OK, your {Crust} crust {Type} pizza with {Sauce} sauce is on the way.",
+ "contentType": "PlainText"
+ }
+ ],
+ "responseCard": "foo"
+ },
+ "confirmationPrompt": {
+ "maxAttempts": 1,
+ "messages": [
+ {
+ "content": "Should I order your {Crust} crust {Type} pizza with {Sauce} sauce?",
+ "contentType": "PlainText"
+ }
+ ]
+ },
+ "description": "Order a pizza from a local pizzeria.",
+ "fulfillmentActivity": {
+ "type": "ReturnIntent"
+ },
+ "rejectionStatement": {
+ "messages": [
+ {
+ "content": "Ok, I'll cancel your order.",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "I cancelled your order.",
+ "contentType": "PlainText"
+ }
+ ]
+ },
+ "sampleUtterances": [
+ "Order me a pizza.",
+ "Order me a {Type} pizza.",
+ "I want a {Crust} crust {Type} pizza",
+ "I want a {Crust} crust {Type} pizza with {Sauce} sauce."
+ ],
+ "slots": [
+ {
+ "name": "Type",
+ "description": "The type of pizza to order.",
+ "priority": 1,
+ "sampleUtterances": [
+ "Get me a {Type} pizza.",
+ "A {Type} pizza please.",
+ "I'd like a {Type} pizza."
+ ],
+ "slotConstraint": "Required",
+ "slotType": "DocPizzaType",
+ "slotTypeVersion": "$LATEST",
+ "valueElicitationPrompt": {
+ "maxAttempts": 1,
+ "messages": [
+ {
+ "content": "What type of pizza would you like?",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "Vegie or cheese pizza?",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "I can get you a vegie or a cheese pizza.",
+ "contentType": "PlainText"
+ }
+ ]
+ }
+ },
+ {
+ "name": "Crust",
+ "description": "The type of pizza crust to order.",
+ "priority": 2,
+ "sampleUtterances": [
+ "Make it a {Crust} crust.",
+ "I'd like a {Crust} crust."
+ ],
+ "slotConstraint": "Required",
+ "slotType": "DocPizzaCrustType",
+ "slotTypeVersion": "$LATEST",
+ "valueElicitationPrompt": {
+ "maxAttempts": 1,
+ "messages": [
+ {
+ "content": "What type of crust would you like?",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "Thick or thin crust?",
+ "contentType": "PlainText"
+ }
+ ]
+ }
+ },
+ {
+ "name": "Sauce",
+ "description": "The type of sauce to use on the pizza.",
+ "priority": 3,
+ "sampleUtterances": [
+ "Make it {Sauce} sauce.",
+ "I'd like {Sauce} sauce."
+ ],
+ "slotConstraint": "Required",
+ "slotType": "DocPizzaSauceType",
+ "slotTypeVersion": "$LATEST",
+ "valueElicitationPrompt": {
+ "maxAttempts": 1,
+ "messages": [
+ {
+ "content": "White or red sauce?",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "Garlic or tomato sauce?",
+ "contentType": "PlainText"
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "output": {
+ "version": "$LATEST",
+ "name": "DocOrderPizza",
+ "checksum": "ca9bc13d-afc8-4706-bbaf-091f7a5935d6",
+ "conclusionStatement": {
+ "messages": [
+ {
+ "content": "All right, I ordered you a {Crust} crust {Type} pizza with {Sauce} sauce.",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "OK, your {Crust} crust {Type} pizza with {Sauce} sauce is on the way.",
+ "contentType": "PlainText"
+ }
+ ],
+ "responseCard": "foo"
+ },
+ "confirmationPrompt": {
+ "maxAttempts": 1,
+ "messages": [
+ {
+ "content": "Should I order your {Crust} crust {Type} pizza with {Sauce} sauce?",
+ "contentType": "PlainText"
+ }
+ ]
+ },
+ "createdDate": 1494359783.453,
+ "description": "Order a pizza from a local pizzeria.",
+ "fulfillmentActivity": {
+ "type": "ReturnIntent"
+ },
+ "lastUpdatedDate": 1494359783.453,
+ "rejectionStatement": {
+ "messages": [
+ {
+ "content": "Ok, I'll cancel your order.",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "I cancelled your order.",
+ "contentType": "PlainText"
+ }
+ ]
+ },
+ "sampleUtterances": [
+ "Order me a pizza.",
+ "Order me a {Type} pizza.",
+ "I want a {Crust} crust {Type} pizza",
+ "I want a {Crust} crust {Type} pizza with {Sauce} sauce."
+ ],
+ "slots": [
+ {
+ "name": "Sauce",
+ "description": "The type of sauce to use on the pizza.",
+ "priority": 3,
+ "sampleUtterances": [
+ "Make it {Sauce} sauce.",
+ "I'd like {Sauce} sauce."
+ ],
+ "slotConstraint": "Required",
+ "slotType": "DocPizzaSauceType",
+ "slotTypeVersion": "$LATEST",
+ "valueElicitationPrompt": {
+ "maxAttempts": 1,
+ "messages": [
+ {
+ "content": "White or red sauce?",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "Garlic or tomato sauce?",
+ "contentType": "PlainText"
+ }
+ ]
+ }
+ },
+ {
+ "name": "Type",
+ "description": "The type of pizza to order.",
+ "priority": 1,
+ "sampleUtterances": [
+ "Get me a {Type} pizza.",
+ "A {Type} pizza please.",
+ "I'd like a {Type} pizza."
+ ],
+ "slotConstraint": "Required",
+ "slotType": "DocPizzaType",
+ "slotTypeVersion": "$LATEST",
+ "valueElicitationPrompt": {
+ "maxAttempts": 1,
+ "messages": [
+ {
+ "content": "What type of pizza would you like?",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "Vegie or cheese pizza?",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "I can get you a vegie or a cheese pizza.",
+ "contentType": "PlainText"
+ }
+ ]
+ }
+ },
+ {
+ "name": "Crust",
+ "description": "The type of pizza crust to order.",
+ "priority": 2,
+ "sampleUtterances": [
+ "Make it a {Crust} crust.",
+ "I'd like a {Crust} crust."
+ ],
+ "slotConstraint": "Required",
+ "slotType": "DocPizzaCrustType",
+ "slotTypeVersion": "$LATEST",
+ "valueElicitationPrompt": {
+ "maxAttempts": 1,
+ "messages": [
+ {
+ "content": "What type of crust would you like?",
+ "contentType": "PlainText"
+ },
+ {
+ "content": "Thick or thin crust?",
+ "contentType": "PlainText"
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example shows how to create an intent for ordering pizzas.",
+ "id": "to-create-an-intent-1494358144659",
+ "title": "To create an intent"
+ }
+ ],
+ "PutSlotType": [
+ {
+ "input": {
+ "name": "PizzaSauceType",
+ "description": "Available pizza sauces",
+ "enumerationValues": [
+ {
+ "value": "red"
+ },
+ {
+ "value": "white"
+ }
+ ]
+ },
+ "output": {
+ "version": "$LATEST",
+ "name": "DocPizzaSauceType",
+ "checksum": "cfd00ed1-775d-4357-947c-aca7e73b44ba",
+ "createdDate": 1494356442.23,
+ "description": "Available pizza sauces",
+ "enumerationValues": [
+ {
+ "value": "red"
+ },
+ {
+ "value": "white"
+ }
+ ],
+ "lastUpdatedDate": 1494356442.23
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example shows how to create a slot type that describes pizza sauces.",
+ "id": "to-create-a-slot-type-1494357262258",
+ "title": "To Create a Slot Type"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lex-models/2017-04-19/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/lex-models/2017-04-19/paginators-1.json
new file mode 100644
index 00000000..02d23082
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lex-models/2017-04-19/paginators-1.json
@@ -0,0 +1,64 @@
+{
+ "pagination": {
+ "GetSlotTypeVersions": {
+ "result_key": "slotTypes",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "GetSlotTypes": {
+ "result_key": "slotTypes",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "GetIntents": {
+ "result_key": "intents",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "GetBotChannelAssociations": {
+ "result_key": "botChannelAssociations",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "GetBots": {
+ "result_key": "bots",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "GetBuiltinSlotTypes": {
+ "result_key": "slotTypes",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "GetIntentVersions": {
+ "result_key": "intents",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "GetBotAliases": {
+ "result_key": "BotAliases",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "GetBuiltinIntents": {
+ "result_key": "intents",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ },
+ "GetBotVersions": {
+ "result_key": "bots",
+ "output_token": "nextToken",
+ "input_token": "nextToken",
+ "limit_key": "maxResults"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lex-models/2017-04-19/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lex-models/2017-04-19/service-2.json.gz
new file mode 100644
index 00000000..0f5ed37e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lex-models/2017-04-19/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lex-runtime/2016-11-28/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lex-runtime/2016-11-28/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..cfcd6fdb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lex-runtime/2016-11-28/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lex-runtime/2016-11-28/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/lex-runtime/2016-11-28/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lex-runtime/2016-11-28/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lex-runtime/2016-11-28/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/lex-runtime/2016-11-28/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lex-runtime/2016-11-28/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lex-runtime/2016-11-28/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lex-runtime/2016-11-28/service-2.json.gz
new file mode 100644
index 00000000..3c924e5e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lex-runtime/2016-11-28/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lexv2-models/2020-08-07/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lexv2-models/2020-08-07/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..d13aa43e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lexv2-models/2020-08-07/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lexv2-models/2020-08-07/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/lexv2-models/2020-08-07/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lexv2-models/2020-08-07/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lexv2-models/2020-08-07/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/lexv2-models/2020-08-07/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lexv2-models/2020-08-07/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lexv2-models/2020-08-07/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lexv2-models/2020-08-07/service-2.json.gz
new file mode 100644
index 00000000..6fd8efb9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lexv2-models/2020-08-07/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lexv2-models/2020-08-07/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/lexv2-models/2020-08-07/waiters-2.json
new file mode 100644
index 00000000..1ec96048
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lexv2-models/2020-08-07/waiters-2.json
@@ -0,0 +1,255 @@
+{
+ "version":2,
+ "waiters":{
+ "BotAvailable":{
+ "delay":10,
+ "operation":"DescribeBot",
+ "maxAttempts":35,
+ "description":"Wait until a bot is available",
+ "acceptors":[
+ {
+ "expected":"Available",
+ "matcher":"path",
+ "state":"success",
+ "argument":"botStatus"
+ },
+ {
+ "expected":"Deleting",
+ "matcher":"path",
+ "state":"failure",
+ "argument":"botStatus"
+ },
+ {
+ "expected":"Failed",
+ "matcher":"path",
+ "state":"failure",
+ "argument":"botStatus"
+ },
+ {
+ "expected":"Inactive",
+ "matcher":"path",
+ "state":"failure",
+ "argument":"botStatus"
+ }
+ ]
+ },
+ "BotAliasAvailable":{
+ "delay":10,
+ "operation":"DescribeBotAlias",
+ "maxAttempts":35,
+ "description":"Wait until a bot alias is available",
+ "acceptors":[
+ {
+ "expected":"Available",
+ "matcher":"path",
+ "state":"success",
+ "argument":"botAliasStatus"
+ },
+ {
+ "expected":"Failed",
+ "matcher":"path",
+ "state":"failure",
+ "argument":"botAliasStatus"
+ },
+ {
+ "expected":"Deleting",
+ "matcher":"path",
+ "state":"failure",
+ "argument":"botAliasStatus"
+ }
+ ]
+ },
+ "BotExportCompleted":{
+ "delay":10,
+ "operation":"DescribeExport",
+ "maxAttempts":35,
+ "description":"Wait until a bot has been exported",
+ "acceptors":[
+ {
+ "expected":"Completed",
+ "matcher":"path",
+ "state":"success",
+ "argument":"exportStatus"
+ },
+ {
+ "expected":"Deleting",
+ "matcher":"path",
+ "state":"failure",
+ "argument":"exportStatus"
+ },
+ {
+ "expected":"Failed",
+ "matcher":"path",
+ "state":"failure",
+ "argument":"exportStatus"
+ }
+ ]
+ },
+ "BotImportCompleted":{
+ "delay":10,
+ "operation":"DescribeImport",
+ "maxAttempts":35,
+ "description":"Wait until a bot has been imported",
+ "acceptors":[
+ {
+ "expected":"Completed",
+ "matcher":"path",
+ "state":"success",
+ "argument":"importStatus"
+ },
+ {
+ "expected":"Deleting",
+ "matcher":"path",
+ "state":"failure",
+ "argument":"importStatus"
+ },
+ {
+ "expected":"Failed",
+ "matcher":"path",
+ "state":"failure",
+ "argument":"importStatus"
+ }
+ ]
+ },
+ "BotLocaleBuilt":{
+ "delay":10,
+ "operation":"DescribeBotLocale",
+ "maxAttempts":35,
+ "description":"Wait until a bot locale is built",
+ "acceptors":[
+ {
+ "expected":"Built",
+ "matcher":"path",
+ "state":"success",
+ "argument":"botLocaleStatus"
+ },
+ {
+ "expected":"Deleting",
+ "matcher":"path",
+ "state":"failure",
+ "argument":"botLocaleStatus"
+ },
+ {
+ "expected":"Failed",
+ "matcher":"path",
+ "state":"failure",
+ "argument":"botLocaleStatus"
+ },
+ {
+ "expected":"NotBuilt",
+ "matcher":"path",
+ "state":"failure",
+ "argument":"botLocaleStatus"
+ }
+ ]
+ },
+ "BotLocaleExpressTestingAvailable":{
+ "delay":10,
+ "operation":"DescribeBotLocale",
+ "maxAttempts":35,
+ "description":"Wait until a bot locale build is ready for express testing",
+ "acceptors":[
+ {
+ "expected":"Built",
+ "matcher":"path",
+ "state":"success",
+ "argument":"botLocaleStatus"
+ },
+ {
+ "expected":"ReadyExpressTesting",
+ "matcher":"path",
+ "state":"success",
+ "argument":"botLocaleStatus"
+ },
+ {
+ "expected":"Deleting",
+ "matcher":"path",
+ "state":"failure",
+ "argument":"botLocaleStatus"
+ },
+ {
+ "expected":"Failed",
+ "matcher":"path",
+ "state":"failure",
+ "argument":"botLocaleStatus"
+ },
+ {
+ "expected":"NotBuilt",
+ "matcher":"path",
+ "state":"failure",
+ "argument":"botLocaleStatus"
+ }
+ ]
+ },
+ "BotVersionAvailable":{
+ "delay":10,
+ "operation":"DescribeBotVersion",
+ "maxAttempts":35,
+ "description":"Wait until a bot version is available",
+ "acceptors":[
+ {
+ "expected":"Available",
+ "matcher":"path",
+ "state":"success",
+ "argument":"botStatus"
+ },
+ {
+ "expected":"Deleting",
+ "matcher":"path",
+ "state":"failure",
+ "argument":"botStatus"
+ },
+ {
+ "expected":"Failed",
+ "matcher":"path",
+ "state":"failure",
+ "argument":"botStatus"
+ },
+ {
+ "state":"retry",
+ "matcher":"status",
+ "expected":404
+ }
+ ]
+ },
+ "BotLocaleCreated":{
+ "delay":10,
+ "operation":"DescribeBotLocale",
+ "maxAttempts":35,
+ "description":"Wait unit a bot locale is created",
+ "acceptors":[
+ {
+ "expected":"Built",
+ "matcher":"path",
+ "state":"success",
+ "argument":"botLocaleStatus"
+ },
+ {
+ "expected":"ReadyExpressTesting",
+ "matcher":"path",
+ "state":"success",
+ "argument":"botLocaleStatus"
+ },
+ {
+ "expected":"NotBuilt",
+ "matcher":"path",
+ "state":"success",
+ "argument":"botLocaleStatus"
+ },
+ {
+ "expected":"Deleting",
+ "matcher":"path",
+ "state":"failure",
+ "argument":"botLocaleStatus"
+ },
+ {
+ "expected":"Failed",
+ "matcher":"path",
+ "state":"failure",
+ "argument":"botLocaleStatus"
+ }
+ ]
+ }
+ }
+}
+
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lexv2-runtime/2020-08-07/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lexv2-runtime/2020-08-07/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..9055070b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lexv2-runtime/2020-08-07/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lexv2-runtime/2020-08-07/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/lexv2-runtime/2020-08-07/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lexv2-runtime/2020-08-07/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lexv2-runtime/2020-08-07/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/lexv2-runtime/2020-08-07/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lexv2-runtime/2020-08-07/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lexv2-runtime/2020-08-07/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lexv2-runtime/2020-08-07/service-2.json.gz
new file mode 100644
index 00000000..84b185c9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lexv2-runtime/2020-08-07/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/license-manager-linux-subscriptions/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/license-manager-linux-subscriptions/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..f172e4b9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/license-manager-linux-subscriptions/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/license-manager-linux-subscriptions/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/license-manager-linux-subscriptions/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..6d74d22e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/license-manager-linux-subscriptions/2018-05-10/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListLinuxSubscriptionInstances": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Instances"
+ },
+ "ListLinuxSubscriptions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Subscriptions"
+ },
+ "ListRegisteredSubscriptionProviders": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RegisteredSubscriptionProviders"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/license-manager-linux-subscriptions/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/license-manager-linux-subscriptions/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..8ace08f5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/license-manager-linux-subscriptions/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/license-manager-user-subscriptions/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/license-manager-user-subscriptions/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..66ab1d16
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/license-manager-user-subscriptions/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/license-manager-user-subscriptions/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/license-manager-user-subscriptions/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..413006e5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/license-manager-user-subscriptions/2018-05-10/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "ListIdentityProviders": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "IdentityProviderSummaries"
+ },
+ "ListInstances": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "InstanceSummaries"
+ },
+ "ListProductSubscriptions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ProductUserSummaries"
+ },
+ "ListUserAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "InstanceUserSummaries"
+ },
+ "ListLicenseServerEndpoints": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "LicenseServerEndpoints"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/license-manager-user-subscriptions/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/license-manager-user-subscriptions/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..28c4a879
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/license-manager-user-subscriptions/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/license-manager/2018-08-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/license-manager/2018-08-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..f5937378
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/license-manager/2018-08-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/license-manager/2018-08-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/license-manager/2018-08-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/license-manager/2018-08-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/license-manager/2018-08-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/license-manager/2018-08-01/paginators-1.json
new file mode 100644
index 00000000..03a3ca4d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/license-manager/2018-08-01/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "ListAssociationsForLicenseConfiguration": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LicenseConfigurationAssociations"
+ },
+ "ListLicenseConfigurations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LicenseConfigurations"
+ },
+ "ListLicenseSpecificationsForResource": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LicenseSpecifications"
+ },
+ "ListResourceInventory": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ResourceInventoryList"
+ },
+ "ListUsageForLicenseConfiguration": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LicenseConfigurationUsageList"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/license-manager/2018-08-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/license-manager/2018-08-01/service-2.json.gz
new file mode 100644
index 00000000..1c0b63bd
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/license-manager/2018-08-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lightsail/2016-11-28/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lightsail/2016-11-28/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..15e00426
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lightsail/2016-11-28/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lightsail/2016-11-28/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/lightsail/2016-11-28/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lightsail/2016-11-28/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lightsail/2016-11-28/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/lightsail/2016-11-28/paginators-1.json
new file mode 100644
index 00000000..fbea9383
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lightsail/2016-11-28/paginators-1.json
@@ -0,0 +1,104 @@
+{
+ "pagination": {
+ "GetActiveNames": {
+ "input_token": "pageToken",
+ "output_token": "nextPageToken",
+ "result_key": "activeNames"
+ },
+ "GetBlueprints": {
+ "input_token": "pageToken",
+ "output_token": "nextPageToken",
+ "result_key": "blueprints"
+ },
+ "GetBundles": {
+ "input_token": "pageToken",
+ "output_token": "nextPageToken",
+ "result_key": "bundles"
+ },
+ "GetDomains": {
+ "input_token": "pageToken",
+ "output_token": "nextPageToken",
+ "result_key": "domains"
+ },
+ "GetInstanceSnapshots": {
+ "input_token": "pageToken",
+ "output_token": "nextPageToken",
+ "result_key": "instanceSnapshots"
+ },
+ "GetInstances": {
+ "input_token": "pageToken",
+ "output_token": "nextPageToken",
+ "result_key": "instances"
+ },
+ "GetKeyPairs": {
+ "input_token": "pageToken",
+ "output_token": "nextPageToken",
+ "result_key": "keyPairs"
+ },
+ "GetOperations": {
+ "input_token": "pageToken",
+ "output_token": "nextPageToken",
+ "result_key": "operations"
+ },
+ "GetStaticIps": {
+ "input_token": "pageToken",
+ "output_token": "nextPageToken",
+ "result_key": "staticIps"
+ },
+ "GetCloudFormationStackRecords": {
+ "input_token": "pageToken",
+ "output_token": "nextPageToken",
+ "result_key": "cloudFormationStackRecords"
+ },
+ "GetDiskSnapshots": {
+ "input_token": "pageToken",
+ "output_token": "nextPageToken",
+ "result_key": "diskSnapshots"
+ },
+ "GetDisks": {
+ "input_token": "pageToken",
+ "output_token": "nextPageToken",
+ "result_key": "disks"
+ },
+ "GetExportSnapshotRecords": {
+ "input_token": "pageToken",
+ "output_token": "nextPageToken",
+ "result_key": "exportSnapshotRecords"
+ },
+ "GetLoadBalancers": {
+ "input_token": "pageToken",
+ "output_token": "nextPageToken",
+ "result_key": "loadBalancers"
+ },
+ "GetRelationalDatabaseBlueprints": {
+ "input_token": "pageToken",
+ "output_token": "nextPageToken",
+ "result_key": "blueprints"
+ },
+ "GetRelationalDatabaseBundles": {
+ "input_token": "pageToken",
+ "output_token": "nextPageToken",
+ "result_key": "bundles"
+ },
+ "GetRelationalDatabaseEvents": {
+ "input_token": "pageToken",
+ "output_token": "nextPageToken",
+ "result_key": "relationalDatabaseEvents"
+ },
+ "GetRelationalDatabaseParameters": {
+ "input_token": "pageToken",
+ "output_token": "nextPageToken",
+ "result_key": "parameters"
+ },
+ "GetRelationalDatabaseSnapshots": {
+ "input_token": "pageToken",
+ "output_token": "nextPageToken",
+ "result_key": "relationalDatabaseSnapshots"
+ },
+ "GetRelationalDatabases": {
+ "input_token": "pageToken",
+ "output_token": "nextPageToken",
+ "result_key": "relationalDatabases"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lightsail/2016-11-28/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lightsail/2016-11-28/service-2.json.gz
new file mode 100644
index 00000000..e33854f0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lightsail/2016-11-28/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/location/2020-11-19/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/location/2020-11-19/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..f1e021ac
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/location/2020-11-19/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/location/2020-11-19/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/location/2020-11-19/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/location/2020-11-19/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/location/2020-11-19/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/location/2020-11-19/paginators-1.json
new file mode 100644
index 00000000..55e77c93
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/location/2020-11-19/paginators-1.json
@@ -0,0 +1,70 @@
+{
+ "pagination": {
+ "GetDevicePositionHistory": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "DevicePositions",
+ "limit_key": "MaxResults"
+ },
+ "ListGeofenceCollections": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Entries"
+ },
+ "ListGeofences": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Entries",
+ "limit_key": "MaxResults"
+ },
+ "ListMaps": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Entries"
+ },
+ "ListPlaceIndexes": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Entries"
+ },
+ "ListTrackerConsumers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ConsumerArns"
+ },
+ "ListTrackers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Entries"
+ },
+ "ListDevicePositions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Entries"
+ },
+ "ListRouteCalculators": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Entries"
+ },
+ "ListKeys": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Entries"
+ },
+ "ForecastGeofenceEvents": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ForecastedEvents"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/location/2020-11-19/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/location/2020-11-19/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..2aba0bfb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/location/2020-11-19/paginators-1.sdk-extras.json
@@ -0,0 +1,13 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "ForecastGeofenceEvents": {
+ "non_aggregate_keys": [
+ "DistanceUnit",
+ "SpeedUnit"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/location/2020-11-19/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/location/2020-11-19/service-2.json.gz
new file mode 100644
index 00000000..8fbd43de
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/location/2020-11-19/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/logs/2014-03-28/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/logs/2014-03-28/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..99edd81b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/logs/2014-03-28/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/logs/2014-03-28/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/logs/2014-03-28/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/logs/2014-03-28/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/logs/2014-03-28/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/logs/2014-03-28/paginators-1.json
new file mode 100644
index 00000000..3f07c725
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/logs/2014-03-28/paginators-1.json
@@ -0,0 +1,103 @@
+{
+ "pagination": {
+ "DescribeDestinations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "limit",
+ "result_key": "destinations"
+ },
+ "DescribeLogGroups": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "limit",
+ "result_key": "logGroups"
+ },
+ "DescribeLogStreams": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "limit",
+ "result_key": "logStreams"
+ },
+ "DescribeMetricFilters": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "limit",
+ "result_key": "metricFilters"
+ },
+ "DescribeSubscriptionFilters": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "limit",
+ "result_key": "subscriptionFilters"
+ },
+ "FilterLogEvents": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "limit",
+ "result_key": [
+ "events",
+ "searchedLogStreams"
+ ]
+ },
+ "DescribeExportTasks": {
+ "input_token": "nextToken",
+ "limit_key": "limit",
+ "output_token": "nextToken",
+ "result_key": "exportTasks"
+ },
+ "DescribeQueries": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "queries"
+ },
+ "DescribeResourcePolicies": {
+ "input_token": "nextToken",
+ "limit_key": "limit",
+ "output_token": "nextToken",
+ "result_key": "resourcePolicies"
+ },
+ "DescribeDeliveries": {
+ "input_token": "nextToken",
+ "limit_key": "limit",
+ "output_token": "nextToken",
+ "result_key": "deliveries"
+ },
+ "DescribeDeliveryDestinations": {
+ "input_token": "nextToken",
+ "limit_key": "limit",
+ "output_token": "nextToken",
+ "result_key": "deliveryDestinations"
+ },
+ "DescribeDeliverySources": {
+ "input_token": "nextToken",
+ "limit_key": "limit",
+ "output_token": "nextToken",
+ "result_key": "deliverySources"
+ },
+ "ListAnomalies": {
+ "input_token": "nextToken",
+ "limit_key": "limit",
+ "output_token": "nextToken",
+ "result_key": "anomalies"
+ },
+ "ListLogAnomalyDetectors": {
+ "input_token": "nextToken",
+ "limit_key": "limit",
+ "output_token": "nextToken",
+ "result_key": "anomalyDetectors"
+ },
+ "DescribeConfigurationTemplates": {
+ "input_token": "nextToken",
+ "limit_key": "limit",
+ "output_token": "nextToken",
+ "result_key": "configurationTemplates"
+ },
+ "ListLogGroupsForQuery": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "logGroupIdentifiers"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/logs/2014-03-28/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/logs/2014-03-28/service-2.json.gz
new file mode 100644
index 00000000..edc2bad2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/logs/2014-03-28/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lookoutequipment/2020-12-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lookoutequipment/2020-12-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..84533020
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lookoutequipment/2020-12-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lookoutequipment/2020-12-15/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/lookoutequipment/2020-12-15/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lookoutequipment/2020-12-15/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lookoutequipment/2020-12-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/lookoutequipment/2020-12-15/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lookoutequipment/2020-12-15/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lookoutequipment/2020-12-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lookoutequipment/2020-12-15/service-2.json.gz
new file mode 100644
index 00000000..0cedefbb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lookoutequipment/2020-12-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lookoutmetrics/2017-07-25/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lookoutmetrics/2017-07-25/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..89d84616
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lookoutmetrics/2017-07-25/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lookoutmetrics/2017-07-25/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/lookoutmetrics/2017-07-25/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lookoutmetrics/2017-07-25/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lookoutmetrics/2017-07-25/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/lookoutmetrics/2017-07-25/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lookoutmetrics/2017-07-25/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lookoutmetrics/2017-07-25/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lookoutmetrics/2017-07-25/service-2.json.gz
new file mode 100644
index 00000000..ef7a976d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lookoutmetrics/2017-07-25/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lookoutvision/2020-11-20/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lookoutvision/2020-11-20/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..1e228178
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lookoutvision/2020-11-20/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lookoutvision/2020-11-20/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/lookoutvision/2020-11-20/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lookoutvision/2020-11-20/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lookoutvision/2020-11-20/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/lookoutvision/2020-11-20/paginators-1.json
new file mode 100644
index 00000000..14c4ce73
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lookoutvision/2020-11-20/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListDatasetEntries": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "DatasetEntries"
+ },
+ "ListModels": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Models"
+ },
+ "ListProjects": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Projects"
+ },
+ "ListModelPackagingJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ModelPackagingJobs"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/lookoutvision/2020-11-20/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/lookoutvision/2020-11-20/service-2.json.gz
new file mode 100644
index 00000000..666e6825
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/lookoutvision/2020-11-20/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/m2/2021-04-28/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/m2/2021-04-28/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..c2035ce7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/m2/2021-04-28/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/m2/2021-04-28/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/m2/2021-04-28/paginators-1.json
new file mode 100644
index 00000000..e7cd269f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/m2/2021-04-28/paginators-1.json
@@ -0,0 +1,58 @@
+{
+ "pagination": {
+ "ListApplicationVersions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "applicationVersions"
+ },
+ "ListApplications": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "applications"
+ },
+ "ListBatchJobDefinitions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "batchJobDefinitions"
+ },
+ "ListBatchJobExecutions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "batchJobExecutions"
+ },
+ "ListDataSetImportHistory": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "dataSetImportTasks"
+ },
+ "ListDataSets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "dataSets"
+ },
+ "ListDeployments": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "deployments"
+ },
+ "ListEngineVersions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "engineVersions"
+ },
+ "ListEnvironments": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "environments"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/m2/2021-04-28/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/m2/2021-04-28/service-2.json.gz
new file mode 100644
index 00000000..4cf402ef
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/m2/2021-04-28/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/machinelearning/2014-12-12/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/machinelearning/2014-12-12/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..f80367cd
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/machinelearning/2014-12-12/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/machinelearning/2014-12-12/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/machinelearning/2014-12-12/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/machinelearning/2014-12-12/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/machinelearning/2014-12-12/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/machinelearning/2014-12-12/paginators-1.json
new file mode 100644
index 00000000..c13ce65a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/machinelearning/2014-12-12/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "DescribeBatchPredictions": {
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "result_key": "Results"
+ },
+ "DescribeDataSources": {
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "result_key": "Results"
+ },
+ "DescribeEvaluations": {
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "result_key": "Results"
+ },
+ "DescribeMLModels": {
+ "limit_key": "Limit",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "result_key": "Results"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/machinelearning/2014-12-12/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/machinelearning/2014-12-12/service-2.json.gz
new file mode 100644
index 00000000..04d0bcb2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/machinelearning/2014-12-12/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/machinelearning/2014-12-12/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/machinelearning/2014-12-12/waiters-2.json
new file mode 100644
index 00000000..da6b1c95
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/machinelearning/2014-12-12/waiters-2.json
@@ -0,0 +1,81 @@
+{
+ "version": 2,
+ "waiters": {
+ "DataSourceAvailable": {
+ "delay": 30,
+ "operation": "DescribeDataSources",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "COMPLETED",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Results[].Status"
+ },
+ {
+ "expected": "FAILED",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Results[].Status"
+ }
+ ]
+ },
+ "MLModelAvailable": {
+ "delay": 30,
+ "operation": "DescribeMLModels",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "COMPLETED",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Results[].Status"
+ },
+ {
+ "expected": "FAILED",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Results[].Status"
+ }
+ ]
+ },
+ "EvaluationAvailable": {
+ "delay": 30,
+ "operation": "DescribeEvaluations",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "COMPLETED",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Results[].Status"
+ },
+ {
+ "expected": "FAILED",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Results[].Status"
+ }
+ ]
+ },
+ "BatchPredictionAvailable": {
+ "delay": 30,
+ "operation": "DescribeBatchPredictions",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "COMPLETED",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Results[].Status"
+ },
+ {
+ "expected": "FAILED",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Results[].Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/macie2/2020-01-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/macie2/2020-01-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..c5782900
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/macie2/2020-01-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/macie2/2020-01-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/macie2/2020-01-01/paginators-1.json
new file mode 100644
index 00000000..8037ac75
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/macie2/2020-01-01/paginators-1.json
@@ -0,0 +1,106 @@
+{
+ "pagination": {
+ "DescribeBuckets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "buckets"
+ },
+ "GetUsageStatistics": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "records",
+ "non_aggregate_keys": [
+ "timeRange"
+ ]
+ },
+ "ListClassificationJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListCustomDataIdentifiers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListFindings": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "findingIds"
+ },
+ "ListFindingsFilters": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "findingsFilterListItems"
+ },
+ "ListInvitations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "invitations"
+ },
+ "ListMembers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "members"
+ },
+ "ListOrganizationAdminAccounts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "adminAccounts"
+ },
+ "SearchResources": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "matchingResources"
+ },
+ "ListClassificationScopes": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "classificationScopes"
+ },
+ "ListAllowLists": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "allowLists"
+ },
+ "ListManagedDataIdentifiers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "items"
+ },
+ "ListResourceProfileDetections": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "detections"
+ },
+ "ListSensitivityInspectionTemplates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "sensitivityInspectionTemplates"
+ },
+ "ListResourceProfileArtifacts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "artifacts"
+ },
+ "ListAutomatedDiscoveryAccounts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/macie2/2020-01-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/macie2/2020-01-01/service-2.json.gz
new file mode 100644
index 00000000..c4064288
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/macie2/2020-01-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/macie2/2020-01-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/macie2/2020-01-01/waiters-2.json
new file mode 100644
index 00000000..12c4a4a8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/macie2/2020-01-01/waiters-2.json
@@ -0,0 +1,25 @@
+{
+ "version": 2,
+ "waiters": {
+ "FindingRevealed": {
+ "description": "Wait until the sensitive data occurrences are ready.",
+ "delay": 2,
+ "maxAttempts": 60,
+ "operation": "GetSensitiveDataOccurrences",
+ "acceptors": [
+ {
+ "matcher": "path",
+ "argument": "status",
+ "state": "success",
+ "expected": "SUCCESS"
+ },
+ {
+ "matcher": "path",
+ "argument": "status",
+ "state": "success",
+ "expected": "ERROR"
+ }
+ ]
+ }
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mailmanager/2023-10-17/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mailmanager/2023-10-17/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..8aade794
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mailmanager/2023-10-17/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mailmanager/2023-10-17/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/mailmanager/2023-10-17/paginators-1.json
new file mode 100644
index 00000000..a87e9682
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mailmanager/2023-10-17/paginators-1.json
@@ -0,0 +1,76 @@
+{
+ "pagination": {
+ "ListAddonInstances": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "PageSize",
+ "result_key": "AddonInstances"
+ },
+ "ListAddonSubscriptions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "PageSize",
+ "result_key": "AddonSubscriptions"
+ },
+ "ListArchiveExports": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "PageSize",
+ "result_key": "Exports"
+ },
+ "ListArchiveSearches": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "PageSize",
+ "result_key": "Searches"
+ },
+ "ListArchives": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "PageSize",
+ "result_key": "Archives"
+ },
+ "ListIngressPoints": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "PageSize",
+ "result_key": "IngressPoints"
+ },
+ "ListRelays": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "PageSize",
+ "result_key": "Relays"
+ },
+ "ListRuleSets": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "PageSize",
+ "result_key": "RuleSets"
+ },
+ "ListTrafficPolicies": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "PageSize",
+ "result_key": "TrafficPolicies"
+ },
+ "ListAddressListImportJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "PageSize",
+ "result_key": "ImportJobs"
+ },
+ "ListAddressLists": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "PageSize",
+ "result_key": "AddressLists"
+ },
+ "ListMembersOfAddressList": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "PageSize",
+ "result_key": "Addresses"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mailmanager/2023-10-17/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mailmanager/2023-10-17/service-2.json.gz
new file mode 100644
index 00000000..51a2d308
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mailmanager/2023-10-17/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain-query/2023-05-04/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain-query/2023-05-04/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..55929424
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain-query/2023-05-04/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain-query/2023-05-04/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain-query/2023-05-04/paginators-1.json
new file mode 100644
index 00000000..61eb5919
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain-query/2023-05-04/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "ListTokenBalances": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "tokenBalances"
+ },
+ "ListTransactionEvents": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "events"
+ },
+ "ListTransactions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "transactions"
+ },
+ "ListAssetContracts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "contracts"
+ },
+ "ListFilteredTransactionEvents": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "events"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain-query/2023-05-04/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain-query/2023-05-04/service-2.json.gz
new file mode 100644
index 00000000..9e892a47
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain-query/2023-05-04/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain-query/2023-05-04/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain-query/2023-05-04/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain-query/2023-05-04/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain/2018-09-24/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain/2018-09-24/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..0b453b6f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain/2018-09-24/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain/2018-09-24/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain/2018-09-24/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain/2018-09-24/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain/2018-09-24/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain/2018-09-24/paginators-1.json
new file mode 100644
index 00000000..8d30a03f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain/2018-09-24/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListAccessors": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Accessors"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain/2018-09-24/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain/2018-09-24/service-2.json.gz
new file mode 100644
index 00000000..9266411b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/managedblockchain/2018-09-24/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplace-agreement/2020-03-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-agreement/2020-03-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..033a1731
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-agreement/2020-03-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplace-agreement/2020-03-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-agreement/2020-03-01/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-agreement/2020-03-01/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplace-agreement/2020-03-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-agreement/2020-03-01/service-2.json.gz
new file mode 100644
index 00000000..e4b155e8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-agreement/2020-03-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplace-catalog/2018-09-17/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-catalog/2018-09-17/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b03d7dc6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-catalog/2018-09-17/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplace-catalog/2018-09-17/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-catalog/2018-09-17/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-catalog/2018-09-17/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplace-catalog/2018-09-17/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-catalog/2018-09-17/paginators-1.json
new file mode 100644
index 00000000..8bbef968
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-catalog/2018-09-17/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "ListChangeSets": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ChangeSetSummaryList"
+ },
+ "ListEntities": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "EntitySummaryList"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplace-catalog/2018-09-17/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-catalog/2018-09-17/service-2.json.gz
new file mode 100644
index 00000000..161298af
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-catalog/2018-09-17/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplace-deployment/2023-01-25/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-deployment/2023-01-25/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..c29295e8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-deployment/2023-01-25/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplace-deployment/2023-01-25/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-deployment/2023-01-25/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-deployment/2023-01-25/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplace-deployment/2023-01-25/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-deployment/2023-01-25/service-2.json.gz
new file mode 100644
index 00000000..2e843e5c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-deployment/2023-01-25/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplace-entitlement/2017-01-11/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-entitlement/2017-01-11/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..bffa263a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-entitlement/2017-01-11/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplace-entitlement/2017-01-11/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-entitlement/2017-01-11/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-entitlement/2017-01-11/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplace-entitlement/2017-01-11/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-entitlement/2017-01-11/paginators-1.json
new file mode 100644
index 00000000..8dbf525e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-entitlement/2017-01-11/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "GetEntitlements": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Entitlements"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplace-entitlement/2017-01-11/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-entitlement/2017-01-11/service-2.json.gz
new file mode 100644
index 00000000..f0e83433
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-entitlement/2017-01-11/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplace-reporting/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-reporting/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..9a450091
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-reporting/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplace-reporting/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-reporting/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-reporting/2018-05-10/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplace-reporting/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-reporting/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..85467a74
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-reporting/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplace-reporting/2018-05-10/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-reporting/2018-05-10/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplace-reporting/2018-05-10/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplacecommerceanalytics/2015-07-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/marketplacecommerceanalytics/2015-07-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..efea8e3e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplacecommerceanalytics/2015-07-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplacecommerceanalytics/2015-07-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/marketplacecommerceanalytics/2015-07-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplacecommerceanalytics/2015-07-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplacecommerceanalytics/2015-07-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/marketplacecommerceanalytics/2015-07-01/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplacecommerceanalytics/2015-07-01/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/marketplacecommerceanalytics/2015-07-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/marketplacecommerceanalytics/2015-07-01/service-2.json.gz
new file mode 100644
index 00000000..6cfa3abf
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/marketplacecommerceanalytics/2015-07-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediaconnect/2018-11-14/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mediaconnect/2018-11-14/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..ada657ef
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediaconnect/2018-11-14/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediaconnect/2018-11-14/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/mediaconnect/2018-11-14/paginators-1.json
new file mode 100644
index 00000000..65df623e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediaconnect/2018-11-14/paginators-1.json
@@ -0,0 +1,46 @@
+{
+ "pagination": {
+ "ListFlows": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Flows"
+ },
+ "ListEntitlements": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Entitlements"
+ },
+ "ListOfferings": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Offerings"
+ },
+ "ListReservations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Reservations"
+ },
+ "ListBridges": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Bridges"
+ },
+ "ListGatewayInstances": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Instances"
+ },
+ "ListGateways": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Gateways"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediaconnect/2018-11-14/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mediaconnect/2018-11-14/service-2.json.gz
new file mode 100644
index 00000000..8013c09a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediaconnect/2018-11-14/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediaconnect/2018-11-14/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/mediaconnect/2018-11-14/waiters-2.json
new file mode 100644
index 00000000..0f4968ad
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediaconnect/2018-11-14/waiters-2.json
@@ -0,0 +1,104 @@
+{
+ "version" : 2,
+ "waiters" : {
+ "FlowActive" : {
+ "description" : "Wait until a flow is active",
+ "delay" : 3,
+ "maxAttempts" : 40,
+ "operation" : "DescribeFlow",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "Flow.Status",
+ "state" : "success",
+ "expected" : "ACTIVE"
+ }, {
+ "matcher" : "path",
+ "argument" : "Flow.Status",
+ "state" : "retry",
+ "expected" : "STARTING"
+ }, {
+ "matcher" : "path",
+ "argument" : "Flow.Status",
+ "state" : "retry",
+ "expected" : "UPDATING"
+ }, {
+ "matcher" : "error",
+ "state" : "retry",
+ "expected" : "InternalServerErrorException"
+ }, {
+ "matcher" : "error",
+ "state" : "retry",
+ "expected" : "ServiceUnavailableException"
+ }, {
+ "matcher" : "path",
+ "argument" : "Flow.Status",
+ "state" : "failure",
+ "expected" : "STANDBY"
+ }, {
+ "matcher" : "path",
+ "argument" : "Flow.Status",
+ "state" : "failure",
+ "expected" : "ERROR"
+ } ]
+ },
+ "FlowDeleted" : {
+ "description" : "Wait until a flow is deleted",
+ "delay" : 3,
+ "maxAttempts" : 40,
+ "operation" : "DescribeFlow",
+ "acceptors" : [ {
+ "matcher" : "error",
+ "state" : "success",
+ "expected" : "NotFoundException"
+ }, {
+ "matcher" : "path",
+ "argument" : "Flow.Status",
+ "state" : "retry",
+ "expected" : "DELETING"
+ }, {
+ "matcher" : "error",
+ "state" : "retry",
+ "expected" : "InternalServerErrorException"
+ }, {
+ "matcher" : "error",
+ "state" : "retry",
+ "expected" : "ServiceUnavailableException"
+ }, {
+ "matcher" : "path",
+ "argument" : "Flow.Status",
+ "state" : "failure",
+ "expected" : "ERROR"
+ } ]
+ },
+ "FlowStandby" : {
+ "description" : "Wait until a flow is in standby mode",
+ "delay" : 3,
+ "maxAttempts" : 40,
+ "operation" : "DescribeFlow",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "Flow.Status",
+ "state" : "success",
+ "expected" : "STANDBY"
+ }, {
+ "matcher" : "path",
+ "argument" : "Flow.Status",
+ "state" : "retry",
+ "expected" : "STOPPING"
+ }, {
+ "matcher" : "error",
+ "state" : "retry",
+ "expected" : "InternalServerErrorException"
+ }, {
+ "matcher" : "error",
+ "state" : "retry",
+ "expected" : "ServiceUnavailableException"
+ }, {
+ "matcher" : "path",
+ "argument" : "Flow.Status",
+ "state" : "failure",
+ "expected" : "ERROR"
+ } ]
+ }
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediaconvert/2017-08-29/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mediaconvert/2017-08-29/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..e84e591c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediaconvert/2017-08-29/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediaconvert/2017-08-29/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/mediaconvert/2017-08-29/paginators-1.json
new file mode 100644
index 00000000..1f93efd8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediaconvert/2017-08-29/paginators-1.json
@@ -0,0 +1,46 @@
+{
+ "pagination": {
+ "DescribeEndpoints": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Endpoints"
+ },
+ "ListJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Jobs"
+ },
+ "ListPresets": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Presets"
+ },
+ "ListJobTemplates": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "JobTemplates"
+ },
+ "ListQueues": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Queues"
+ },
+ "SearchJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Jobs"
+ },
+ "ListVersions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Versions"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediaconvert/2017-08-29/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/mediaconvert/2017-08-29/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..c1219900
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediaconvert/2017-08-29/paginators-1.sdk-extras.json
@@ -0,0 +1,13 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "ListQueues": {
+ "non_aggregate_keys": [
+ "TotalConcurrentJobs",
+ "UnallocatedConcurrentJobs"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediaconvert/2017-08-29/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mediaconvert/2017-08-29/service-2.json.gz
new file mode 100644
index 00000000..33203edf
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediaconvert/2017-08-29/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/medialive/2017-10-14/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/medialive/2017-10-14/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..8740469e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/medialive/2017-10-14/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/medialive/2017-10-14/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/medialive/2017-10-14/paginators-1.json
new file mode 100644
index 00000000..2b141883
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/medialive/2017-10-14/paginators-1.json
@@ -0,0 +1,118 @@
+{
+ "pagination": {
+ "ListInputs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Inputs"
+ },
+ "ListChannels": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Channels"
+ },
+ "ListInputSecurityGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "InputSecurityGroups"
+ },
+ "ListOfferings": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Offerings"
+ },
+ "ListReservations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Reservations"
+ },
+ "DescribeSchedule": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ScheduleActions"
+ },
+ "ListMultiplexPrograms": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "MultiplexPrograms"
+ },
+ "ListMultiplexes": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Multiplexes"
+ },
+ "ListInputDevices": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "InputDevices"
+ },
+ "ListInputDeviceTransfers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "InputDeviceTransfers"
+ },
+ "ListSignalMaps": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SignalMaps"
+ },
+ "ListCloudWatchAlarmTemplates": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "CloudWatchAlarmTemplates"
+ },
+ "ListCloudWatchAlarmTemplateGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "CloudWatchAlarmTemplateGroups"
+ },
+ "ListEventBridgeRuleTemplates": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "EventBridgeRuleTemplates"
+ },
+ "ListEventBridgeRuleTemplateGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "EventBridgeRuleTemplateGroups"
+ },
+ "ListNodes": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Nodes"
+ },
+ "ListClusters": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Clusters"
+ },
+ "ListChannelPlacementGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ChannelPlacementGroups"
+ },
+ "ListNetworks": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Networks"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/medialive/2017-10-14/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/medialive/2017-10-14/service-2.json.gz
new file mode 100644
index 00000000..eb693b6c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/medialive/2017-10-14/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/medialive/2017-10-14/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/medialive/2017-10-14/waiters-2.json
new file mode 100644
index 00000000..d95e09ab
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/medialive/2017-10-14/waiters-2.json
@@ -0,0 +1,624 @@
+{
+ "version": 2,
+ "waiters": {
+ "ChannelCreated": {
+ "description": "Wait until a channel has been created",
+ "operation": "DescribeChannel",
+ "delay": 3,
+ "maxAttempts": 5,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "IDLE"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "CREATING"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ },
+ {
+ "state": "failure",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "CREATE_FAILED"
+ }
+ ]
+ },
+ "ChannelRunning": {
+ "description": "Wait until a channel is running",
+ "operation": "DescribeChannel",
+ "delay": 5,
+ "maxAttempts": 120,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "RUNNING"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "STARTING"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ }
+ ]
+ },
+ "ChannelStopped": {
+ "description": "Wait until a channel has is stopped",
+ "operation": "DescribeChannel",
+ "delay": 5,
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "IDLE"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "STOPPING"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ }
+ ]
+ },
+ "ChannelDeleted": {
+ "description": "Wait until a channel has been deleted",
+ "operation": "DescribeChannel",
+ "delay": 5,
+ "maxAttempts": 84,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "DELETED"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "DELETING"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ }
+ ]
+ },
+ "InputAttached": {
+ "description": "Wait until an input has been attached",
+ "operation": "DescribeInput",
+ "delay": 5,
+ "maxAttempts": 20,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "ATTACHED"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "DETACHED"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ }
+ ]
+ },
+ "InputDetached": {
+ "description": "Wait until an input has been detached",
+ "operation": "DescribeInput",
+ "delay": 5,
+ "maxAttempts": 84,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "DETACHED"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "CREATING"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "ATTACHED"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ }
+ ]
+ },
+ "InputDeleted": {
+ "description": "Wait until an input has been deleted",
+ "operation": "DescribeInput",
+ "delay": 5,
+ "maxAttempts": 20,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "DELETED"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "DELETING"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ }
+ ]
+ },
+ "MultiplexCreated": {
+ "description": "Wait until a multiplex has been created",
+ "operation": "DescribeMultiplex",
+ "delay": 3,
+ "maxAttempts": 5,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "IDLE"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "CREATING"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ },
+ {
+ "state": "failure",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "CREATE_FAILED"
+ }
+ ]
+ },
+ "MultiplexRunning": {
+ "description": "Wait until a multiplex is running",
+ "operation": "DescribeMultiplex",
+ "delay": 5,
+ "maxAttempts": 120,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "RUNNING"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "STARTING"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ }
+ ]
+ },
+ "MultiplexStopped": {
+ "description": "Wait until a multiplex has is stopped",
+ "operation": "DescribeMultiplex",
+ "delay": 5,
+ "maxAttempts": 28,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "IDLE"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "STOPPING"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ }
+ ]
+ },
+ "MultiplexDeleted": {
+ "description": "Wait until a multiplex has been deleted",
+ "operation": "DescribeMultiplex",
+ "delay": 5,
+ "maxAttempts": 20,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "DELETED"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "DELETING"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ }
+ ]
+ },
+ "SignalMapCreated": {
+ "description": "Wait until a signal map has been created",
+ "delay": 5,
+ "maxAttempts": 60,
+ "operation": "GetSignalMap",
+ "acceptors": [
+ {
+ "matcher": "path",
+ "argument": "Status",
+ "state": "success",
+ "expected": "CREATE_COMPLETE"
+ },
+ {
+ "matcher": "path",
+ "argument": "Status",
+ "state": "retry",
+ "expected": "CREATE_IN_PROGRESS"
+ },
+ {
+ "matcher": "path",
+ "argument": "Status",
+ "state": "failure",
+ "expected": "CREATE_FAILED"
+ }
+ ]
+ },
+ "SignalMapMonitorDeleted": {
+ "description": "Wait until a signal map's monitor has been deleted",
+ "delay": 5,
+ "maxAttempts": 120,
+ "operation": "GetSignalMap",
+ "acceptors": [
+ {
+ "matcher": "path",
+ "argument": "MonitorDeployment.Status",
+ "state": "success",
+ "expected": "DELETE_COMPLETE"
+ },
+ {
+ "matcher": "path",
+ "argument": "MonitorDeployment.Status",
+ "state": "retry",
+ "expected": "DELETE_IN_PROGRESS"
+ },
+ {
+ "matcher": "path",
+ "argument": "MonitorDeployment.Status",
+ "state": "failure",
+ "expected": "DELETE_FAILED"
+ }
+ ]
+ },
+ "SignalMapMonitorDeployed": {
+ "description": "Wait until a signal map's monitor has been deployed",
+ "delay": 5,
+ "maxAttempts": 120,
+ "operation": "GetSignalMap",
+ "acceptors": [
+ {
+ "matcher": "path",
+ "argument": "MonitorDeployment.Status",
+ "state": "success",
+ "expected": "DRY_RUN_DEPLOYMENT_COMPLETE"
+ },
+ {
+ "matcher": "path",
+ "argument": "MonitorDeployment.Status",
+ "state": "success",
+ "expected": "DEPLOYMENT_COMPLETE"
+ },
+ {
+ "matcher": "path",
+ "argument": "MonitorDeployment.Status",
+ "state": "retry",
+ "expected": "DRY_RUN_DEPLOYMENT_IN_PROGRESS"
+ },
+ {
+ "matcher": "path",
+ "argument": "MonitorDeployment.Status",
+ "state": "retry",
+ "expected": "DEPLOYMENT_IN_PROGRESS"
+ },
+ {
+ "matcher": "path",
+ "argument": "MonitorDeployment.Status",
+ "state": "failure",
+ "expected": "DRY_RUN_DEPLOYMENT_FAILED"
+ },
+ {
+ "matcher": "path",
+ "argument": "MonitorDeployment.Status",
+ "state": "failure",
+ "expected": "DEPLOYMENT_FAILED"
+ }
+ ]
+ },
+ "SignalMapUpdated": {
+ "description": "Wait until a signal map has been updated",
+ "delay": 5,
+ "maxAttempts": 60,
+ "operation": "GetSignalMap",
+ "acceptors": [
+ {
+ "matcher": "path",
+ "argument": "Status",
+ "state": "success",
+ "expected": "UPDATE_COMPLETE"
+ },
+ {
+ "matcher": "path",
+ "argument": "Status",
+ "state": "retry",
+ "expected": "UPDATE_IN_PROGRESS"
+ },
+ {
+ "matcher": "path",
+ "argument": "Status",
+ "state": "failure",
+ "expected": "UPDATE_FAILED"
+ },
+ {
+ "matcher": "path",
+ "argument": "Status",
+ "state": "failure",
+ "expected": "UPDATE_REVERTED"
+ }
+ ]
+ },
+ "ClusterCreated": {
+ "description": "Wait until a cluster has been created",
+ "operation": "DescribeCluster",
+ "delay": 3,
+ "maxAttempts": 5,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "ACTIVE"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "CREATING"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ },
+ {
+ "state": "failure",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "CREATE_FAILED"
+ }
+ ]
+ },
+ "ClusterDeleted": {
+ "description": "Wait until a cluster has been deleted",
+ "operation": "DescribeCluster",
+ "delay": 5,
+ "maxAttempts": 20,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "DELETED"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "DELETING"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ }
+ ]
+ },
+ "NodeRegistered": {
+ "description": "Wait until a node has been registered",
+ "operation": "DescribeNode",
+ "delay": 3,
+ "maxAttempts": 5,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "ACTIVE"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "REGISTERING"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 404
+ },
+ {
+ "state": "failure",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "REGISTRATION_FAILED"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ }
+ ]
+ },
+ "NodeDeregistered": {
+ "description": "Wait until a node has been deregistered",
+ "operation": "DescribeNode",
+ "delay": 5,
+ "maxAttempts": 20,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "DEREGISTERED"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "DEREGISTERING"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "DRAINING"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ }
+ ]
+ },
+ "ChannelPlacementGroupAssigned": {
+ "description": "Wait until the channel placement group has been assigned",
+ "operation": "DescribeChannelPlacementGroup",
+ "delay": 3,
+ "maxAttempts": 5,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "ASSIGNED"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "ASSIGNING"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ }
+ ]
+ },
+ "ChannelPlacementGroupUnassigned": {
+ "description": "Wait until the channel placement group has been unassigned",
+ "operation": "DescribeChannelPlacementGroup",
+ "delay": 5,
+ "maxAttempts": 20,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "UNASSIGNED"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "UNASSIGNING"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ }
+ ]
+ },
+ "ChannelPlacementGroupDeleted": {
+ "description": "Wait until the channel placement group has been deleted",
+ "operation": "DescribeChannelPlacementGroup",
+ "delay": 5,
+ "maxAttempts": 20,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "DELETED"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "State",
+ "expected": "DELETING"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediapackage-vod/2018-11-07/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mediapackage-vod/2018-11-07/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..7ebb0231
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediapackage-vod/2018-11-07/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediapackage-vod/2018-11-07/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/mediapackage-vod/2018-11-07/paginators-1.json
new file mode 100644
index 00000000..df498b9f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediapackage-vod/2018-11-07/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListAssets": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Assets"
+ },
+ "ListPackagingConfigurations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "PackagingConfigurations"
+ },
+ "ListPackagingGroups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "PackagingGroups"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediapackage-vod/2018-11-07/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mediapackage-vod/2018-11-07/service-2.json.gz
new file mode 100644
index 00000000..c020634e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediapackage-vod/2018-11-07/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediapackage/2017-10-12/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mediapackage/2017-10-12/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..240d5e70
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediapackage/2017-10-12/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediapackage/2017-10-12/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/mediapackage/2017-10-12/paginators-1.json
new file mode 100644
index 00000000..24e44104
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediapackage/2017-10-12/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListChannels": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Channels"
+ },
+ "ListOriginEndpoints": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "OriginEndpoints"
+ },
+ "ListHarvestJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "HarvestJobs"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediapackage/2017-10-12/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mediapackage/2017-10-12/service-2.json.gz
new file mode 100644
index 00000000..7edbc9ab
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediapackage/2017-10-12/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediapackagev2/2022-12-25/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mediapackagev2/2022-12-25/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..986e05ac
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediapackagev2/2022-12-25/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediapackagev2/2022-12-25/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/mediapackagev2/2022-12-25/paginators-1.json
new file mode 100644
index 00000000..531aa7c2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediapackagev2/2022-12-25/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListChannelGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListChannels": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListOriginEndpoints": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListHarvestJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediapackagev2/2022-12-25/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mediapackagev2/2022-12-25/service-2.json.gz
new file mode 100644
index 00000000..8a22e331
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediapackagev2/2022-12-25/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediapackagev2/2022-12-25/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/mediapackagev2/2022-12-25/waiters-2.json
new file mode 100644
index 00000000..138579fc
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediapackagev2/2022-12-25/waiters-2.json
@@ -0,0 +1,36 @@
+{
+ "version" : 2,
+ "waiters" : {
+ "HarvestJobFinished" : {
+ "delay" : 2,
+ "maxAttempts" : 60,
+ "operation" : "GetHarvestJob",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "Status",
+ "state" : "success",
+ "expected" : "COMPLETED"
+ }, {
+ "matcher" : "path",
+ "argument" : "Status",
+ "state" : "success",
+ "expected" : "CANCELLED"
+ }, {
+ "matcher" : "path",
+ "argument" : "Status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ }, {
+ "matcher" : "path",
+ "argument" : "Status",
+ "state" : "retry",
+ "expected" : "QUEUED"
+ }, {
+ "matcher" : "path",
+ "argument" : "Status",
+ "state" : "retry",
+ "expected" : "IN_PROGRESS"
+ } ]
+ }
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediastore-data/2017-09-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mediastore-data/2017-09-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b47545ca
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediastore-data/2017-09-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediastore-data/2017-09-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/mediastore-data/2017-09-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediastore-data/2017-09-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediastore-data/2017-09-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/mediastore-data/2017-09-01/paginators-1.json
new file mode 100644
index 00000000..7b1c0f7e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediastore-data/2017-09-01/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListItems": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediastore-data/2017-09-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mediastore-data/2017-09-01/service-2.json.gz
new file mode 100644
index 00000000..793067e3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediastore-data/2017-09-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediastore/2017-09-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mediastore/2017-09-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..720e4fb1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediastore/2017-09-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediastore/2017-09-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/mediastore/2017-09-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediastore/2017-09-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediastore/2017-09-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/mediastore/2017-09-01/paginators-1.json
new file mode 100644
index 00000000..ed3ece02
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediastore/2017-09-01/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListContainers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Containers"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediastore/2017-09-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mediastore/2017-09-01/service-2.json.gz
new file mode 100644
index 00000000..ad1bfcf6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediastore/2017-09-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediatailor/2018-04-23/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mediatailor/2018-04-23/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..9ddf7208
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediatailor/2018-04-23/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediatailor/2018-04-23/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/mediatailor/2018-04-23/paginators-1.json
new file mode 100644
index 00000000..fe39ff81
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediatailor/2018-04-23/paginators-1.json
@@ -0,0 +1,52 @@
+{
+ "pagination": {
+ "ListPlaybackConfigurations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Items"
+ },
+ "GetChannelSchedule": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Items"
+ },
+ "ListChannels": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Items"
+ },
+ "ListSourceLocations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Items"
+ },
+ "ListVodSources": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Items"
+ },
+ "ListAlerts": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Items"
+ },
+ "ListPrefetchSchedules": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Items"
+ },
+ "ListLiveSources": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mediatailor/2018-04-23/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mediatailor/2018-04-23/service-2.json.gz
new file mode 100644
index 00000000..cb60eff6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mediatailor/2018-04-23/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/medical-imaging/2023-07-19/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/medical-imaging/2023-07-19/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..f6ebffb2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/medical-imaging/2023-07-19/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/medical-imaging/2023-07-19/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/medical-imaging/2023-07-19/paginators-1.json
new file mode 100644
index 00000000..807d0527
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/medical-imaging/2023-07-19/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListDICOMImportJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "jobSummaries"
+ },
+ "ListDatastores": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "datastoreSummaries"
+ },
+ "ListImageSetVersions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "imageSetPropertiesList"
+ },
+ "SearchImageSets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "imageSetsMetadataSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/medical-imaging/2023-07-19/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/medical-imaging/2023-07-19/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..383da17d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/medical-imaging/2023-07-19/paginators-1.sdk-extras.json
@@ -0,0 +1,12 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "SearchImageSets": {
+ "non_aggregate_keys": [
+ "sort"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/medical-imaging/2023-07-19/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/medical-imaging/2023-07-19/service-2.json.gz
new file mode 100644
index 00000000..a85092aa
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/medical-imaging/2023-07-19/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/medical-imaging/2023-07-19/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/medical-imaging/2023-07-19/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/medical-imaging/2023-07-19/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/memorydb/2021-01-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/memorydb/2021-01-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..0c9a3dda
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/memorydb/2021-01-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/memorydb/2021-01-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/memorydb/2021-01-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/memorydb/2021-01-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/memorydb/2021-01-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/memorydb/2021-01-01/paginators-1.json
new file mode 100644
index 00000000..abafc002
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/memorydb/2021-01-01/paginators-1.json
@@ -0,0 +1,82 @@
+{
+ "pagination": {
+ "DescribeACLs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ACLs"
+ },
+ "DescribeClusters": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Clusters"
+ },
+ "DescribeEngineVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "EngineVersions"
+ },
+ "DescribeEvents": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Events"
+ },
+ "DescribeParameterGroups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ParameterGroups"
+ },
+ "DescribeParameters": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Parameters"
+ },
+ "DescribeReservedNodes": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ReservedNodes"
+ },
+ "DescribeReservedNodesOfferings": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ReservedNodesOfferings"
+ },
+ "DescribeServiceUpdates": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ServiceUpdates"
+ },
+ "DescribeSnapshots": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Snapshots"
+ },
+ "DescribeSubnetGroups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "SubnetGroups"
+ },
+ "DescribeUsers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Users"
+ },
+ "DescribeMultiRegionClusters": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "MultiRegionClusters"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/memorydb/2021-01-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/memorydb/2021-01-01/service-2.json.gz
new file mode 100644
index 00000000..40b49190
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/memorydb/2021-01-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/meteringmarketplace/2016-01-14/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/meteringmarketplace/2016-01-14/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..4a0f09d7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/meteringmarketplace/2016-01-14/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/meteringmarketplace/2016-01-14/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/meteringmarketplace/2016-01-14/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/meteringmarketplace/2016-01-14/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/meteringmarketplace/2016-01-14/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/meteringmarketplace/2016-01-14/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/meteringmarketplace/2016-01-14/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/meteringmarketplace/2016-01-14/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/meteringmarketplace/2016-01-14/service-2.json.gz
new file mode 100644
index 00000000..3d185ed4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/meteringmarketplace/2016-01-14/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mgh/2017-05-31/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mgh/2017-05-31/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..64f7e7a6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mgh/2017-05-31/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mgh/2017-05-31/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/mgh/2017-05-31/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mgh/2017-05-31/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mgh/2017-05-31/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/mgh/2017-05-31/paginators-1.json
new file mode 100644
index 00000000..db029bfd
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mgh/2017-05-31/paginators-1.json
@@ -0,0 +1,46 @@
+{
+ "pagination": {
+ "ListCreatedArtifacts": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "CreatedArtifactList"
+ },
+ "ListDiscoveredResources": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "DiscoveredResourceList"
+ },
+ "ListMigrationTasks": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "MigrationTaskSummaryList"
+ },
+ "ListProgressUpdateStreams": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ProgressUpdateStreamSummaryList"
+ },
+ "ListApplicationStates": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ApplicationStateList"
+ },
+ "ListMigrationTaskUpdates": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "MigrationTaskUpdateList"
+ },
+ "ListSourceResources": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "SourceResourceList"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mgh/2017-05-31/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mgh/2017-05-31/service-2.json.gz
new file mode 100644
index 00000000..6cc3b6dd
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mgh/2017-05-31/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mgn/2020-02-26/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mgn/2020-02-26/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..1dc18292
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mgn/2020-02-26/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mgn/2020-02-26/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/mgn/2020-02-26/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mgn/2020-02-26/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mgn/2020-02-26/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/mgn/2020-02-26/paginators-1.json
new file mode 100644
index 00000000..6cdc06a7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mgn/2020-02-26/paginators-1.json
@@ -0,0 +1,100 @@
+{
+ "pagination": {
+ "DescribeJobLogItems": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "DescribeJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "DescribeReplicationConfigurationTemplates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "DescribeSourceServers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "DescribeVcenterClients": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "DescribeLaunchConfigurationTemplates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListApplications": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListSourceServerActions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListTemplateActions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListWaves": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListExportErrors": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListExports": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListImportErrors": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListImports": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListManagedAccounts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListConnectors": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mgn/2020-02-26/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mgn/2020-02-26/service-2.json.gz
new file mode 100644
index 00000000..850ab368
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mgn/2020-02-26/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/migration-hub-refactor-spaces/2021-10-26/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/migration-hub-refactor-spaces/2021-10-26/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..f621fbb3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/migration-hub-refactor-spaces/2021-10-26/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/migration-hub-refactor-spaces/2021-10-26/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/migration-hub-refactor-spaces/2021-10-26/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/migration-hub-refactor-spaces/2021-10-26/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/migration-hub-refactor-spaces/2021-10-26/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/migration-hub-refactor-spaces/2021-10-26/paginators-1.json
new file mode 100644
index 00000000..79ae0ffa
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/migration-hub-refactor-spaces/2021-10-26/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "ListApplications": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ApplicationSummaryList"
+ },
+ "ListEnvironmentVpcs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "EnvironmentVpcList"
+ },
+ "ListEnvironments": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "EnvironmentSummaryList"
+ },
+ "ListRoutes": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RouteSummaryList"
+ },
+ "ListServices": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ServiceSummaryList"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/migration-hub-refactor-spaces/2021-10-26/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/migration-hub-refactor-spaces/2021-10-26/service-2.json.gz
new file mode 100644
index 00000000..d56d34ae
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/migration-hub-refactor-spaces/2021-10-26/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/migrationhub-config/2019-06-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/migrationhub-config/2019-06-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..370bce79
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/migrationhub-config/2019-06-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/migrationhub-config/2019-06-30/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/migrationhub-config/2019-06-30/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/migrationhub-config/2019-06-30/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/migrationhub-config/2019-06-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/migrationhub-config/2019-06-30/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/migrationhub-config/2019-06-30/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/migrationhub-config/2019-06-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/migrationhub-config/2019-06-30/service-2.json.gz
new file mode 100644
index 00000000..c243315c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/migrationhub-config/2019-06-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/migrationhuborchestrator/2021-08-28/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/migrationhuborchestrator/2021-08-28/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..07db5831
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/migrationhuborchestrator/2021-08-28/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/migrationhuborchestrator/2021-08-28/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/migrationhuborchestrator/2021-08-28/paginators-1.json
new file mode 100644
index 00000000..4c452221
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/migrationhuborchestrator/2021-08-28/paginators-1.json
@@ -0,0 +1,46 @@
+{
+ "pagination": {
+ "ListPlugins": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "plugins"
+ },
+ "ListTemplateStepGroups": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "templateStepGroupSummary"
+ },
+ "ListTemplateSteps": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "templateStepSummaryList"
+ },
+ "ListTemplates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "templateSummary"
+ },
+ "ListWorkflowStepGroups": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "workflowStepGroupsSummary"
+ },
+ "ListWorkflowSteps": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "workflowStepsSummary"
+ },
+ "ListWorkflows": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "migrationWorkflowSummary"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/migrationhuborchestrator/2021-08-28/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/migrationhuborchestrator/2021-08-28/service-2.json.gz
new file mode 100644
index 00000000..fd76f494
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/migrationhuborchestrator/2021-08-28/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/migrationhuborchestrator/2021-08-28/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/migrationhuborchestrator/2021-08-28/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/migrationhuborchestrator/2021-08-28/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/migrationhubstrategy/2020-02-19/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/migrationhubstrategy/2020-02-19/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..8ae0e669
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/migrationhubstrategy/2020-02-19/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/migrationhubstrategy/2020-02-19/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/migrationhubstrategy/2020-02-19/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/migrationhubstrategy/2020-02-19/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/migrationhubstrategy/2020-02-19/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/migrationhubstrategy/2020-02-19/paginators-1.json
new file mode 100644
index 00000000..889a45ef
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/migrationhubstrategy/2020-02-19/paginators-1.json
@@ -0,0 +1,40 @@
+{
+ "pagination": {
+ "GetServerDetails": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "associatedApplications"
+ },
+ "ListApplicationComponents": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "applicationComponentInfos"
+ },
+ "ListCollectors": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "Collectors"
+ },
+ "ListImportFileTask": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "taskInfos"
+ },
+ "ListServers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "serverInfos"
+ },
+ "ListAnalyzableServers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "analyzableServers"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/migrationhubstrategy/2020-02-19/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/migrationhubstrategy/2020-02-19/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..2524463a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/migrationhubstrategy/2020-02-19/paginators-1.sdk-extras.json
@@ -0,0 +1,12 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "GetServerDetails": {
+ "non_aggregate_keys": [
+ "serverDetail"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/migrationhubstrategy/2020-02-19/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/migrationhubstrategy/2020-02-19/service-2.json.gz
new file mode 100644
index 00000000..035b0f10
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/migrationhubstrategy/2020-02-19/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mq/2017-11-27/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mq/2017-11-27/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..27ee5c9c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mq/2017-11-27/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mq/2017-11-27/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/mq/2017-11-27/paginators-1.json
new file mode 100644
index 00000000..55160732
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mq/2017-11-27/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListBrokers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "BrokerSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mq/2017-11-27/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mq/2017-11-27/service-2.json.gz
new file mode 100644
index 00000000..61928b73
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mq/2017-11-27/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mturk/2017-01-17/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mturk/2017-01-17/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b3f7106e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mturk/2017-01-17/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mturk/2017-01-17/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/mturk/2017-01-17/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mturk/2017-01-17/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mturk/2017-01-17/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/mturk/2017-01-17/paginators-1.json
new file mode 100644
index 00000000..ea50cacc
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mturk/2017-01-17/paginators-1.json
@@ -0,0 +1,58 @@
+{
+ "pagination": {
+ "ListAssignmentsForHIT": {
+ "result_key": "Assignments",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListQualificationTypes": {
+ "result_key": "QualificationTypes",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListHITs": {
+ "result_key": "HITs",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListWorkerBlocks": {
+ "result_key": "WorkerBlocks",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListReviewableHITs": {
+ "result_key": "HITs",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListHITsForQualificationType": {
+ "result_key": "HITs",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListQualificationRequests": {
+ "result_key": "QualificationRequests",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListWorkersWithQualificationType": {
+ "result_key": "Qualifications",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListBonusPayments": {
+ "result_key": "BonusPayments",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mturk/2017-01-17/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mturk/2017-01-17/service-2.json.gz
new file mode 100644
index 00000000..1c10adb8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mturk/2017-01-17/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mwaa/2020-07-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mwaa/2020-07-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..f5ec8d4f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mwaa/2020-07-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mwaa/2020-07-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/mwaa/2020-07-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mwaa/2020-07-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mwaa/2020-07-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/mwaa/2020-07-01/paginators-1.json
new file mode 100644
index 00000000..5e218e46
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mwaa/2020-07-01/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListEnvironments": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Environments"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/mwaa/2020-07-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/mwaa/2020-07-01/service-2.json.gz
new file mode 100644
index 00000000..c69cc68e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/mwaa/2020-07-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/neptune-graph/2023-11-29/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/neptune-graph/2023-11-29/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b46b6dd3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/neptune-graph/2023-11-29/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/neptune-graph/2023-11-29/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/neptune-graph/2023-11-29/paginators-1.json
new file mode 100644
index 00000000..7ce2e6dd
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/neptune-graph/2023-11-29/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "ListGraphSnapshots": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "graphSnapshots"
+ },
+ "ListGraphs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "graphs"
+ },
+ "ListImportTasks": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "tasks"
+ },
+ "ListPrivateGraphEndpoints": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "privateGraphEndpoints"
+ },
+ "ListExportTasks": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "tasks"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/neptune-graph/2023-11-29/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/neptune-graph/2023-11-29/service-2.json.gz
new file mode 100644
index 00000000..772d38eb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/neptune-graph/2023-11-29/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/neptune-graph/2023-11-29/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/neptune-graph/2023-11-29/waiters-2.json
new file mode 100644
index 00000000..586b44b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/neptune-graph/2023-11-29/waiters-2.json
@@ -0,0 +1,212 @@
+{
+ "version" : 2,
+ "waiters" : {
+ "ExportTaskCancelled" : {
+ "description" : "Wait until Export Task is Cancelled",
+ "delay" : 60,
+ "maxAttempts" : 60,
+ "operation" : "GetExportTask",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status != 'CANCELLING' && status != 'CANCELLED'",
+ "state" : "failure",
+ "expected" : true
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "CANCELLED"
+ } ]
+ },
+ "ExportTaskSuccessful" : {
+ "description" : "Wait until Export Task is Successful",
+ "delay" : 60,
+ "maxAttempts" : 480,
+ "operation" : "GetExportTask",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "CANCELLING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "CANCELLED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "SUCCEEDED"
+ } ]
+ },
+ "GraphAvailable" : {
+ "description" : "Wait until Graph is Available",
+ "delay" : 60,
+ "maxAttempts" : 480,
+ "operation" : "GetGraph",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "DELETING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "AVAILABLE"
+ } ]
+ },
+ "GraphDeleted" : {
+ "description" : "Wait until Graph is Deleted",
+ "delay" : 60,
+ "maxAttempts" : 60,
+ "operation" : "GetGraph",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status != 'DELETING'",
+ "state" : "failure",
+ "expected" : true
+ }, {
+ "matcher" : "error",
+ "state" : "success",
+ "expected" : "ResourceNotFoundException"
+ } ]
+ },
+ "GraphSnapshotAvailable" : {
+ "description" : "Wait until GraphSnapshot is Available",
+ "delay" : 60,
+ "maxAttempts" : 120,
+ "operation" : "GetGraphSnapshot",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "DELETING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "AVAILABLE"
+ } ]
+ },
+ "GraphSnapshotDeleted" : {
+ "description" : "Wait until GraphSnapshot is Deleted",
+ "delay" : 60,
+ "maxAttempts" : 60,
+ "operation" : "GetGraphSnapshot",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status != 'DELETING'",
+ "state" : "failure",
+ "expected" : true
+ }, {
+ "matcher" : "error",
+ "state" : "success",
+ "expected" : "ResourceNotFoundException"
+ } ]
+ },
+ "ImportTaskCancelled" : {
+ "description" : "Wait until Import Task is Cancelled",
+ "delay" : 60,
+ "maxAttempts" : 60,
+ "operation" : "GetImportTask",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status != 'CANCELLING' && status != 'CANCELLED'",
+ "state" : "failure",
+ "expected" : true
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "CANCELLED"
+ } ]
+ },
+ "ImportTaskSuccessful" : {
+ "description" : "Wait until Import Task is Successful",
+ "delay" : 60,
+ "maxAttempts" : 480,
+ "operation" : "GetImportTask",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "CANCELLING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "CANCELLED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "ROLLING_BACK"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "SUCCEEDED"
+ } ]
+ },
+ "PrivateGraphEndpointAvailable" : {
+ "description" : "Wait until PrivateGraphEndpoint is Available",
+ "delay" : 10,
+ "maxAttempts" : 180,
+ "operation" : "GetPrivateGraphEndpoint",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "DELETING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "AVAILABLE"
+ } ]
+ },
+ "PrivateGraphEndpointDeleted" : {
+ "description" : "Wait until PrivateGraphEndpoint is Deleted",
+ "delay" : 10,
+ "maxAttempts" : 180,
+ "operation" : "GetPrivateGraphEndpoint",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status != 'DELETING'",
+ "state" : "failure",
+ "expected" : true
+ }, {
+ "matcher" : "error",
+ "state" : "success",
+ "expected" : "ResourceNotFoundException"
+ } ]
+ }
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..5bff65a6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/paginators-1.json
new file mode 100644
index 00000000..1de13039
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/paginators-1.json
@@ -0,0 +1,100 @@
+{
+ "pagination": {
+ "DescribeDBEngineVersions": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBEngineVersions"
+ },
+ "DescribeDBInstances": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBInstances"
+ },
+ "DescribeDBParameterGroups": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBParameterGroups"
+ },
+ "DescribeDBParameters": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "Parameters"
+ },
+ "DescribeDBSubnetGroups": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBSubnetGroups"
+ },
+ "DescribeEngineDefaultParameters": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "EngineDefaults.Marker",
+ "result_key": "EngineDefaults.Parameters"
+ },
+ "DescribeEventSubscriptions": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "EventSubscriptionsList"
+ },
+ "DescribeEvents": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "Events"
+ },
+ "DescribeOrderableDBInstanceOptions": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "OrderableDBInstanceOptions"
+ },
+ "DescribeDBClusterParameterGroups": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBClusterParameterGroups"
+ },
+ "DescribeDBClusterParameters": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "Parameters"
+ },
+ "DescribeDBClusterSnapshots": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBClusterSnapshots"
+ },
+ "DescribeDBClusters": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBClusters"
+ },
+ "DescribePendingMaintenanceActions": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "PendingMaintenanceActions"
+ },
+ "DescribeDBClusterEndpoints": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBClusterEndpoints"
+ },
+ "DescribeGlobalClusters": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "GlobalClusters"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/service-2.json.gz
new file mode 100644
index 00000000..d7b031c8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/service-2.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/service-2.sdk-extras.json
new file mode 100644
index 00000000..85e8a104
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/service-2.sdk-extras.json
@@ -0,0 +1,23 @@
+ {
+ "version": 1.0,
+ "merge": {
+ "shapes": {
+ "CopyDBClusterSnapshotMessage": {
+ "members": {
+ "SourceRegion": {
+ "shape": "String",
+ "documentation": "<p>The ID of the region that contains the snapshot to be copied.</p>"
+ }
+ }
+ },
+ "CreateDBClusterMessage": {
+ "members": {
+ "SourceRegion": {
+ "shape": "String",
+ "documentation": "<p>The ID of the region that contains the source for the db cluster.</p>"
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/waiters-2.json
new file mode 100644
index 00000000..e75f03b2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/neptune/2014-10-31/waiters-2.json
@@ -0,0 +1,90 @@
+{
+ "version": 2,
+ "waiters": {
+ "DBInstanceAvailable": {
+ "delay": 30,
+ "operation": "DescribeDBInstances",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "incompatible-restore",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "incompatible-parameters",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ }
+ ]
+ },
+ "DBInstanceDeleted": {
+ "delay": 30,
+ "operation": "DescribeDBInstances",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "DBInstanceNotFound",
+ "matcher": "error",
+ "state": "success"
+ },
+ {
+ "expected": "creating",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "modifying",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "rebooting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "resetting-master-credentials",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/neptunedata/2023-08-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/neptunedata/2023-08-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b480cb8f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/neptunedata/2023-08-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/neptunedata/2023-08-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/neptunedata/2023-08-01/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/neptunedata/2023-08-01/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/neptunedata/2023-08-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/neptunedata/2023-08-01/service-2.json.gz
new file mode 100644
index 00000000..5016b43a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/neptunedata/2023-08-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/network-firewall/2020-11-12/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/network-firewall/2020-11-12/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..191da034
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/network-firewall/2020-11-12/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/network-firewall/2020-11-12/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/network-firewall/2020-11-12/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/network-firewall/2020-11-12/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/network-firewall/2020-11-12/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/network-firewall/2020-11-12/paginators-1.json
new file mode 100644
index 00000000..adc37670
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/network-firewall/2020-11-12/paginators-1.json
@@ -0,0 +1,58 @@
+{
+ "pagination": {
+ "ListFirewallPolicies": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "FirewallPolicies"
+ },
+ "ListFirewalls": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Firewalls"
+ },
+ "ListRuleGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RuleGroups"
+ },
+ "ListTagsForResource": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Tags"
+ },
+ "ListTLSInspectionConfigurations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "TLSInspectionConfigurations"
+ },
+ "GetAnalysisReportResults": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AnalysisReportResults"
+ },
+ "ListAnalysisReports": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AnalysisReports"
+ },
+ "ListFlowOperationResults": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Flows"
+ },
+ "ListFlowOperations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "FlowOperations"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/network-firewall/2020-11-12/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/network-firewall/2020-11-12/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..d5f946ac
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/network-firewall/2020-11-12/paginators-1.sdk-extras.json
@@ -0,0 +1,26 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "GetAnalysisReportResults": {
+ "non_aggregate_keys": [
+ "EndTime",
+ "ReportTime",
+ "Status",
+ "AnalysisType",
+ "StartTime"
+ ]
+ },
+ "ListFlowOperationResults": {
+ "non_aggregate_keys": [
+ "FirewallArn",
+ "FlowOperationId",
+ "AvailabilityZone",
+ "FlowOperationStatus",
+ "FlowRequestTimestamp",
+ "StatusMessage"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/network-firewall/2020-11-12/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/network-firewall/2020-11-12/service-2.json.gz
new file mode 100644
index 00000000..8f56af69
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/network-firewall/2020-11-12/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/networkflowmonitor/2023-04-19/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/networkflowmonitor/2023-04-19/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..5f1e48bc
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/networkflowmonitor/2023-04-19/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/networkflowmonitor/2023-04-19/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/networkflowmonitor/2023-04-19/paginators-1.json
new file mode 100644
index 00000000..b41617d9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/networkflowmonitor/2023-04-19/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "GetQueryResultsMonitorTopContributors": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "topContributors"
+ },
+ "GetQueryResultsWorkloadInsightsTopContributors": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "topContributors"
+ },
+ "GetQueryResultsWorkloadInsightsTopContributorsData": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "datapoints"
+ },
+ "ListMonitors": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "monitors"
+ },
+ "ListScopes": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "scopes"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/networkflowmonitor/2023-04-19/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/networkflowmonitor/2023-04-19/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..8fe31880
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/networkflowmonitor/2023-04-19/paginators-1.sdk-extras.json
@@ -0,0 +1,17 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "GetQueryResultsMonitorTopContributors": {
+ "non_aggregate_keys": [
+ "unit"
+ ]
+ },
+ "GetQueryResultsWorkloadInsightsTopContributorsData": {
+ "non_aggregate_keys": [
+ "unit"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/networkflowmonitor/2023-04-19/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/networkflowmonitor/2023-04-19/service-2.json.gz
new file mode 100644
index 00000000..61b21375
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/networkflowmonitor/2023-04-19/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/networkflowmonitor/2023-04-19/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/networkflowmonitor/2023-04-19/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/networkflowmonitor/2023-04-19/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/networkmanager/2019-07-05/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/networkmanager/2019-07-05/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..91618d74
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/networkmanager/2019-07-05/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/networkmanager/2019-07-05/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/networkmanager/2019-07-05/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/networkmanager/2019-07-05/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/networkmanager/2019-07-05/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/networkmanager/2019-07-05/paginators-1.json
new file mode 100644
index 00000000..7196ace6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/networkmanager/2019-07-05/paginators-1.json
@@ -0,0 +1,130 @@
+{
+ "pagination": {
+ "DescribeGlobalNetworks": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "GlobalNetworks"
+ },
+ "GetCustomerGatewayAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "CustomerGatewayAssociations"
+ },
+ "GetDevices": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Devices"
+ },
+ "GetLinkAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "LinkAssociations"
+ },
+ "GetLinks": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Links"
+ },
+ "GetSites": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Sites"
+ },
+ "GetTransitGatewayRegistrations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "TransitGatewayRegistrations"
+ },
+ "GetConnections": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Connections"
+ },
+ "GetTransitGatewayConnectPeerAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "TransitGatewayConnectPeerAssociations"
+ },
+ "GetNetworkResourceCounts": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "NetworkResourceCounts"
+ },
+ "GetNetworkResourceRelationships": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Relationships"
+ },
+ "GetNetworkResources": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "NetworkResources"
+ },
+ "GetNetworkTelemetry": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "NetworkTelemetry"
+ },
+ "GetConnectPeerAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ConnectPeerAssociations"
+ },
+ "GetCoreNetworkChangeSet": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "CoreNetworkChanges"
+ },
+ "ListAttachments": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Attachments"
+ },
+ "ListConnectPeers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ConnectPeers"
+ },
+ "ListCoreNetworkPolicyVersions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "CoreNetworkPolicyVersions"
+ },
+ "ListCoreNetworks": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "CoreNetworks"
+ },
+ "GetCoreNetworkChangeEvents": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "CoreNetworkChangeEvents"
+ },
+ "ListPeerings": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Peerings"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/networkmanager/2019-07-05/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/networkmanager/2019-07-05/service-2.json.gz
new file mode 100644
index 00000000..4ae42bd0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/networkmanager/2019-07-05/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/networkmonitor/2023-08-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/networkmonitor/2023-08-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..ced2fa5d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/networkmonitor/2023-08-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/networkmonitor/2023-08-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/networkmonitor/2023-08-01/paginators-1.json
new file mode 100644
index 00000000..d885a0fb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/networkmonitor/2023-08-01/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListMonitors": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "monitors"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/networkmonitor/2023-08-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/networkmonitor/2023-08-01/service-2.json.gz
new file mode 100644
index 00000000..9e24de7f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/networkmonitor/2023-08-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/networkmonitor/2023-08-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/networkmonitor/2023-08-01/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/networkmonitor/2023-08-01/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/notifications/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/notifications/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..c054b02c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/notifications/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/notifications/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/notifications/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..8cd30193
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/notifications/2018-05-10/paginators-1.json
@@ -0,0 +1,58 @@
+{
+ "pagination": {
+ "ListChannels": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "channels"
+ },
+ "ListEventRules": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "eventRules"
+ },
+ "ListNotificationConfigurations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "notificationConfigurations"
+ },
+ "ListNotificationEvents": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "notificationEvents"
+ },
+ "ListNotificationHubs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "notificationHubs"
+ },
+ "ListManagedNotificationChannelAssociations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "channelAssociations"
+ },
+ "ListManagedNotificationChildEvents": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "managedNotificationChildEvents"
+ },
+ "ListManagedNotificationConfigurations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "managedNotificationConfigurations"
+ },
+ "ListManagedNotificationEvents": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "managedNotificationEvents"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/notifications/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/notifications/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..35387f8a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/notifications/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/notifications/2018-05-10/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/notifications/2018-05-10/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/notifications/2018-05-10/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/notificationscontacts/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/notificationscontacts/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..0939665e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/notificationscontacts/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/notificationscontacts/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/notificationscontacts/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..39f96a36
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/notificationscontacts/2018-05-10/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListEmailContacts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "emailContacts"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/notificationscontacts/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/notificationscontacts/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..dd352d24
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/notificationscontacts/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/notificationscontacts/2018-05-10/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/notificationscontacts/2018-05-10/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/notificationscontacts/2018-05-10/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/oam/2022-06-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/oam/2022-06-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..1cde409a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/oam/2022-06-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/oam/2022-06-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/oam/2022-06-10/paginators-1.json
new file mode 100644
index 00000000..3595f009
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/oam/2022-06-10/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListAttachedLinks": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListLinks": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ },
+ "ListSinks": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/oam/2022-06-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/oam/2022-06-10/service-2.json.gz
new file mode 100644
index 00000000..7f1767a5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/oam/2022-06-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/observabilityadmin/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/observabilityadmin/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..330cab1a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/observabilityadmin/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/observabilityadmin/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/observabilityadmin/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..3e06b86f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/observabilityadmin/2018-05-10/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "ListResourceTelemetry": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "TelemetryConfigurations"
+ },
+ "ListResourceTelemetryForOrganization": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "TelemetryConfigurations"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/observabilityadmin/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/observabilityadmin/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..40807818
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/observabilityadmin/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/observabilityadmin/2018-05-10/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/observabilityadmin/2018-05-10/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/observabilityadmin/2018-05-10/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/omics/2022-11-28/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/omics/2022-11-28/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..03b7d3da
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/omics/2022-11-28/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/omics/2022-11-28/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/omics/2022-11-28/paginators-1.json
new file mode 100644
index 00000000..b34caad3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/omics/2022-11-28/paginators-1.json
@@ -0,0 +1,130 @@
+{
+ "pagination": {
+ "ListAnnotationImportJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "annotationImportJobs"
+ },
+ "ListAnnotationStores": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "annotationStores"
+ },
+ "ListReadSetActivationJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "activationJobs"
+ },
+ "ListReadSetExportJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "exportJobs"
+ },
+ "ListReadSetImportJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "importJobs"
+ },
+ "ListReadSets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "readSets"
+ },
+ "ListReferenceImportJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "importJobs"
+ },
+ "ListReferenceStores": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "referenceStores"
+ },
+ "ListReferences": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "references"
+ },
+ "ListRunGroups": {
+ "input_token": "startingToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListRunTasks": {
+ "input_token": "startingToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListRuns": {
+ "input_token": "startingToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListSequenceStores": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "sequenceStores"
+ },
+ "ListVariantImportJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "variantImportJobs"
+ },
+ "ListVariantStores": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "variantStores"
+ },
+ "ListWorkflows": {
+ "input_token": "startingToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListMultipartReadSetUploads": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "uploads"
+ },
+ "ListReadSetUploadParts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "parts"
+ },
+ "ListAnnotationStoreVersions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "annotationStoreVersions"
+ },
+ "ListShares": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "shares"
+ },
+ "ListRunCaches": {
+ "input_token": "startingToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/omics/2022-11-28/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/omics/2022-11-28/service-2.json.gz
new file mode 100644
index 00000000..56302aa3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/omics/2022-11-28/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/omics/2022-11-28/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/omics/2022-11-28/waiters-2.json
new file mode 100644
index 00000000..9e82e101
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/omics/2022-11-28/waiters-2.json
@@ -0,0 +1,546 @@
+{
+ "version" : 2,
+ "waiters" : {
+ "AnnotationImportJobCreated" : {
+ "description" : "Wait until an annotation import is completed",
+ "delay" : 30,
+ "maxAttempts" : 20,
+ "operation" : "GetAnnotationImportJob",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "SUBMITTED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "IN_PROGRESS"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "CANCELLED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "COMPLETED"
+ } ]
+ },
+ "AnnotationStoreCreated" : {
+ "description" : "Wait until an annotation store is created",
+ "delay" : 30,
+ "maxAttempts" : 20,
+ "operation" : "GetAnnotationStore",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "ACTIVE"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "CREATING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "UPDATING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ } ]
+ },
+ "AnnotationStoreDeleted" : {
+ "description" : "Wait until an annotation store is deleted.",
+ "delay" : 30,
+ "maxAttempts" : 20,
+ "operation" : "GetAnnotationStore",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "DELETED"
+ }, {
+ "matcher" : "error",
+ "state" : "success",
+ "expected" : "ResourceNotFoundException"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "DELETING"
+ } ]
+ },
+ "AnnotationStoreVersionCreated" : {
+ "description" : "Wait until an annotation store version is created",
+ "delay" : 30,
+ "maxAttempts" : 20,
+ "operation" : "GetAnnotationStoreVersion",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "ACTIVE"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "CREATING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "UPDATING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ } ]
+ },
+ "AnnotationStoreVersionDeleted" : {
+ "description" : "Wait until an annotation store version is deleted.",
+ "delay" : 30,
+ "maxAttempts" : 20,
+ "operation" : "GetAnnotationStoreVersion",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "DELETED"
+ }, {
+ "matcher" : "error",
+ "state" : "success",
+ "expected" : "ResourceNotFoundException"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "DELETING"
+ } ]
+ },
+ "ReadSetActivationJobCompleted" : {
+ "description" : "Wait until a job is completed.",
+ "delay" : 30,
+ "maxAttempts" : 20,
+ "operation" : "GetReadSetActivationJob",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "COMPLETED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "SUBMITTED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "IN_PROGRESS"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "CANCELLING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "CANCELLED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "COMPLETED_WITH_FAILURES"
+ } ]
+ },
+ "ReadSetExportJobCompleted" : {
+ "description" : "Wait until a job is completed.",
+ "delay" : 30,
+ "maxAttempts" : 20,
+ "operation" : "GetReadSetExportJob",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "COMPLETED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "SUBMITTED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "IN_PROGRESS"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "CANCELLING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "CANCELLED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "COMPLETED_WITH_FAILURES"
+ } ]
+ },
+ "ReadSetImportJobCompleted" : {
+ "description" : "Wait until a job is completed.",
+ "delay" : 30,
+ "maxAttempts" : 20,
+ "operation" : "GetReadSetImportJob",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "COMPLETED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "SUBMITTED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "IN_PROGRESS"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "CANCELLING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "CANCELLED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "COMPLETED_WITH_FAILURES"
+ } ]
+ },
+ "ReferenceImportJobCompleted" : {
+ "description" : "Wait until a job is completed.",
+ "delay" : 30,
+ "maxAttempts" : 20,
+ "operation" : "GetReferenceImportJob",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "COMPLETED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "SUBMITTED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "IN_PROGRESS"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "CANCELLING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "CANCELLED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "COMPLETED_WITH_FAILURES"
+ } ]
+ },
+ "RunCompleted" : {
+ "description" : "Wait until a run is completed.",
+ "delay" : 30,
+ "maxAttempts" : 20,
+ "operation" : "GetRun",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "COMPLETED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "PENDING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "STARTING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "RUNNING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "STOPPING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ } ]
+ },
+ "RunRunning" : {
+ "description" : "Wait until a run is running.",
+ "delay" : 30,
+ "maxAttempts" : 20,
+ "operation" : "GetRun",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "RUNNING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "PENDING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "STARTING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "CANCELLED"
+ } ]
+ },
+ "TaskCompleted" : {
+ "description" : "Wait until a task is completed.",
+ "delay" : 30,
+ "maxAttempts" : 20,
+ "operation" : "GetRunTask",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "COMPLETED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "PENDING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "STARTING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "RUNNING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "STOPPING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ } ]
+ },
+ "TaskRunning" : {
+ "description" : "Wait until a task is running.",
+ "delay" : 30,
+ "maxAttempts" : 20,
+ "operation" : "GetRunTask",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "RUNNING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "PENDING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "STARTING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "CANCELLED"
+ } ]
+ },
+ "VariantImportJobCreated" : {
+ "description" : "Wait until variant import is completed",
+ "delay" : 30,
+ "maxAttempts" : 20,
+ "operation" : "GetVariantImportJob",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "SUBMITTED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "IN_PROGRESS"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "CANCELLED"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "COMPLETED"
+ } ]
+ },
+ "VariantStoreCreated" : {
+ "description" : "Wait until a variant store is created",
+ "delay" : 30,
+ "maxAttempts" : 20,
+ "operation" : "GetVariantStore",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "ACTIVE"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "CREATING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "UPDATING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ } ]
+ },
+ "VariantStoreDeleted" : {
+ "description" : "Wait until a variant store is deleted.",
+ "delay" : 30,
+ "maxAttempts" : 20,
+ "operation" : "GetVariantStore",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "DELETED"
+ }, {
+ "matcher" : "error",
+ "state" : "success",
+ "expected" : "ResourceNotFoundException"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "DELETING"
+ } ]
+ },
+ "WorkflowActive" : {
+ "description" : "Wait until a workflow is active.",
+ "delay" : 3,
+ "maxAttempts" : 10,
+ "operation" : "GetWorkflow",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "success",
+ "expected" : "ACTIVE"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "CREATING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "retry",
+ "expected" : "UPDATING"
+ }, {
+ "matcher" : "path",
+ "argument" : "status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ } ]
+ }
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/opensearch/2021-01-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/opensearch/2021-01-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..38f03a05
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/opensearch/2021-01-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/opensearch/2021-01-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/opensearch/2021-01-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/opensearch/2021-01-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/opensearch/2021-01-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/opensearch/2021-01-01/paginators-1.json
new file mode 100644
index 00000000..1f134ccf
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/opensearch/2021-01-01/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListApplications": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "ApplicationSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/opensearch/2021-01-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/opensearch/2021-01-01/service-2.json.gz
new file mode 100644
index 00000000..7d1a8adb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/opensearch/2021-01-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/opensearchserverless/2021-11-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/opensearchserverless/2021-11-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..1a494045
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/opensearchserverless/2021-11-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/opensearchserverless/2021-11-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/opensearchserverless/2021-11-01/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/opensearchserverless/2021-11-01/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/opensearchserverless/2021-11-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/opensearchserverless/2021-11-01/service-2.json.gz
new file mode 100644
index 00000000..7c0e4dfc
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/opensearchserverless/2021-11-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/opensearchserverless/2021-11-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/opensearchserverless/2021-11-01/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/opensearchserverless/2021-11-01/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/opsworks/2013-02-18/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/opsworks/2013-02-18/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..4b1ca59c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/opsworks/2013-02-18/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/opsworks/2013-02-18/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/opsworks/2013-02-18/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/opsworks/2013-02-18/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/opsworks/2013-02-18/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/opsworks/2013-02-18/paginators-1.json
new file mode 100644
index 00000000..77936158
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/opsworks/2013-02-18/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "DescribeEcsClusters": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "EcsClusters"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/opsworks/2013-02-18/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/opsworks/2013-02-18/service-2.json.gz
new file mode 100644
index 00000000..e618677a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/opsworks/2013-02-18/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/opsworks/2013-02-18/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/opsworks/2013-02-18/waiters-2.json
new file mode 100644
index 00000000..1b9dfaad
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/opsworks/2013-02-18/waiters-2.json
@@ -0,0 +1,289 @@
+{
+ "version": 2,
+ "waiters": {
+ "AppExists": {
+ "delay": 1,
+ "operation": "DescribeApps",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": 200,
+ "matcher": "status",
+ "state": "success"
+ },
+ {
+ "matcher": "status",
+ "expected": 400,
+ "state": "failure"
+ }
+ ]
+ },
+ "DeploymentSuccessful": {
+ "delay": 15,
+ "operation": "DescribeDeployments",
+ "maxAttempts": 40,
+ "description": "Wait until a deployment has completed successfully.",
+ "acceptors": [
+ {
+ "expected": "successful",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Deployments[].Status"
+ },
+ {
+ "expected": "failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Deployments[].Status"
+ }
+ ]
+ },
+ "InstanceOnline": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "description": "Wait until OpsWorks instance is online.",
+ "acceptors": [
+ {
+ "expected": "online",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "setup_failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "shutting_down",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "start_failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "stopped",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "stopping",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "terminating",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "terminated",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "stop_failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ }
+ ]
+ },
+ "InstanceRegistered": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "description": "Wait until OpsWorks instance is registered.",
+ "acceptors": [
+ {
+ "expected": "registered",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "setup_failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "shutting_down",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "stopped",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "stopping",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "terminating",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "terminated",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "stop_failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ }
+ ]
+ },
+ "InstanceStopped": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "description": "Wait until OpsWorks instance is stopped.",
+ "acceptors": [
+ {
+ "expected": "stopped",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "booting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "rebooting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "requested",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "running_setup",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "setup_failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "start_failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "stop_failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ }
+ ]
+ },
+ "InstanceTerminated": {
+ "delay": 15,
+ "operation": "DescribeInstances",
+ "maxAttempts": 40,
+ "description": "Wait until OpsWorks instance is terminated.",
+ "acceptors": [
+ {
+ "expected": "terminated",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "ResourceNotFoundException",
+ "matcher": "error",
+ "state": "success"
+ },
+ {
+ "expected": "booting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "online",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "pending",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "rebooting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "requested",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "running_setup",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "setup_failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ },
+ {
+ "expected": "start_failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Instances[].Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/opsworkscm/2016-11-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/opsworkscm/2016-11-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..fca418b8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/opsworkscm/2016-11-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/opsworkscm/2016-11-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/opsworkscm/2016-11-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/opsworkscm/2016-11-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/opsworkscm/2016-11-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/opsworkscm/2016-11-01/paginators-1.json
new file mode 100644
index 00000000..e714aab1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/opsworkscm/2016-11-01/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "DescribeBackups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Backups"
+ },
+ "DescribeEvents": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ServerEvents"
+ },
+ "DescribeServers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Servers"
+ },
+ "ListTagsForResource": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Tags"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/opsworkscm/2016-11-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/opsworkscm/2016-11-01/service-2.json.gz
new file mode 100644
index 00000000..38dba59e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/opsworkscm/2016-11-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/opsworkscm/2016-11-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/opsworkscm/2016-11-01/waiters-2.json
new file mode 100644
index 00000000..f37dd040
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/opsworkscm/2016-11-01/waiters-2.json
@@ -0,0 +1,25 @@
+{
+ "version": 2,
+ "waiters": {
+ "NodeAssociated": {
+ "delay": 15,
+ "maxAttempts": 15,
+ "operation": "DescribeNodeAssociationStatus",
+ "description": "Wait until node is associated or disassociated.",
+ "acceptors": [
+ {
+ "expected": "SUCCESS",
+ "state": "success",
+ "matcher": "path",
+ "argument": "NodeAssociationStatus"
+ },
+ {
+ "expected": "FAILED",
+ "state": "failure",
+ "matcher": "path",
+ "argument": "NodeAssociationStatus"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/organizations/2016-11-28/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/organizations/2016-11-28/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..7dc7bf57
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/organizations/2016-11-28/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/organizations/2016-11-28/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/organizations/2016-11-28/examples-1.json
new file mode 100644
index 00000000..8e39290e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/organizations/2016-11-28/examples-1.json
@@ -0,0 +1,1409 @@
+{
+ "version": "1.0",
+ "examples": {
+ "AcceptHandshake": [
+ {
+ "input": {
+ "HandshakeId": "h-examplehandshakeid111"
+ },
+ "output": {
+ "Handshake": {
+ "Action": "INVITE",
+ "Arn": "arn:aws:organizations::111111111111:handshake/o-exampleorgid/invite/h-examplehandshakeid111",
+ "ExpirationTimestamp": "20170228T1215Z",
+ "Id": "h-examplehandshakeid111",
+ "Parties": [
+ {
+ "Id": "o-exampleorgid",
+ "Type": "ORGANIZATION"
+ },
+ {
+ "Id": "juan@example.com",
+ "Type": "EMAIL"
+ }
+ ],
+ "RequestedTimestamp": "20170214T1215Z",
+ "Resources": [
+ {
+ "Resources": [
+ {
+ "Type": "MASTER_EMAIL",
+ "Value": "bill@amazon.com"
+ },
+ {
+ "Type": "MASTER_NAME",
+ "Value": "Org Master Account"
+ },
+ {
+ "Type": "ORGANIZATION_FEATURE_SET",
+ "Value": "ALL"
+ }
+ ],
+ "Type": "ORGANIZATION",
+ "Value": "o-exampleorgid"
+ },
+ {
+ "Type": "ACCOUNT",
+ "Value": "222222222222"
+ }
+ ],
+ "State": "ACCEPTED"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Bill is the owner of an organization, and he invites Juan's account (222222222222) to join his organization. The following example shows Juan's account accepting the handshake and thus agreeing to the invitation.",
+ "id": "to-accept-a-handshake-from-another-account-1472500561150",
+ "title": "To accept a handshake from another account"
+ }
+ ],
+ "AttachPolicy": [
+ {
+ "input": {
+ "PolicyId": "p-examplepolicyid111",
+ "TargetId": "ou-examplerootid111-exampleouid111"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to attach a service control policy (SCP) to an OU:\n",
+ "id": "to-attach-a-policy-to-an-ou",
+ "title": "To attach a policy to an OU"
+ },
+ {
+ "input": {
+ "PolicyId": "p-examplepolicyid111",
+ "TargetId": "333333333333"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to attach a service control policy (SCP) to an account:\n",
+ "id": "to-attach-a-policy-to-an-account",
+ "title": "To attach a policy to an account"
+ }
+ ],
+ "CancelHandshake": [
+ {
+ "input": {
+ "HandshakeId": "h-examplehandshakeid111"
+ },
+ "output": {
+ "Handshake": {
+ "Action": "INVITE",
+ "Arn": "arn:aws:organizations::111111111111:handshake/o-exampleorgid/invite/h-examplehandshakeid111",
+ "ExpirationTimestamp": "20170228T1215Z",
+ "Id": "h-examplehandshakeid111",
+ "Parties": [
+ {
+ "Id": "o-exampleorgid",
+ "Type": "ORGANIZATION"
+ },
+ {
+ "Id": "susan@example.com",
+ "Type": "EMAIL"
+ }
+ ],
+ "RequestedTimestamp": "20170214T1215Z",
+ "Resources": [
+ {
+ "Resources": [
+ {
+ "Type": "MASTER_EMAIL",
+ "Value": "bill@example.com"
+ },
+ {
+ "Type": "MASTER_NAME",
+ "Value": "Master Account"
+ },
+ {
+ "Type": "ORGANIZATION_FEATURE_SET",
+ "Value": "CONSOLIDATED_BILLING"
+ }
+ ],
+ "Type": "ORGANIZATION",
+ "Value": "o-exampleorgid"
+ },
+ {
+ "Type": "ACCOUNT",
+ "Value": "222222222222"
+ },
+ {
+ "Type": "NOTES",
+ "Value": "This is a request for Susan's account to join Bob's organization."
+ }
+ ],
+ "State": "CANCELED"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Bill previously sent an invitation to Susan's account to join his organization. He changes his mind and decides to cancel the invitation before Susan accepts it. The following example shows Bill's cancellation:\n",
+ "id": "to-cancel-a-handshake-sent-to-a-member-account-1472501320506",
+ "title": "To cancel a handshake sent to a member account"
+ }
+ ],
+ "CreateAccount": [
+ {
+ "input": {
+ "AccountName": "Production Account",
+ "Email": "susan@example.com"
+ },
+ "output": {
+ "CreateAccountStatus": {
+ "Id": "car-examplecreateaccountrequestid111",
+ "State": "IN_PROGRESS"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The owner of an organization creates a member account in the organization. The following example shows that when the organization owner creates the member account, the account is preconfigured with the name \"Production Account\" and an owner email address of susan@example.com. An IAM role is automatically created using the default name because the roleName parameter is not used. AWS Organizations sends Susan a \"Welcome to AWS\" email:\n\n",
+ "id": "to-create-a-new-account-that-is-automatically-part-of-the-organization-1472501463507",
+ "title": "To create a new account that is automatically part of the organization"
+ }
+ ],
+ "CreateOrganization": [
+ {
+ "input": {
+ },
+ "output": {
+ "Organization": {
+ "Arn": "arn:aws:organizations::111111111111:organization/o-exampleorgid",
+ "AvailablePolicyTypes": [
+ {
+ "Status": "ENABLED",
+ "Type": "SERVICE_CONTROL_POLICY"
+ }
+ ],
+ "FeatureSet": "ALL",
+ "Id": "o-exampleorgid",
+ "MasterAccountArn": "arn:aws:organizations::111111111111:account/o-exampleorgid/111111111111",
+ "MasterAccountEmail": "bill@example.com",
+ "MasterAccountId": "111111111111"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Bill wants to create an organization using credentials from account 111111111111. The following example shows that the account becomes the master account in the new organization. Because he does not specify a feature set, the new organization defaults to all features enabled and service control policies enabled on the root:\n\n",
+ "id": "to-create-a-new-organization-with-all-features enabled",
+ "title": "To create a new organization with all features enabled"
+ },
+ {
+ "input": {
+ "FeatureSet": "CONSOLIDATED_BILLING"
+ },
+ "output": {
+ "Organization": {
+ "Arn": "arn:aws:organizations::111111111111:organization/o-exampleorgid",
+ "AvailablePolicyTypes": [
+
+ ],
+ "FeatureSet": "CONSOLIDATED_BILLING",
+ "Id": "o-exampleorgid",
+ "MasterAccountArn": "arn:aws:organizations::111111111111:account/o-exampleorgid/111111111111",
+ "MasterAccountEmail": "bill@example.com",
+ "MasterAccountId": "111111111111"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "In the following example, Bill creates an organization using credentials from account 111111111111, and configures the organization to support only the consolidated billing feature set:\n\n",
+ "id": "to-create-a-new-organization-with-consolidated-billing-features-only",
+ "title": "To create a new organization with consolidated billing features only"
+ }
+ ],
+ "CreateOrganizationalUnit": [
+ {
+ "input": {
+ "Name": "AccountingOU",
+ "ParentId": "r-examplerootid111"
+ },
+ "output": {
+ "OrganizationalUnit": {
+ "Arn": "arn:aws:organizations::111111111111:ou/o-exampleorgid/ou-examplerootid111-exampleouid111",
+ "Id": "ou-examplerootid111-exampleouid111",
+ "Name": "AccountingOU"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to create an OU that is named AccountingOU. The new OU is directly under the root.:\n\n",
+ "id": "to-create-a-new-organizational-unit",
+ "title": "To create a new organization unit"
+ }
+ ],
+ "CreatePolicy": [
+ {
+ "input": {
+ "Content": "{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":{\\\"Effect\\\":\\\"Allow\\\",\\\"Action\\\":\\\"s3:*\\\"}}",
+ "Description": "Enables admins of attached accounts to delegate all S3 permissions",
+ "Name": "AllowAllS3Actions",
+ "Type": "SERVICE_CONTROL_POLICY"
+ },
+ "output": {
+ "Policy": {
+ "Content": "{\"Version\":\"2012-10-17\",\"Statement\":{\"Effect\":\"Allow\",\"Action\":\"s3:*\"}}",
+ "PolicySummary": {
+ "Arn": "arn:aws:organizations::111111111111:policy/o-exampleorgid/service_control_policy/p-examplepolicyid111",
+ "Description": "Allows delegation of all S3 actions",
+ "Name": "AllowAllS3Actions",
+ "Type": "SERVICE_CONTROL_POLICY"
+ }
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to create a service control policy (SCP) that is named AllowAllS3Actions. The JSON string in the content parameter specifies the content in the policy. The parameter string is escaped with backslashes to ensure that the embedded double quotes in the JSON policy are treated as literals in the parameter, which itself is surrounded by double quotes:\n\n",
+ "id": "to-create-a-service-control-policy",
+ "title": "To create a service control policy"
+ }
+ ],
+ "DeclineHandshake": [
+ {
+ "input": {
+ "HandshakeId": "h-examplehandshakeid111"
+ },
+ "output": {
+ "Handshake": {
+ "Action": "INVITE",
+ "Arn": "arn:aws:organizations::111111111111:handshake/o-exampleorgid/invite/h-examplehandshakeid111",
+ "ExpirationTimestamp": "2016-12-15T19:27:58Z",
+ "Id": "h-examplehandshakeid111",
+ "Parties": [
+ {
+ "Id": "222222222222",
+ "Type": "ACCOUNT"
+ },
+ {
+ "Id": "o-exampleorgid",
+ "Type": "ORGANIZATION"
+ }
+ ],
+ "RequestedTimestamp": "2016-11-30T19:27:58Z",
+ "Resources": [
+ {
+ "Resources": [
+ {
+ "Type": "MASTER_EMAIL",
+ "Value": "bill@example.com"
+ },
+ {
+ "Type": "MASTER_NAME",
+ "Value": "Master Account"
+ }
+ ],
+ "Type": "ORGANIZATION",
+ "Value": "o-exampleorgid"
+ },
+ {
+ "Type": "ACCOUNT",
+ "Value": "222222222222"
+ },
+ {
+ "Type": "NOTES",
+ "Value": "This is an invitation to Susan's account to join the Bill's organization."
+ }
+ ],
+ "State": "DECLINED"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows Susan declining an invitation to join Bill's organization. The DeclineHandshake operation returns a handshake object, showing that the state is now DECLINED:",
+ "id": "to-decline-a-handshake-sent-from-the-master-account-1472502666967",
+ "title": "To decline a handshake sent from the master account"
+ }
+ ],
+ "DeleteOrganizationalUnit": [
+ {
+ "input": {
+ "OrganizationalUnitId": "ou-examplerootid111-exampleouid111"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to delete an OU. The example assumes that you previously removed all accounts and other OUs from the OU:\n\n",
+ "id": "to-delete-an-organizational-unit",
+ "title": "To delete an organization unit"
+ }
+ ],
+ "DeletePolicy": [
+ {
+ "input": {
+ "PolicyId": "p-examplepolicyid111"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to delete a policy from an organization. The example assumes that you previously detached the policy from all entities:\n\n",
+ "id": "to-delete-a-policy",
+ "title": "To delete a policy"
+ }
+ ],
+ "DescribeAccount": [
+ {
+ "input": {
+ "AccountId": "555555555555"
+ },
+ "output": {
+ "Account": {
+ "Arn": "arn:aws:organizations::111111111111:account/o-exampleorgid/555555555555",
+ "Email": "anika@example.com",
+ "Id": "555555555555",
+ "Name": "Beta Account"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows a user in the master account (111111111111) asking for details about account 555555555555:",
+ "id": "to-get-the-details-about-an-account-1472503166868",
+ "title": "To get the details about an account"
+ }
+ ],
+ "DescribeCreateAccountStatus": [
+ {
+ "input": {
+ "CreateAccountRequestId": "car-exampleaccountcreationrequestid"
+ },
+ "output": {
+ "CreateAccountStatus": {
+ "AccountId": "333333333333",
+ "Id": "car-exampleaccountcreationrequestid",
+ "State": "SUCCEEDED"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to request the status about a previous request to create an account in an organization. This operation can be called only by a principal from the organization's master account. In the example, the specified \"createAccountRequestId\" comes from the response of the original call to \"CreateAccount\":",
+ "id": "to-get-information-about-a-request-to-create-an-account-1472503727223",
+ "title": "To get information about a request to create an account"
+ }
+ ],
+ "DescribeHandshake": [
+ {
+ "input": {
+ "HandshakeId": "h-examplehandshakeid111"
+ },
+ "output": {
+ "Handshake": {
+ "Action": "INVITE",
+ "Arn": "arn:aws:organizations::111111111111:handshake/o-exampleorgid/invite/h-examplehandshakeid111",
+ "ExpirationTimestamp": "2016-11-30T17:24:58.046Z",
+ "Id": "h-examplehandshakeid111",
+ "Parties": [
+ {
+ "Id": "o-exampleorgid",
+ "Type": "ORGANIZATION"
+ },
+ {
+ "Id": "333333333333",
+ "Type": "ACCOUNT"
+ }
+ ],
+ "RequestedTimestamp": "2016-11-30T17:24:58.046Z",
+ "Resources": [
+ {
+ "Resources": [
+ {
+ "Type": "MASTER_EMAIL",
+ "Value": "bill@example.com"
+ },
+ {
+ "Type": "MASTER_NAME",
+ "Value": "Master Account"
+ }
+ ],
+ "Type": "ORGANIZATION",
+ "Value": "o-exampleorgid"
+ },
+ {
+ "Type": "ACCOUNT",
+ "Value": "333333333333"
+ }
+ ],
+ "State": "OPEN"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows you how to request details about a handshake. The handshake ID comes either from the original call to \"InviteAccountToOrganization\", or from a call to \"ListHandshakesForAccount\" or \"ListHandshakesForOrganization\":",
+ "id": "to-get-information-about-a-handshake-1472503400505",
+ "title": "To get information about a handshake"
+ }
+ ],
+ "DescribeOrganization": [
+ {
+ "output": {
+ "Organization": {
+ "Arn": "arn:aws:organizations::111111111111:organization/o-exampleorgid",
+ "AvailablePolicyTypes": [
+ {
+ "Status": "ENABLED",
+ "Type": "SERVICE_CONTROL_POLICY"
+ }
+ ],
+ "FeatureSet": "ALL",
+ "Id": "o-exampleorgid",
+ "MasterAccountArn": "arn:aws:organizations::111111111111:account/o-exampleorgid/111111111111",
+ "MasterAccountEmail": "bill@example.com"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to request information about the current user's organization:/n/n",
+ "id": "to-get-information-about-an-organization-1472503400505",
+ "title": "To get information about an organization"
+ }
+ ],
+ "DescribeOrganizationalUnit": [
+ {
+ "input": {
+ "OrganizationalUnitId": "ou-examplerootid111-exampleouid111"
+ },
+ "output": {
+ "OrganizationalUnit": {
+ "Arn": "arn:aws:organizations::111111111111:ou/o-exampleorgid/ou-examplerootid111-exampleouid111",
+ "Id": "ou-examplerootid111-exampleouid111",
+ "Name": "Accounting Group"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to request details about an OU:/n/n",
+ "id": "to-get-information-about-an-organizational-unit",
+ "title": "To get information about an organizational unit"
+ }
+ ],
+ "DescribePolicy": [
+ {
+ "input": {
+ "PolicyId": "p-examplepolicyid111"
+ },
+ "output": {
+ "Policy": {
+ "Content": "{\\n \\\"Version\\\": \\\"2012-10-17\\\",\\n \\\"Statement\\\": [\\n {\\n \\\"Effect\\\": \\\"Allow\\\",\\n \\\"Action\\\": \\\"*\\\",\\n \\\"Resource\\\": \\\"*\\\"\\n }\\n ]\\n}",
+ "PolicySummary": {
+ "Arn": "arn:aws:organizations::111111111111:policy/o-exampleorgid/service_control_policy/p-examplepolicyid111",
+ "AwsManaged": false,
+ "Description": "Enables admins to delegate S3 permissions",
+ "Id": "p-examplepolicyid111",
+ "Name": "AllowAllS3Actions",
+ "Type": "SERVICE_CONTROL_POLICY"
+ }
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to request information about a policy:/n/n",
+ "id": "to-get-information-about-a-policy",
+ "title": "To get information about a policy"
+ }
+ ],
+ "DetachPolicy": [
+ {
+ "input": {
+ "PolicyId": "p-examplepolicyid111",
+ "TargetId": "ou-examplerootid111-exampleouid111"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to detach a policy from an OU:/n/n",
+ "id": "to-detach-a-policy-from-a-root-ou-or-account",
+ "title": "To detach a policy from a root, OU, or account"
+ }
+ ],
+ "DisablePolicyType": [
+ {
+ "input": {
+ "PolicyType": "SERVICE_CONTROL_POLICY",
+ "RootId": "r-examplerootid111"
+ },
+ "output": {
+ "Root": {
+ "Arn": "arn:aws:organizations::111111111111:root/o-exampleorgid/r-examplerootid111",
+ "Id": "r-examplerootid111",
+ "Name": "Root",
+ "PolicyTypes": [
+
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to disable the service control policy (SCP) policy type in a root. The response shows that the PolicyTypes response element no longer includes SERVICE_CONTROL_POLICY:/n/n",
+ "id": "to-disable-a-policy-type-in-a-root",
+ "title": "To disable a policy type in a root"
+ }
+ ],
+ "EnableAllFeatures": [
+ {
+ "input": {
+ },
+ "output": {
+ "Handshake": {
+ "Action": "ENABLE_ALL_FEATURES",
+ "Arn": "arn:aws:organizations::111111111111:handshake/o-exampleorgid/enable_all_features/h-examplehandshakeid111",
+ "ExpirationTimestamp": "2017-02-28T09:35:40.05Z",
+ "Id": "h-examplehandshakeid111",
+ "Parties": [
+ {
+ "Id": "o-exampleorgid",
+ "Type": "ORGANIZATION"
+ }
+ ],
+ "RequestedTimestamp": "2017-02-13T09:35:40.05Z",
+ "Resources": [
+ {
+ "Type": "ORGANIZATION",
+ "Value": "o-exampleorgid"
+ }
+ ],
+ "State": "REQUESTED"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example shows the administrator asking all the invited accounts in the organization to approve enabling all features in the organization. AWS Organizations sends an email to the address that is registered with every invited member account asking the owner to approve the change by accepting the handshake that is sent. After all invited member accounts accept the handshake, the organization administrator can finalize the change to enable all features, and those with appropriate permissions can create policies and apply them to roots, OUs, and accounts:/n/n",
+ "id": "to-enable-all-features-in-an-organization",
+ "title": "To enable all features in an organization"
+ }
+ ],
+ "EnablePolicyType": [
+ {
+ "input": {
+ "PolicyType": "SERVICE_CONTROL_POLICY",
+ "RootId": "r-examplerootid111"
+ },
+ "output": {
+ "Root": {
+ "Arn": "arn:aws:organizations::111111111111:root/o-exampleorgid/r-examplerootid111",
+ "Id": "r-examplerootid111",
+ "Name": "Root",
+ "PolicyTypes": [
+ {
+ "Status": "ENABLED",
+ "Type": "SERVICE_CONTROL_POLICY"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to enable the service control policy (SCP) policy type in a root. The output shows a root object with a PolicyTypes response element showing that SCPs are now enabled:/n/n",
+ "id": "to-enable-a-policy-type-in-a-root",
+ "title": "To enable a policy type in a root"
+ }
+ ],
+ "InviteAccountToOrganization": [
+ {
+ "input": {
+ "Notes": "This is a request for Juan's account to join Bill's organization",
+ "Target": {
+ "Id": "juan@example.com",
+ "Type": "EMAIL"
+ }
+ },
+ "output": {
+ "Handshake": {
+ "Action": "INVITE",
+ "Arn": "arn:aws:organizations::111111111111:handshake/o-exampleorgid/invite/h-examplehandshakeid111",
+ "ExpirationTimestamp": "2017-02-16T09:36:05.02Z",
+ "Id": "h-examplehandshakeid111",
+ "Parties": [
+ {
+ "Id": "o-exampleorgid",
+ "Type": "ORGANIZATION"
+ },
+ {
+ "Id": "juan@example.com",
+ "Type": "EMAIL"
+ }
+ ],
+ "RequestedTimestamp": "2017-02-01T09:36:05.02Z",
+ "Resources": [
+ {
+ "Resources": [
+ {
+ "Type": "MASTER_EMAIL",
+ "Value": "bill@amazon.com"
+ },
+ {
+ "Type": "MASTER_NAME",
+ "Value": "Org Master Account"
+ },
+ {
+ "Type": "ORGANIZATION_FEATURE_SET",
+ "Value": "FULL"
+ }
+ ],
+ "Type": "ORGANIZATION",
+ "Value": "o-exampleorgid"
+ },
+ {
+ "Type": "EMAIL",
+ "Value": "juan@example.com"
+ }
+ ],
+ "State": "OPEN"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows the admin of the master account owned by bill@example.com inviting the account owned by juan@example.com to join an organization.",
+ "id": "to-invite-an-account-to-join-an-organization-1472508594110",
+ "title": "To invite an account to join an organization"
+ }
+ ],
+ "LeaveOrganization": [
+ {
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "TThe following example shows how to remove your member account from an organization:",
+ "id": "to-leave-an-organization-as-a-member-account-1472508784736",
+ "title": "To leave an organization as a member account"
+ }
+ ],
+ "ListAccounts": [
+ {
+ "input": {
+ },
+ "output": {
+ "Accounts": [
+ {
+ "Arn": "arn:aws:organizations::111111111111:account/o-exampleorgid/111111111111",
+ "Email": "bill@example.com",
+ "Id": "111111111111",
+ "JoinedMethod": "INVITED",
+ "JoinedTimestamp": "20161215T193015Z",
+ "Name": "Master Account",
+ "Status": "ACTIVE"
+ },
+ {
+ "Arn": "arn:aws:organizations::111111111111:account/o-exampleorgid/222222222222",
+ "Email": "alice@example.com",
+ "Id": "222222222222",
+ "JoinedMethod": "INVITED",
+ "JoinedTimestamp": "20161215T210221Z",
+ "Name": "Developer Account",
+ "Status": "ACTIVE"
+ },
+ {
+ "Arn": "arn:aws:organizations::111111111111:account/o-exampleorgid/333333333333",
+ "Email": "juan@example.com",
+ "Id": "333333333333",
+ "JoinedMethod": "INVITED",
+ "JoinedTimestamp": "20161215T210347Z",
+ "Name": "Test Account",
+ "Status": "ACTIVE"
+ },
+ {
+ "Arn": "arn:aws:organizations::111111111111:account/o-exampleorgid/444444444444",
+ "Email": "anika@example.com",
+ "Id": "444444444444",
+ "JoinedMethod": "INVITED",
+ "JoinedTimestamp": "20161215T210332Z",
+ "Name": "Production Account",
+ "Status": "ACTIVE"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows you how to request a list of the accounts in an organization:",
+ "id": "to-retrieve-a-list-of-all-of-the-accounts-in-an-organization-1472509590974",
+ "title": "To retrieve a list of all of the accounts in an organization"
+ }
+ ],
+ "ListAccountsForParent": [
+ {
+ "input": {
+ "ParentId": "ou-examplerootid111-exampleouid111"
+ },
+ "output": {
+ "Accounts": [
+ {
+ "Arn": "arn:aws:organizations::111111111111:account/o-exampleorgid/333333333333",
+ "Email": "juan@example.com",
+ "Id": "333333333333",
+ "JoinedMethod": "INVITED",
+ "JoinedTimestamp": 1481835795.536,
+ "Name": "Development Account",
+ "Status": "ACTIVE"
+ },
+ {
+ "Arn": "arn:aws:organizations::111111111111:account/o-exampleorgid/444444444444",
+ "Email": "anika@example.com",
+ "Id": "444444444444",
+ "JoinedMethod": "INVITED",
+ "JoinedTimestamp": 1481835812.143,
+ "Name": "Test Account",
+ "Status": "ACTIVE"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to request a list of the accounts in an OU:/n/n",
+ "id": "to-retrieve-a-list-of-all-of-the-accounts-in-a-root-or-ou-1472509590974",
+ "title": "To retrieve a list of all of the accounts in a root or OU"
+ }
+ ],
+ "ListChildren": [
+ {
+ "input": {
+ "ChildType": "ORGANIZATIONAL_UNIT",
+ "ParentId": "ou-examplerootid111-exampleouid111"
+ },
+ "output": {
+ "Children": [
+ {
+ "Id": "ou-examplerootid111-exampleouid111",
+ "Type": "ORGANIZATIONAL_UNIT"
+ },
+ {
+ "Id": "ou-examplerootid111-exampleouid222",
+ "Type": "ORGANIZATIONAL_UNIT"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to request a list of the child OUs in a parent root or OU:/n/n",
+ "id": "to-retrieve-a-list-of-all-of-the-child-accounts-and-OUs-in-a-parent-container",
+ "title": "To retrieve a list of all of the child accounts and OUs in a parent root or OU"
+ }
+ ],
+ "ListCreateAccountStatus": [
+ {
+ "input": {
+ "States": [
+ "SUCCEEDED"
+ ]
+ },
+ "output": {
+ "CreateAccountStatuses": [
+ {
+ "AccountId": "444444444444",
+ "AccountName": "Developer Test Account",
+ "CompletedTimestamp": "2017-01-15T13:45:23.6Z",
+ "Id": "car-exampleaccountcreationrequestid1",
+ "RequestedTimestamp": "2017-01-15T13:45:23.01Z",
+ "State": "SUCCEEDED"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows a user requesting a list of only the completed account creation requests made for the current organization:",
+ "id": "to-get-a-list-of-completed-account-creation-requests-made-in-the-organization",
+ "title": "To get a list of completed account creation requests made in the organization"
+ },
+ {
+ "input": {
+ "States": [
+ "IN_PROGRESS"
+ ]
+ },
+ "output": {
+ "CreateAccountStatuses": [
+ {
+ "AccountName": "Production Account",
+ "Id": "car-exampleaccountcreationrequestid2",
+ "RequestedTimestamp": "2017-01-15T13:45:23.01Z",
+ "State": "IN_PROGRESS"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows a user requesting a list of only the in-progress account creation requests made for the current organization:",
+ "id": "to-get-a-list-of-all-account-creation-requests-made-in-the-organization-1472509174532",
+ "title": "To get a list of all account creation requests made in the organization"
+ }
+ ],
+ "ListHandshakesForAccount": [
+ {
+ "output": {
+ "Handshakes": [
+ {
+ "Action": "INVITE",
+ "Arn": "arn:aws:organizations::111111111111:handshake/o-exampleorgid/invite/h-examplehandshakeid111",
+ "ExpirationTimestamp": "2017-01-28T14:35:23.3Z",
+ "Id": "h-examplehandshakeid111",
+ "Parties": [
+ {
+ "Id": "o-exampleorgid",
+ "Type": "ORGANIZATION"
+ },
+ {
+ "Id": "juan@example.com",
+ "Type": "EMAIL"
+ }
+ ],
+ "RequestedTimestamp": "2017-01-13T14:35:23.3Z",
+ "Resources": [
+ {
+ "Resources": [
+ {
+ "Type": "MASTER_EMAIL",
+ "Value": "bill@amazon.com"
+ },
+ {
+ "Type": "MASTER_NAME",
+ "Value": "Org Master Account"
+ },
+ {
+ "Type": "ORGANIZATION_FEATURE_SET",
+ "Value": "FULL"
+ }
+ ],
+ "Type": "ORGANIZATION",
+ "Value": "o-exampleorgid"
+ },
+ {
+ "Type": "EMAIL",
+ "Value": "juan@example.com"
+ }
+ ],
+ "State": "OPEN"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows you how to get a list of handshakes that are associated with the account of the credentials used to call the operation:",
+ "id": "to-retrieve-a-list-of-the-handshakes-sent-to-an-account-1472510214747",
+ "title": "To retrieve a list of the handshakes sent to an account"
+ }
+ ],
+ "ListHandshakesForOrganization": [
+ {
+ "output": {
+ "Handshakes": [
+ {
+ "Action": "INVITE",
+ "Arn": "arn:aws:organizations::111111111111:handshake/o-exampleorgid/invite/h-examplehandshakeid111",
+ "ExpirationTimestamp": "2017-01-28T14:35:23.3Z",
+ "Id": "h-examplehandshakeid111",
+ "Parties": [
+ {
+ "Id": "o-exampleorgid",
+ "Type": "ORGANIZATION"
+ },
+ {
+ "Id": "juan@example.com",
+ "Type": "EMAIL"
+ }
+ ],
+ "RequestedTimestamp": "2017-01-13T14:35:23.3Z",
+ "Resources": [
+ {
+ "Resources": [
+ {
+ "Type": "MASTER_EMAIL",
+ "Value": "bill@amazon.com"
+ },
+ {
+ "Type": "MASTER_NAME",
+ "Value": "Org Master Account"
+ },
+ {
+ "Type": "ORGANIZATION_FEATURE_SET",
+ "Value": "FULL"
+ }
+ ],
+ "Type": "ORGANIZATION",
+ "Value": "o-exampleorgid"
+ },
+ {
+ "Type": "EMAIL",
+ "Value": "juan@example.com"
+ }
+ ],
+ "State": "OPEN"
+ },
+ {
+ "Action": "INVITE",
+ "Arn": "arn:aws:organizations::111111111111:handshake/o-exampleorgid/invite/h-examplehandshakeid111",
+ "ExpirationTimestamp": "2017-01-28T14:35:23.3Z",
+ "Id": "h-examplehandshakeid222",
+ "Parties": [
+ {
+ "Id": "o-exampleorgid",
+ "Type": "ORGANIZATION"
+ },
+ {
+ "Id": "anika@example.com",
+ "Type": "EMAIL"
+ }
+ ],
+ "RequestedTimestamp": "2017-01-13T14:35:23.3Z",
+ "Resources": [
+ {
+ "Resources": [
+ {
+ "Type": "MASTER_EMAIL",
+ "Value": "bill@example.com"
+ },
+ {
+ "Type": "MASTER_NAME",
+ "Value": "Master Account"
+ }
+ ],
+ "Type": "ORGANIZATION",
+ "Value": "o-exampleorgid"
+ },
+ {
+ "Type": "EMAIL",
+ "Value": "anika@example.com"
+ },
+ {
+ "Type": "NOTES",
+ "Value": "This is an invitation to Anika's account to join Bill's organization."
+ }
+ ],
+ "State": "ACCEPTED"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows you how to get a list of handshakes associated with the current organization:",
+ "id": "to-retrieve-a-list-of-the-handshakes-associated-with-an-organization-1472511206653",
+ "title": "To retrieve a list of the handshakes associated with an organization"
+ }
+ ],
+ "ListOrganizationalUnitsForParent": [
+ {
+ "input": {
+ "ParentId": "r-examplerootid111"
+ },
+ "output": {
+ "OrganizationalUnits": [
+ {
+ "Arn": "arn:aws:organizations::111111111111:ou/o-exampleorgid/ou-examlerootid111-exampleouid111",
+ "Id": "ou-examplerootid111-exampleouid111",
+ "Name": "Development"
+ },
+ {
+ "Arn": "arn:aws:organizations::111111111111:ou/o-exampleorgid/ou-examlerootid111-exampleouid222",
+ "Id": "ou-examplerootid111-exampleouid222",
+ "Name": "Production"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to get a list of OUs in a specified root:/n/n",
+ "id": "to-retrieve-a-list-of-all-of-the-OUs-in-a-parent-container",
+ "title": "To retrieve a list of all of the child OUs in a parent root or OU"
+ }
+ ],
+ "ListParents": [
+ {
+ "input": {
+ "ChildId": "444444444444"
+ },
+ "output": {
+ "Parents": [
+ {
+ "Id": "ou-examplerootid111-exampleouid111",
+ "Type": "ORGANIZATIONAL_UNIT"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to list the root or OUs that contain account 444444444444:/n/n",
+ "id": "to-retrieve-a-list-of-all-of-the-parents-of-a-child-ou-or-account",
+ "title": "To retrieve a list of all of the parents of a child OU or account"
+ }
+ ],
+ "ListPolicies": [
+ {
+ "input": {
+ "Filter": "SERVICE_CONTROL_POLICY"
+ },
+ "output": {
+ "Policies": [
+ {
+ "Arn": "arn:aws:organizations::111111111111:policy/o-exampleorgid/service_control_policy/p-examplepolicyid111",
+ "AwsManaged": false,
+ "Description": "Enables account admins to delegate permissions for any S3 actions to users and roles in their accounts.",
+ "Id": "p-examplepolicyid111",
+ "Name": "AllowAllS3Actions",
+ "Type": "SERVICE_CONTROL_POLICY"
+ },
+ {
+ "Arn": "arn:aws:organizations::111111111111:policy/o-exampleorgid/service_control_policy/p-examplepolicyid222",
+ "AwsManaged": false,
+ "Description": "Enables account admins to delegate permissions for any EC2 actions to users and roles in their accounts.",
+ "Id": "p-examplepolicyid222",
+ "Name": "AllowAllEC2Actions",
+ "Type": "SERVICE_CONTROL_POLICY"
+ },
+ {
+ "Arn": "arn:aws:organizations::aws:policy/service_control_policy/p-FullAWSAccess",
+ "AwsManaged": true,
+ "Description": "Allows access to every operation",
+ "Id": "p-FullAWSAccess",
+ "Name": "FullAWSAccess",
+ "Type": "SERVICE_CONTROL_POLICY"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to get a list of service control policies (SCPs):/n/n",
+ "id": "to-retrieve-a-list-of--policies-in-the-organization",
+ "title": "To retrieve a list policies in the organization"
+ }
+ ],
+ "ListPoliciesForTarget": [
+ {
+ "input": {
+ "Filter": "SERVICE_CONTROL_POLICY",
+ "TargetId": "444444444444"
+ },
+ "output": {
+ "Policies": [
+ {
+ "Arn": "arn:aws:organizations::111111111111:policy/o-exampleorgid/service_control_policy/p-examplepolicyid222",
+ "AwsManaged": false,
+ "Description": "Enables account admins to delegate permissions for any EC2 actions to users and roles in their accounts.",
+ "Id": "p-examplepolicyid222",
+ "Name": "AllowAllEC2Actions",
+ "Type": "SERVICE_CONTROL_POLICY"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to get a list of all service control policies (SCPs) of the type specified by the Filter parameter, that are directly attached to an account. The returned list does not include policies that apply to the account because of inheritance from its location in an OU hierarchy:/n/n",
+ "id": "to-retrieve-a-list-of-policies-attached-to-a-root-ou-or-account",
+ "title": "To retrieve a list policies attached to a root, OU, or account"
+ }
+ ],
+ "ListRoots": [
+ {
+ "input": {
+ },
+ "output": {
+ "Roots": [
+ {
+ "Arn": "arn:aws:organizations::111111111111:root/o-exampleorgid/r-examplerootid111",
+ "Id": "r-examplerootid111",
+ "Name": "Root",
+ "PolicyTypes": [
+ {
+ "Status": "ENABLED",
+ "Type": "SERVICE_CONTROL_POLICY"
+ }
+ ]
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to get the list of the roots in the current organization:/n/n",
+ "id": "to-retrieve-a-list-of-roots-in-the-organization",
+ "title": "To retrieve a list of roots in the organization"
+ }
+ ],
+ "ListTargetsForPolicy": [
+ {
+ "input": {
+ "PolicyId": "p-FullAWSAccess"
+ },
+ "output": {
+ "Targets": [
+ {
+ "Arn": "arn:aws:organizations::111111111111:root/o-exampleorgid/r-examplerootid111",
+ "Name": "Root",
+ "TargetId": "r-examplerootid111",
+ "Type": "ROOT"
+ },
+ {
+ "Arn": "arn:aws:organizations::111111111111:account/o-exampleorgid/333333333333;",
+ "Name": "Developer Test Account",
+ "TargetId": "333333333333",
+ "Type": "ACCOUNT"
+ },
+ {
+ "Arn": "arn:aws:organizations::111111111111:ou/o-exampleorgid/ou-examplerootid111-exampleouid111",
+ "Name": "Accounting",
+ "TargetId": "ou-examplerootid111-exampleouid111",
+ "Type": "ORGANIZATIONAL_UNIT"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to get the list of roots, OUs, and accounts to which the specified policy is attached:/n/n",
+ "id": "to-retrieve-a-list-of-roots-ous-and-accounts-to-which-a-policy-is-attached",
+ "title": "To retrieve a list of roots, OUs, and accounts to which a policy is attached"
+ }
+ ],
+ "MoveAccount": [
+ {
+ "input": {
+ "AccountId": "333333333333",
+ "DestinationParentId": "ou-examplerootid111-exampleouid111",
+ "SourceParentId": "r-examplerootid111"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to move a member account from the root to an OU:/n/n",
+ "id": "to-move-an-ou-or-account-to-another-ou-or-the-root",
+ "title": "To move an OU or account to another OU or the root"
+ }
+ ],
+ "RemoveAccountFromOrganization": [
+ {
+ "input": {
+ "AccountId": "333333333333"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows you how to remove an account from an organization:",
+ "id": "to-remove-an-account-from-an-organization-as-the-master-account",
+ "title": "To remove an account from an organization as the master account"
+ }
+ ],
+ "UpdateOrganizationalUnit": [
+ {
+ "input": {
+ "Name": "AccountingOU",
+ "OrganizationalUnitId": "ou-examplerootid111-exampleouid111"
+ },
+ "output": {
+ "OrganizationalUnit": {
+ "Arn": "arn:aws:organizations::111111111111:ou/o-exampleorgid/ou-examplerootid111-exampleouid111",
+ "Id": "ou-examplerootid111-exampleouid111",
+ "Name": "AccountingOU"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to rename an OU. The output confirms the new name:/n/n",
+ "id": "to-rename-an-organizational-unit",
+ "title": "To rename an organizational unit"
+ }
+ ],
+ "UpdatePolicy": [
+ {
+ "input": {
+ "Description": "This description replaces the original.",
+ "Name": "Renamed-Policy",
+ "PolicyId": "p-examplepolicyid111"
+ },
+ "output": {
+ "Policy": {
+ "Content": "{ \"Version\": \"2012-10-17\", \"Statement\": { \"Effect\": \"Allow\", \"Action\": \"ec2:*\", \"Resource\": \"*\" } }",
+ "PolicySummary": {
+ "Arn": "arn:aws:organizations::111111111111:policy/o-exampleorgid/service_control_policy/p-examplepolicyid111",
+ "AwsManaged": false,
+ "Description": "This description replaces the original.",
+ "Id": "p-examplepolicyid111",
+ "Name": "Renamed-Policy",
+ "Type": "SERVICE_CONTROL_POLICY"
+ }
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to rename a policy and give it a new description and new content. The output confirms the new name and description text:/n/n",
+ "id": "to-update-the-details-of-a-policy",
+ "title": "To update the details of a policy"
+ },
+ {
+ "input": {
+ "Content": "{ \\\"Version\\\": \\\"2012-10-17\\\", \\\"Statement\\\": {\\\"Effect\\\": \\\"Allow\\\", \\\"Action\\\": \\\"s3:*\\\", \\\"Resource\\\": \\\"*\\\" } }",
+ "PolicyId": "p-examplepolicyid111"
+ },
+ "output": {
+ "Policy": {
+ "Content": "{ \\\"Version\\\": \\\"2012-10-17\\\", \\\"Statement\\\": { \\\"Effect\\\": \\\"Allow\\\", \\\"Action\\\": \\\"s3:*\\\", \\\"Resource\\\": \\\"*\\\" } }",
+ "PolicySummary": {
+ "Arn": "arn:aws:organizations::111111111111:policy/o-exampleorgid/service_control_policy/p-examplepolicyid111",
+ "AwsManaged": false,
+ "Description": "This description replaces the original.",
+ "Id": "p-examplepolicyid111",
+ "Name": "Renamed-Policy",
+ "Type": "SERVICE_CONTROL_POLICY"
+ }
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to replace the JSON text of the SCP from the preceding example with a new JSON policy text string that allows S3 actions instead of EC2 actions:/n/n",
+ "id": "to-update-the-content-of-a-policy",
+ "title": "To update the content of a policy"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/organizations/2016-11-28/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/organizations/2016-11-28/paginators-1.json
new file mode 100644
index 00000000..0f05c577
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/organizations/2016-11-28/paginators-1.json
@@ -0,0 +1,99 @@
+{
+ "pagination": {
+ "ListAccounts": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Accounts"
+ },
+ "ListAccountsForParent": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Accounts"
+ },
+ "ListChildren": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Children"
+ },
+ "ListCreateAccountStatus": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "CreateAccountStatuses"
+ },
+ "ListHandshakesForAccount": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Handshakes"
+ },
+ "ListHandshakesForOrganization": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Handshakes"
+ },
+ "ListOrganizationalUnitsForParent": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "OrganizationalUnits"
+ },
+ "ListParents": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Parents"
+ },
+ "ListPolicies": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Policies"
+ },
+ "ListPoliciesForTarget": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Policies"
+ },
+ "ListRoots": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Roots"
+ },
+ "ListTargetsForPolicy": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Targets"
+ },
+ "ListAWSServiceAccessForOrganization": {
+ "result_key": "EnabledServicePrincipals",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListTagsForResource": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Tags"
+ },
+ "ListDelegatedAdministrators": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "DelegatedAdministrators"
+ },
+ "ListDelegatedServicesForAccount": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "DelegatedServices"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/organizations/2016-11-28/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/organizations/2016-11-28/service-2.json.gz
new file mode 100644
index 00000000..483c200b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/organizations/2016-11-28/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/osis/2022-01-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/osis/2022-01-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..fa236bef
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/osis/2022-01-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/osis/2022-01-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/osis/2022-01-01/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/osis/2022-01-01/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/osis/2022-01-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/osis/2022-01-01/service-2.json.gz
new file mode 100644
index 00000000..63a5fe51
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/osis/2022-01-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/outposts/2019-12-03/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/outposts/2019-12-03/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b054e4d0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/outposts/2019-12-03/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/outposts/2019-12-03/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/outposts/2019-12-03/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/outposts/2019-12-03/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/outposts/2019-12-03/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/outposts/2019-12-03/paginators-1.json
new file mode 100644
index 00000000..12a518c5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/outposts/2019-12-03/paginators-1.json
@@ -0,0 +1,64 @@
+{
+ "pagination": {
+ "GetOutpostInstanceTypes": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "InstanceTypes"
+ },
+ "ListAssets": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Assets"
+ },
+ "ListCatalogItems": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "CatalogItems"
+ },
+ "ListOrders": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Orders"
+ },
+ "ListOutposts": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Outposts"
+ },
+ "ListSites": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Sites"
+ },
+ "GetOutpostSupportedInstanceTypes": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "InstanceTypes"
+ },
+ "ListCapacityTasks": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "CapacityTasks"
+ },
+ "ListAssetInstances": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AssetInstances"
+ },
+ "ListBlockingInstancesForCapacityTask": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "BlockingInstances"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/outposts/2019-12-03/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/outposts/2019-12-03/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..f13d39be
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/outposts/2019-12-03/paginators-1.sdk-extras.json
@@ -0,0 +1,13 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "GetOutpostInstanceTypes": {
+ "non_aggregate_keys": [
+ "OutpostArn",
+ "OutpostId"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/outposts/2019-12-03/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/outposts/2019-12-03/service-2.json.gz
new file mode 100644
index 00000000..b18dd770
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/outposts/2019-12-03/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/panorama/2019-07-24/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/panorama/2019-07-24/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..a550cbab
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/panorama/2019-07-24/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/panorama/2019-07-24/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/panorama/2019-07-24/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/panorama/2019-07-24/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/panorama/2019-07-24/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/panorama/2019-07-24/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/panorama/2019-07-24/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/panorama/2019-07-24/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/panorama/2019-07-24/service-2.json.gz
new file mode 100644
index 00000000..90796e42
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/panorama/2019-07-24/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/partitions.json b/.venv/lib/python3.12/site-packages/botocore/data/partitions.json
new file mode 100644
index 00000000..e19224f1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/partitions.json
@@ -0,0 +1,239 @@
+{
+ "partitions" : [ {
+ "id" : "aws",
+ "outputs" : {
+ "dnsSuffix" : "amazonaws.com",
+ "dualStackDnsSuffix" : "api.aws",
+ "implicitGlobalRegion" : "us-east-1",
+ "name" : "aws",
+ "supportsDualStack" : true,
+ "supportsFIPS" : true
+ },
+ "regionRegex" : "^(us|eu|ap|sa|ca|me|af|il|mx)\\-\\w+\\-\\d+$",
+ "regions" : {
+ "af-south-1" : {
+ "description" : "Africa (Cape Town)"
+ },
+ "ap-east-1" : {
+ "description" : "Asia Pacific (Hong Kong)"
+ },
+ "ap-northeast-1" : {
+ "description" : "Asia Pacific (Tokyo)"
+ },
+ "ap-northeast-2" : {
+ "description" : "Asia Pacific (Seoul)"
+ },
+ "ap-northeast-3" : {
+ "description" : "Asia Pacific (Osaka)"
+ },
+ "ap-south-1" : {
+ "description" : "Asia Pacific (Mumbai)"
+ },
+ "ap-south-2" : {
+ "description" : "Asia Pacific (Hyderabad)"
+ },
+ "ap-southeast-1" : {
+ "description" : "Asia Pacific (Singapore)"
+ },
+ "ap-southeast-2" : {
+ "description" : "Asia Pacific (Sydney)"
+ },
+ "ap-southeast-3" : {
+ "description" : "Asia Pacific (Jakarta)"
+ },
+ "ap-southeast-4" : {
+ "description" : "Asia Pacific (Melbourne)"
+ },
+ "ap-southeast-5" : {
+ "description" : "Asia Pacific (Malaysia)"
+ },
+ "ap-southeast-7" : {
+ "description" : "Asia Pacific (Thailand)"
+ },
+ "aws-global" : {
+ "description" : "AWS Standard global region"
+ },
+ "ca-central-1" : {
+ "description" : "Canada (Central)"
+ },
+ "ca-west-1" : {
+ "description" : "Canada West (Calgary)"
+ },
+ "eu-central-1" : {
+ "description" : "Europe (Frankfurt)"
+ },
+ "eu-central-2" : {
+ "description" : "Europe (Zurich)"
+ },
+ "eu-north-1" : {
+ "description" : "Europe (Stockholm)"
+ },
+ "eu-south-1" : {
+ "description" : "Europe (Milan)"
+ },
+ "eu-south-2" : {
+ "description" : "Europe (Spain)"
+ },
+ "eu-west-1" : {
+ "description" : "Europe (Ireland)"
+ },
+ "eu-west-2" : {
+ "description" : "Europe (London)"
+ },
+ "eu-west-3" : {
+ "description" : "Europe (Paris)"
+ },
+ "il-central-1" : {
+ "description" : "Israel (Tel Aviv)"
+ },
+ "me-central-1" : {
+ "description" : "Middle East (UAE)"
+ },
+ "me-south-1" : {
+ "description" : "Middle East (Bahrain)"
+ },
+ "mx-central-1" : {
+ "description" : "Mexico (Central)"
+ },
+ "sa-east-1" : {
+ "description" : "South America (Sao Paulo)"
+ },
+ "us-east-1" : {
+ "description" : "US East (N. Virginia)"
+ },
+ "us-east-2" : {
+ "description" : "US East (Ohio)"
+ },
+ "us-west-1" : {
+ "description" : "US West (N. California)"
+ },
+ "us-west-2" : {
+ "description" : "US West (Oregon)"
+ }
+ }
+ }, {
+ "id" : "aws-cn",
+ "outputs" : {
+ "dnsSuffix" : "amazonaws.com.cn",
+ "dualStackDnsSuffix" : "api.amazonwebservices.com.cn",
+ "implicitGlobalRegion" : "cn-northwest-1",
+ "name" : "aws-cn",
+ "supportsDualStack" : true,
+ "supportsFIPS" : true
+ },
+ "regionRegex" : "^cn\\-\\w+\\-\\d+$",
+ "regions" : {
+ "aws-cn-global" : {
+ "description" : "AWS China global region"
+ },
+ "cn-north-1" : {
+ "description" : "China (Beijing)"
+ },
+ "cn-northwest-1" : {
+ "description" : "China (Ningxia)"
+ }
+ }
+ }, {
+ "id" : "aws-us-gov",
+ "outputs" : {
+ "dnsSuffix" : "amazonaws.com",
+ "dualStackDnsSuffix" : "api.aws",
+ "implicitGlobalRegion" : "us-gov-west-1",
+ "name" : "aws-us-gov",
+ "supportsDualStack" : true,
+ "supportsFIPS" : true
+ },
+ "regionRegex" : "^us\\-gov\\-\\w+\\-\\d+$",
+ "regions" : {
+ "aws-us-gov-global" : {
+ "description" : "AWS GovCloud (US) global region"
+ },
+ "us-gov-east-1" : {
+ "description" : "AWS GovCloud (US-East)"
+ },
+ "us-gov-west-1" : {
+ "description" : "AWS GovCloud (US-West)"
+ }
+ }
+ }, {
+ "id" : "aws-iso",
+ "outputs" : {
+ "dnsSuffix" : "c2s.ic.gov",
+ "dualStackDnsSuffix" : "c2s.ic.gov",
+ "implicitGlobalRegion" : "us-iso-east-1",
+ "name" : "aws-iso",
+ "supportsDualStack" : false,
+ "supportsFIPS" : true
+ },
+ "regionRegex" : "^us\\-iso\\-\\w+\\-\\d+$",
+ "regions" : {
+ "aws-iso-global" : {
+ "description" : "AWS ISO (US) global region"
+ },
+ "us-iso-east-1" : {
+ "description" : "US ISO East"
+ },
+ "us-iso-west-1" : {
+ "description" : "US ISO WEST"
+ }
+ }
+ }, {
+ "id" : "aws-iso-b",
+ "outputs" : {
+ "dnsSuffix" : "sc2s.sgov.gov",
+ "dualStackDnsSuffix" : "sc2s.sgov.gov",
+ "implicitGlobalRegion" : "us-isob-east-1",
+ "name" : "aws-iso-b",
+ "supportsDualStack" : false,
+ "supportsFIPS" : true
+ },
+ "regionRegex" : "^us\\-isob\\-\\w+\\-\\d+$",
+ "regions" : {
+ "aws-iso-b-global" : {
+ "description" : "AWS ISOB (US) global region"
+ },
+ "us-isob-east-1" : {
+ "description" : "US ISOB East (Ohio)"
+ }
+ }
+ }, {
+ "id" : "aws-iso-e",
+ "outputs" : {
+ "dnsSuffix" : "cloud.adc-e.uk",
+ "dualStackDnsSuffix" : "cloud.adc-e.uk",
+ "implicitGlobalRegion" : "eu-isoe-west-1",
+ "name" : "aws-iso-e",
+ "supportsDualStack" : false,
+ "supportsFIPS" : true
+ },
+ "regionRegex" : "^eu\\-isoe\\-\\w+\\-\\d+$",
+ "regions" : {
+ "eu-isoe-west-1" : {
+ "description" : "EU ISOE West"
+ }
+ }
+ }, {
+ "id" : "aws-iso-f",
+ "outputs" : {
+ "dnsSuffix" : "csp.hci.ic.gov",
+ "dualStackDnsSuffix" : "csp.hci.ic.gov",
+ "implicitGlobalRegion" : "us-isof-south-1",
+ "name" : "aws-iso-f",
+ "supportsDualStack" : false,
+ "supportsFIPS" : true
+ },
+ "regionRegex" : "^us\\-isof\\-\\w+\\-\\d+$",
+ "regions" : {
+ "aws-iso-f-global" : {
+ "description" : "AWS ISOF global region"
+ },
+ "us-isof-east-1" : {
+ "description" : "US ISOF EAST"
+ },
+ "us-isof-south-1" : {
+ "description" : "US ISOF SOUTH"
+ }
+ }
+ } ],
+ "version" : "1.1"
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/partnercentral-selling/2022-07-26/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/partnercentral-selling/2022-07-26/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..7f636dc8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/partnercentral-selling/2022-07-26/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/partnercentral-selling/2022-07-26/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/partnercentral-selling/2022-07-26/paginators-1.json
new file mode 100644
index 00000000..db4f336b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/partnercentral-selling/2022-07-26/paginators-1.json
@@ -0,0 +1,64 @@
+{
+ "pagination": {
+ "ListEngagementInvitations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "EngagementInvitationSummaries"
+ },
+ "ListOpportunities": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "OpportunitySummaries"
+ },
+ "ListSolutions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SolutionSummaries"
+ },
+ "ListEngagementByAcceptingInvitationTasks": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "TaskSummaries"
+ },
+ "ListEngagementFromOpportunityTasks": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "TaskSummaries"
+ },
+ "ListEngagementMembers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "EngagementMemberList"
+ },
+ "ListEngagementResourceAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "EngagementResourceAssociationSummaries"
+ },
+ "ListEngagements": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "EngagementSummaryList"
+ },
+ "ListResourceSnapshotJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ResourceSnapshotJobSummaries"
+ },
+ "ListResourceSnapshots": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ResourceSnapshotSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/partnercentral-selling/2022-07-26/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/partnercentral-selling/2022-07-26/service-2.json.gz
new file mode 100644
index 00000000..a692b20a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/partnercentral-selling/2022-07-26/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography-data/2022-02-03/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography-data/2022-02-03/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..06d57220
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography-data/2022-02-03/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography-data/2022-02-03/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography-data/2022-02-03/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography-data/2022-02-03/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography-data/2022-02-03/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography-data/2022-02-03/service-2.json.gz
new file mode 100644
index 00000000..5f6e8a73
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography-data/2022-02-03/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography-data/2022-02-03/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography-data/2022-02-03/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography-data/2022-02-03/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography/2021-09-14/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography/2021-09-14/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..a45cf1aa
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography/2021-09-14/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography/2021-09-14/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography/2021-09-14/paginators-1.json
new file mode 100644
index 00000000..02af499b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography/2021-09-14/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListAliases": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Aliases"
+ },
+ "ListKeys": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Keys"
+ },
+ "ListTagsForResource": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Tags"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography/2021-09-14/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography/2021-09-14/service-2.json.gz
new file mode 100644
index 00000000..30fb0218
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography/2021-09-14/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography/2021-09-14/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography/2021-09-14/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/payment-cryptography/2021-09-14/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pca-connector-ad/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/pca-connector-ad/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..fd9ec161
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pca-connector-ad/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pca-connector-ad/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/pca-connector-ad/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..89234776
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pca-connector-ad/2018-05-10/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "ListConnectors": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Connectors"
+ },
+ "ListDirectoryRegistrations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "DirectoryRegistrations"
+ },
+ "ListServicePrincipalNames": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ServicePrincipalNames"
+ },
+ "ListTemplateGroupAccessControlEntries": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AccessControlEntries"
+ },
+ "ListTemplates": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Templates"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pca-connector-ad/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/pca-connector-ad/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..d8d0e874
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pca-connector-ad/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pca-connector-scep/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/pca-connector-scep/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..19f6e349
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pca-connector-scep/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pca-connector-scep/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/pca-connector-scep/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..7a913db5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pca-connector-scep/2018-05-10/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "ListChallengeMetadata": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Challenges"
+ },
+ "ListConnectors": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Connectors"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pca-connector-scep/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/pca-connector-scep/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..9f40e719
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pca-connector-scep/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pca-connector-scep/2018-05-10/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/pca-connector-scep/2018-05-10/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pca-connector-scep/2018-05-10/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pcs/2023-02-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/pcs/2023-02-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..21ddd235
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pcs/2023-02-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pcs/2023-02-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/pcs/2023-02-10/paginators-1.json
new file mode 100644
index 00000000..555a266b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pcs/2023-02-10/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListClusters": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "clusters"
+ },
+ "ListComputeNodeGroups": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "computeNodeGroups"
+ },
+ "ListQueues": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "queues"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pcs/2023-02-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/pcs/2023-02-10/service-2.json.gz
new file mode 100644
index 00000000..f87e1f46
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pcs/2023-02-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pcs/2023-02-10/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/pcs/2023-02-10/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pcs/2023-02-10/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/personalize-events/2018-03-22/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/personalize-events/2018-03-22/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..f4c19c94
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/personalize-events/2018-03-22/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/personalize-events/2018-03-22/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/personalize-events/2018-03-22/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/personalize-events/2018-03-22/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/personalize-events/2018-03-22/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/personalize-events/2018-03-22/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/personalize-events/2018-03-22/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/personalize-events/2018-03-22/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/personalize-events/2018-03-22/service-2.json.gz
new file mode 100644
index 00000000..aa83e7a3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/personalize-events/2018-03-22/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/personalize-runtime/2018-05-22/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/personalize-runtime/2018-05-22/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..2a5a6d0e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/personalize-runtime/2018-05-22/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/personalize-runtime/2018-05-22/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/personalize-runtime/2018-05-22/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/personalize-runtime/2018-05-22/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/personalize-runtime/2018-05-22/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/personalize-runtime/2018-05-22/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/personalize-runtime/2018-05-22/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/personalize-runtime/2018-05-22/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/personalize-runtime/2018-05-22/service-2.json.gz
new file mode 100644
index 00000000..7de98ab1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/personalize-runtime/2018-05-22/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/personalize/2018-05-22/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/personalize/2018-05-22/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..6a614954
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/personalize/2018-05-22/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/personalize/2018-05-22/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/personalize/2018-05-22/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/personalize/2018-05-22/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/personalize/2018-05-22/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/personalize/2018-05-22/paginators-1.json
new file mode 100644
index 00000000..ea43852f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/personalize/2018-05-22/paginators-1.json
@@ -0,0 +1,100 @@
+{
+ "pagination": {
+ "ListCampaigns": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "campaigns"
+ },
+ "ListDatasetGroups": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "datasetGroups"
+ },
+ "ListDatasetImportJobs": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "datasetImportJobs"
+ },
+ "ListDatasets": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "datasets"
+ },
+ "ListEventTrackers": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "eventTrackers"
+ },
+ "ListRecipes": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "recipes"
+ },
+ "ListSchemas": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "schemas"
+ },
+ "ListSolutionVersions": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "solutionVersions"
+ },
+ "ListSolutions": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "solutions"
+ },
+ "ListBatchInferenceJobs": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "batchInferenceJobs"
+ },
+ "ListDatasetExportJobs": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "datasetExportJobs"
+ },
+ "ListFilters": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "Filters"
+ },
+ "ListBatchSegmentJobs": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "batchSegmentJobs"
+ },
+ "ListRecommenders": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "recommenders"
+ },
+ "ListMetricAttributionMetrics": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "metrics"
+ },
+ "ListMetricAttributions": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "metricAttributions"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/personalize/2018-05-22/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/personalize/2018-05-22/service-2.json.gz
new file mode 100644
index 00000000..bad7f036
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/personalize/2018-05-22/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pi/2018-02-27/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/pi/2018-02-27/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..982b38f3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pi/2018-02-27/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pi/2018-02-27/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/pi/2018-02-27/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pi/2018-02-27/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pi/2018-02-27/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/pi/2018-02-27/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pi/2018-02-27/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pi/2018-02-27/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/pi/2018-02-27/service-2.json.gz
new file mode 100644
index 00000000..3953cede
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pi/2018-02-27/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-email/2018-07-26/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-email/2018-07-26/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..63367167
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-email/2018-07-26/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-email/2018-07-26/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-email/2018-07-26/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-email/2018-07-26/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-email/2018-07-26/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-email/2018-07-26/paginators-1.json
new file mode 100644
index 00000000..f2693b19
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-email/2018-07-26/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "GetDedicatedIps": {
+ "input_token": "NextToken",
+ "limit_key": "PageSize",
+ "output_token": "NextToken",
+ "result_key": "DedicatedIps"
+ },
+ "ListConfigurationSets": {
+ "input_token": "NextToken",
+ "limit_key": "PageSize",
+ "output_token": "NextToken",
+ "result_key": "ConfigurationSets"
+ },
+ "ListDedicatedIpPools": {
+ "input_token": "NextToken",
+ "limit_key": "PageSize",
+ "output_token": "NextToken",
+ "result_key": "DedicatedIpPools"
+ },
+ "ListDeliverabilityTestReports": {
+ "input_token": "NextToken",
+ "limit_key": "PageSize",
+ "output_token": "NextToken",
+ "result_key": "DeliverabilityTestReports"
+ },
+ "ListEmailIdentities": {
+ "input_token": "NextToken",
+ "limit_key": "PageSize",
+ "output_token": "NextToken",
+ "result_key": "EmailIdentities"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-email/2018-07-26/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-email/2018-07-26/service-2.json.gz
new file mode 100644
index 00000000..079883d0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-email/2018-07-26/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..d1cc3591
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/paginators-1.json
new file mode 100644
index 00000000..8c4ea30e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/paginators-1.json
@@ -0,0 +1,136 @@
+{
+ "pagination": {
+ "DescribeAccountAttributes": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AccountAttributes"
+ },
+ "DescribeAccountLimits": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AccountLimits"
+ },
+ "DescribeConfigurationSets": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ConfigurationSets"
+ },
+ "DescribeKeywords": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Keywords"
+ },
+ "DescribeOptOutLists": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "OptOutLists"
+ },
+ "DescribeOptedOutNumbers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "OptedOutNumbers"
+ },
+ "DescribePhoneNumbers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "PhoneNumbers"
+ },
+ "DescribePools": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Pools"
+ },
+ "DescribeSenderIds": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SenderIds"
+ },
+ "DescribeSpendLimits": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SpendLimits"
+ },
+ "ListPoolOriginationIdentities": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "OriginationIdentities"
+ },
+ "DescribeRegistrationAttachments": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RegistrationAttachments"
+ },
+ "DescribeRegistrationFieldDefinitions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RegistrationFieldDefinitions"
+ },
+ "DescribeRegistrationFieldValues": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RegistrationFieldValues"
+ },
+ "DescribeRegistrationSectionDefinitions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RegistrationSectionDefinitions"
+ },
+ "DescribeRegistrationTypeDefinitions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RegistrationTypeDefinitions"
+ },
+ "DescribeRegistrationVersions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RegistrationVersions"
+ },
+ "DescribeRegistrations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Registrations"
+ },
+ "DescribeVerifiedDestinationNumbers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "VerifiedDestinationNumbers"
+ },
+ "ListRegistrationAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RegistrationAssociations"
+ },
+ "DescribeProtectConfigurations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ProtectConfigurations"
+ },
+ "ListProtectConfigurationRuleSetNumberOverrides": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RuleSetNumberOverrides"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..581feaa8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/paginators-1.sdk-extras.json
@@ -0,0 +1,61 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "DescribeKeywords": {
+ "non_aggregate_keys": [
+ "OriginationIdentity",
+ "OriginationIdentityArn"
+ ]
+ },
+ "DescribeRegistrationFieldDefinitions": {
+ "non_aggregate_keys": [
+ "RegistrationType"
+ ]
+ },
+ "DescribeRegistrationFieldValues": {
+ "non_aggregate_keys": [
+ "RegistrationId",
+ "RegistrationArn",
+ "VersionNumber"
+ ]
+ },
+ "DescribeRegistrationSectionDefinitions": {
+ "non_aggregate_keys": [
+ "RegistrationType"
+ ]
+ },
+ "DescribeRegistrationVersions": {
+ "non_aggregate_keys": [
+ "RegistrationId",
+ "RegistrationArn"
+ ]
+ },
+ "DescribeOptedOutNumbers": {
+ "non_aggregate_keys": [
+ "OptOutListArn",
+ "OptOutListName"
+ ]
+ },
+ "ListPoolOriginationIdentities": {
+ "non_aggregate_keys": [
+ "PoolArn",
+ "PoolId"
+ ]
+ },
+ "ListProtectConfigurationRuleSetNumberOverrides": {
+ "non_aggregate_keys": [
+ "ProtectConfigurationId",
+ "ProtectConfigurationArn"
+ ]
+ },
+ "ListRegistrationAssociations": {
+ "non_aggregate_keys": [
+ "RegistrationId",
+ "RegistrationArn",
+ "RegistrationType"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/service-2.json.gz
new file mode 100644
index 00000000..6ee51961
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice-v2/2022-03-31/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice/2018-09-05/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice/2018-09-05/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..27c14291
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice/2018-09-05/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice/2018-09-05/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice/2018-09-05/service-2.json.gz
new file mode 100644
index 00000000..9976c2de
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint-sms-voice/2018-09-05/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pinpoint/2016-12-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint/2016-12-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..ed69b115
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint/2016-12-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pinpoint/2016-12-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint/2016-12-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint/2016-12-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pinpoint/2016-12-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint/2016-12-01/service-2.json.gz
new file mode 100644
index 00000000..46c06a24
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pinpoint/2016-12-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pipes/2015-10-07/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/pipes/2015-10-07/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..8beec8a0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pipes/2015-10-07/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pipes/2015-10-07/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/pipes/2015-10-07/paginators-1.json
new file mode 100644
index 00000000..4663077c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pipes/2015-10-07/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListPipes": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "Pipes"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pipes/2015-10-07/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/pipes/2015-10-07/service-2.json.gz
new file mode 100644
index 00000000..813a4fd1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pipes/2015-10-07/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pipes/2015-10-07/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/pipes/2015-10-07/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pipes/2015-10-07/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/polly/2016-06-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/polly/2016-06-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..9a3c1365
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/polly/2016-06-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/polly/2016-06-10/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/polly/2016-06-10/examples-1.json
new file mode 100644
index 00000000..a0e354e0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/polly/2016-06-10/examples-1.json
@@ -0,0 +1,171 @@
+{
+ "version": "1.0",
+ "examples": {
+ "DeleteLexicon": [
+ {
+ "input": {
+ "Name": "example"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Deletes a specified pronunciation lexicon stored in an AWS Region.",
+ "id": "to-delete-a-lexicon-1481922498332",
+ "title": "To delete a lexicon"
+ }
+ ],
+ "DescribeVoices": [
+ {
+ "input": {
+ "LanguageCode": "en-GB"
+ },
+ "output": {
+ "Voices": [
+ {
+ "Gender": "Female",
+ "Id": "Emma",
+ "LanguageCode": "en-GB",
+ "LanguageName": "British English",
+ "Name": "Emma"
+ },
+ {
+ "Gender": "Male",
+ "Id": "Brian",
+ "LanguageCode": "en-GB",
+ "LanguageName": "British English",
+ "Name": "Brian"
+ },
+ {
+ "Gender": "Female",
+ "Id": "Amy",
+ "LanguageCode": "en-GB",
+ "LanguageName": "British English",
+ "Name": "Amy"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns the list of voices that are available for use when requesting speech synthesis. Displayed languages are those within the specified language code. If no language code is specified, voices for all available languages are displayed.",
+ "id": "to-describe-available-voices-1482180557753",
+ "title": "To describe available voices"
+ }
+ ],
+ "GetLexicon": [
+ {
+ "input": {
+ "Name": ""
+ },
+ "output": {
+ "Lexicon": {
+ "Content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<lexicon version=\"1.0\" \r\n xmlns=\"http://www.w3.org/2005/01/pronunciation-lexicon\"\r\n xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \r\n xsi:schemaLocation=\"http://www.w3.org/2005/01/pronunciation-lexicon \r\n http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd\"\r\n alphabet=\"ipa\" \r\n xml:lang=\"en-US\">\r\n <lexeme>\r\n <grapheme>W3C</grapheme>\r\n <alias>World Wide Web Consortium</alias>\r\n </lexeme>\r\n</lexicon>",
+ "Name": "example"
+ },
+ "LexiconAttributes": {
+ "Alphabet": "ipa",
+ "LanguageCode": "en-US",
+ "LastModified": 1478542980.117,
+ "LexemesCount": 1,
+ "LexiconArn": "arn:aws:polly:us-east-1:123456789012:lexicon/example",
+ "Size": 503
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns the content of the specified pronunciation lexicon stored in an AWS Region.",
+ "id": "to-retrieve-a-lexicon-1481912870836",
+ "title": "To retrieve a lexicon"
+ }
+ ],
+ "ListLexicons": [
+ {
+ "input": {
+ },
+ "output": {
+ "Lexicons": [
+ {
+ "Attributes": {
+ "Alphabet": "ipa",
+ "LanguageCode": "en-US",
+ "LastModified": 1478542980.117,
+ "LexemesCount": 1,
+ "LexiconArn": "arn:aws:polly:us-east-1:123456789012:lexicon/example",
+ "Size": 503
+ },
+ "Name": "example"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns a list of pronunciation lexicons stored in an AWS Region.",
+ "id": "to-list-all-lexicons-in-a-region-1481842106487",
+ "title": "To list all lexicons in a region"
+ }
+ ],
+ "PutLexicon": [
+ {
+ "input": {
+ "Content": "<Lexicon Content>",
+ "Name": "W3C"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Stores a pronunciation lexicon in an AWS Region.",
+ "id": "to-save-a-lexicon-1482272584088",
+ "title": "To save a lexicon"
+ }
+ ],
+ "SynthesizeSpeech": [
+ {
+ "input": {
+ "LexiconNames": [
+ "example"
+ ],
+ "OutputFormat": "mp3",
+ "SampleRate": "8000",
+ "Text": "All Gaul is divided into three parts",
+ "TextType": "text",
+ "VoiceId": "Joanna"
+ },
+ "output": {
+ "AudioStream": "TEXT",
+ "ContentType": "audio/mpeg",
+ "RequestCharacters": 37
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Synthesizes plain text or SSML into a file of human-like speech.",
+ "id": "to-synthesize-speech-1482186064046",
+ "title": "To synthesize speech"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/polly/2016-06-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/polly/2016-06-10/paginators-1.json
new file mode 100644
index 00000000..dc76e7c1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/polly/2016-06-10/paginators-1.json
@@ -0,0 +1,20 @@
+{
+ "pagination": {
+ "DescribeVoices": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Voices"
+ },
+ "ListLexicons": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Lexicons"
+ },
+ "ListSpeechSynthesisTasks": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "SynthesisTasks"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/polly/2016-06-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/polly/2016-06-10/service-2.json.gz
new file mode 100644
index 00000000..b877b807
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/polly/2016-06-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pricing/2017-10-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/pricing/2017-10-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..10cf20cc
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pricing/2017-10-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pricing/2017-10-15/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/pricing/2017-10-15/examples-1.json
new file mode 100644
index 00000000..abc1c59f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pricing/2017-10-15/examples-1.json
@@ -0,0 +1,104 @@
+{
+ "version": "1.0",
+ "examples": {
+ "DescribeServices": [
+ {
+ "input": {
+ "FormatVersion": "aws_v1",
+ "MaxResults": 1,
+ "ServiceCode": "AmazonEC2"
+ },
+ "output": {
+ "FormatVersion": "aws_v1",
+ "NextToken": "abcdefg123",
+ "Services": [
+ {
+ "AttributeNames": [
+ "volumeType",
+ "maxIopsvolume",
+ "instanceCapacity10xlarge",
+ "locationType",
+ "operation"
+ ],
+ "ServiceCode": "AmazonEC2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Retrieves the service for the given Service Code.",
+ "id": "to-retrieve-service-metadata",
+ "title": "To retrieve a list of services and service codes"
+ }
+ ],
+ "GetAttributeValues": [
+ {
+ "input": {
+ "AttributeName": "volumeType",
+ "MaxResults": 2,
+ "ServiceCode": "AmazonEC2"
+ },
+ "output": {
+ "AttributeValues": [
+ {
+ "Value": "Throughput Optimized HDD"
+ },
+ {
+ "Value": "Provisioned IOPS"
+ }
+ ],
+ "NextToken": "GpgauEXAMPLEezucl5LV0w==:7GzYJ0nw0DBTJ2J66EoTIIynE6O1uXwQtTRqioJzQadBnDVgHPzI1en4BUQnPCLpzeBk9RQQAWaFieA4+DapFAGLgk+Z/9/cTw9GldnPOHN98+FdmJP7wKU3QQpQ8MQr5KOeBkIsAqvAQYdL0DkL7tHwPtE5iCEByAmg9gcC/yBU1vAOsf7R3VaNN4M5jMDv3woSWqASSIlBVB6tgW78YL22KhssoItM/jWW+aP6Jqtq4mldxp/ct6DWAl+xLFwHU/CbketimPPXyqHF3/UXDw=="
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation returns a list of values available for the given attribute.",
+ "id": "to-retreive-attribute-values",
+ "title": "To retrieve a list of attribute values"
+ }
+ ],
+ "GetProducts": [
+ {
+ "input": {
+ "Filters": [
+ {
+ "Field": "ServiceCode",
+ "Type": "TERM_MATCH",
+ "Value": "AmazonEC2"
+ },
+ {
+ "Field": "volumeType",
+ "Type": "TERM_MATCH",
+ "Value": "Provisioned IOPS"
+ }
+ ],
+ "FormatVersion": "aws_v1",
+ "MaxResults": 1
+ },
+ "output": {
+ "FormatVersion": "aws_v1",
+ "NextToken": "57r3EXAMPLEujbzWfHF7Ciw==:ywSmZsD3mtpQmQLQ5XfOsIMkYybSj+vAT+kGmwMFq+K9DGmIoJkz7lunVeamiOPgthdWSO2a7YKojCO+zY4dJmuNl2QvbNhXs+AJ2Ufn7xGmJncNI2TsEuAsVCUfTAvAQNcwwamtk6XuZ4YdNnooV62FjkV3ZAn40d9+wAxV7+FImvhUHi/+f8afgZdGh2zPUlH8jlV9uUtj0oHp8+DhPUuHXh+WBII1E/aoKpPSm3c=",
+ "PriceList": [
+ "{\"product\":{\"productFamily\":\"Storage\",\"attributes\":{\"storageMedia\":\"SSD-backed\",\"maxThroughputvolume\":\"320 MB/sec\",\"volumeType\":\"Provisioned IOPS\",\"maxIopsvolume\":\"20000\",\"servicecode\":\"AmazonEC2\",\"usagetype\":\"CAN1-EBS:VolumeUsage.piops\",\"locationType\":\"AWS Region\",\"location\":\"Canada (Central)\",\"servicename\":\"Amazon Elastic Compute Cloud\",\"maxVolumeSize\":\"16 TiB\",\"operation\":\"\"},\"sku\":\"WQGC34PB2AWS8R4U\"},\"serviceCode\":\"AmazonEC2\",\"terms\":{\"OnDemand\":{\"WQGC34PB2AWS8R4U.JRTCKXETXF\":{\"priceDimensions\":{\"WQGC34PB2AWS8R4U.JRTCKXETXF.6YS6EN2CT7\":{\"unit\":\"GB-Mo\",\"endRange\":\"Inf\",\"description\":\"$0.138 per GB-month of Provisioned IOPS SSD (io1) provisioned storage - Canada (Central)\",\"appliesTo\":[],\"rateCode\":\"WQGC34PB2AWS8R4U.JRTCKXETXF.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1380000000\"}}},\"sku\":\"WQGC34PB2AWS8R4U\",\"effectiveDate\":\"2017-08-01T00:00:00Z\",\"offerTermCode\":\"JRTCKXETXF\",\"termAttributes\":{}}}},\"version\":\"20170901182201\",\"publicationDate\":\"2017-09-01T18:22:01Z\"}"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation returns a list of products that match the given criteria.",
+ "id": "to-retrieve-available products",
+ "title": "To retrieve a list of products"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pricing/2017-10-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/pricing/2017-10-15/paginators-1.json
new file mode 100644
index 00000000..0f2ce4e8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pricing/2017-10-15/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "DescribeServices": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Services",
+ "non_aggregate_keys": [
+ "FormatVersion"
+ ]
+ },
+ "GetAttributeValues": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AttributeValues"
+ },
+ "GetProducts": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "PriceList",
+ "non_aggregate_keys": [
+ "FormatVersion"
+ ]
+ },
+ "ListPriceLists": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "PriceLists"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pricing/2017-10-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/pricing/2017-10-15/service-2.json.gz
new file mode 100644
index 00000000..b732310c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pricing/2017-10-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/pricing/2017-10-15/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/pricing/2017-10-15/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/pricing/2017-10-15/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/privatenetworks/2021-12-03/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/privatenetworks/2021-12-03/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..c608eeef
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/privatenetworks/2021-12-03/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/privatenetworks/2021-12-03/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/privatenetworks/2021-12-03/paginators-1.json
new file mode 100644
index 00000000..8b7d279c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/privatenetworks/2021-12-03/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "ListDeviceIdentifiers": {
+ "input_token": "startToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "deviceIdentifiers"
+ },
+ "ListNetworkResources": {
+ "input_token": "startToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "networkResources"
+ },
+ "ListNetworkSites": {
+ "input_token": "startToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "networkSites"
+ },
+ "ListNetworks": {
+ "input_token": "startToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "networks"
+ },
+ "ListOrders": {
+ "input_token": "startToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "orders"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/privatenetworks/2021-12-03/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/privatenetworks/2021-12-03/service-2.json.gz
new file mode 100644
index 00000000..a2193b96
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/privatenetworks/2021-12-03/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/proton/2020-07-20/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/proton/2020-07-20/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..70b86ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/proton/2020-07-20/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/proton/2020-07-20/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/proton/2020-07-20/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/proton/2020-07-20/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/proton/2020-07-20/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/proton/2020-07-20/paginators-1.json
new file mode 100644
index 00000000..a52075c4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/proton/2020-07-20/paginators-1.json
@@ -0,0 +1,121 @@
+{
+ "pagination": {
+ "ListEnvironmentAccountConnections": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "environmentAccountConnections"
+ },
+ "ListEnvironmentTemplateVersions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "templateVersions"
+ },
+ "ListEnvironmentTemplates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "templates"
+ },
+ "ListEnvironments": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "environments"
+ },
+ "ListServiceInstances": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "serviceInstances"
+ },
+ "ListServiceTemplateVersions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "templateVersions"
+ },
+ "ListServiceTemplates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "templates"
+ },
+ "ListServices": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "services"
+ },
+ "ListTagsForResource": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "tags"
+ },
+ "ListEnvironmentOutputs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "outputs"
+ },
+ "ListEnvironmentProvisionedResources": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "provisionedResources"
+ },
+ "ListRepositories": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "repositories"
+ },
+ "ListRepositorySyncDefinitions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "syncDefinitions"
+ },
+ "ListServiceInstanceOutputs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "outputs"
+ },
+ "ListServiceInstanceProvisionedResources": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "provisionedResources"
+ },
+ "ListServicePipelineOutputs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "outputs"
+ },
+ "ListServicePipelineProvisionedResources": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "provisionedResources"
+ },
+ "ListComponentOutputs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "outputs"
+ },
+ "ListComponentProvisionedResources": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "provisionedResources"
+ },
+ "ListComponents": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "components"
+ },
+ "ListDeployments": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "deployments"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/proton/2020-07-20/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/proton/2020-07-20/service-2.json.gz
new file mode 100644
index 00000000..e99c2e7a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/proton/2020-07-20/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/proton/2020-07-20/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/proton/2020-07-20/waiters-2.json
new file mode 100644
index 00000000..f99a6fe3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/proton/2020-07-20/waiters-2.json
@@ -0,0 +1,208 @@
+{
+ "version" : 2,
+ "waiters" : {
+ "ComponentDeleted" : {
+ "description" : "Wait until a Component is deleted. Use this after invoking DeleteComponent",
+ "delay" : 5,
+ "maxAttempts" : 999,
+ "operation" : "GetComponent",
+ "acceptors" : [ {
+ "matcher" : "error",
+ "state" : "success",
+ "expected" : "ResourceNotFoundException"
+ }, {
+ "matcher" : "path",
+ "argument" : "component.deploymentStatus",
+ "state" : "failure",
+ "expected" : "DELETE_FAILED"
+ } ]
+ },
+ "ComponentDeployed" : {
+ "description" : "Wait until a Component is deployed. Use this after invoking CreateComponent or UpdateComponent",
+ "delay" : 5,
+ "maxAttempts" : 999,
+ "operation" : "GetComponent",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "component.deploymentStatus",
+ "state" : "success",
+ "expected" : "SUCCEEDED"
+ }, {
+ "matcher" : "path",
+ "argument" : "component.deploymentStatus",
+ "state" : "failure",
+ "expected" : "FAILED"
+ } ]
+ },
+ "EnvironmentDeployed" : {
+ "description" : "Wait until an Environment is deployed. Use this after invoking CreateEnvironment or UpdateEnvironment",
+ "delay" : 5,
+ "maxAttempts" : 999,
+ "operation" : "GetEnvironment",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "environment.deploymentStatus",
+ "state" : "success",
+ "expected" : "SUCCEEDED"
+ }, {
+ "matcher" : "path",
+ "argument" : "environment.deploymentStatus",
+ "state" : "failure",
+ "expected" : "FAILED"
+ } ]
+ },
+ "EnvironmentTemplateVersionRegistered" : {
+ "description" : "Wait until an EnvironmentTemplateVersion is registered. Use this after invoking CreateEnvironmentTemplateVersion",
+ "delay" : 2,
+ "maxAttempts" : 150,
+ "operation" : "GetEnvironmentTemplateVersion",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "environmentTemplateVersion.status",
+ "state" : "success",
+ "expected" : "DRAFT"
+ }, {
+ "matcher" : "path",
+ "argument" : "environmentTemplateVersion.status",
+ "state" : "success",
+ "expected" : "PUBLISHED"
+ }, {
+ "matcher" : "path",
+ "argument" : "environmentTemplateVersion.status",
+ "state" : "failure",
+ "expected" : "REGISTRATION_FAILED"
+ } ]
+ },
+ "ServiceCreated" : {
+ "description" : "Wait until an Service has deployed its instances and possibly pipeline. Use this after invoking CreateService",
+ "delay" : 5,
+ "maxAttempts" : 999,
+ "operation" : "GetService",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "service.status",
+ "state" : "success",
+ "expected" : "ACTIVE"
+ }, {
+ "matcher" : "path",
+ "argument" : "service.status",
+ "state" : "failure",
+ "expected" : "CREATE_FAILED_CLEANUP_COMPLETE"
+ }, {
+ "matcher" : "path",
+ "argument" : "service.status",
+ "state" : "failure",
+ "expected" : "CREATE_FAILED_CLEANUP_FAILED"
+ }, {
+ "matcher" : "path",
+ "argument" : "service.status",
+ "state" : "failure",
+ "expected" : "CREATE_FAILED"
+ } ]
+ },
+ "ServiceDeleted" : {
+ "description" : "Wait until a Service, its instances, and possibly pipeline have been deleted after DeleteService is invoked",
+ "delay" : 5,
+ "maxAttempts" : 999,
+ "operation" : "GetService",
+ "acceptors" : [ {
+ "matcher" : "error",
+ "state" : "success",
+ "expected" : "ResourceNotFoundException"
+ }, {
+ "matcher" : "path",
+ "argument" : "service.status",
+ "state" : "failure",
+ "expected" : "DELETE_FAILED"
+ } ]
+ },
+ "ServiceInstanceDeployed" : {
+ "description" : "Wait until a ServiceInstance is deployed. Use this after invoking CreateService or UpdateServiceInstance",
+ "delay" : 5,
+ "maxAttempts" : 999,
+ "operation" : "GetServiceInstance",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "serviceInstance.deploymentStatus",
+ "state" : "success",
+ "expected" : "SUCCEEDED"
+ }, {
+ "matcher" : "path",
+ "argument" : "serviceInstance.deploymentStatus",
+ "state" : "failure",
+ "expected" : "FAILED"
+ } ]
+ },
+ "ServicePipelineDeployed" : {
+ "description" : "Wait until an ServicePipeline is deployed. Use this after invoking CreateService or UpdateServicePipeline",
+ "delay" : 10,
+ "maxAttempts" : 360,
+ "operation" : "GetService",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "service.pipeline.deploymentStatus",
+ "state" : "success",
+ "expected" : "SUCCEEDED"
+ }, {
+ "matcher" : "path",
+ "argument" : "service.pipeline.deploymentStatus",
+ "state" : "failure",
+ "expected" : "FAILED"
+ } ]
+ },
+ "ServiceTemplateVersionRegistered" : {
+ "description" : "Wait until a ServiceTemplateVersion is registered. Use this after invoking CreateServiceTemplateVersion",
+ "delay" : 2,
+ "maxAttempts" : 150,
+ "operation" : "GetServiceTemplateVersion",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "serviceTemplateVersion.status",
+ "state" : "success",
+ "expected" : "DRAFT"
+ }, {
+ "matcher" : "path",
+ "argument" : "serviceTemplateVersion.status",
+ "state" : "success",
+ "expected" : "PUBLISHED"
+ }, {
+ "matcher" : "path",
+ "argument" : "serviceTemplateVersion.status",
+ "state" : "failure",
+ "expected" : "REGISTRATION_FAILED"
+ } ]
+ },
+ "ServiceUpdated" : {
+ "description" : "Wait until a Service, its instances, and possibly pipeline have been deployed after UpdateService is invoked",
+ "delay" : 5,
+ "maxAttempts" : 999,
+ "operation" : "GetService",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "service.status",
+ "state" : "success",
+ "expected" : "ACTIVE"
+ }, {
+ "matcher" : "path",
+ "argument" : "service.status",
+ "state" : "failure",
+ "expected" : "UPDATE_FAILED_CLEANUP_COMPLETE"
+ }, {
+ "matcher" : "path",
+ "argument" : "service.status",
+ "state" : "failure",
+ "expected" : "UPDATE_FAILED_CLEANUP_FAILED"
+ }, {
+ "matcher" : "path",
+ "argument" : "service.status",
+ "state" : "failure",
+ "expected" : "UPDATE_FAILED"
+ }, {
+ "matcher" : "path",
+ "argument" : "service.status",
+ "state" : "failure",
+ "expected" : "UPDATE_COMPLETE_CLEANUP_FAILED"
+ } ]
+ }
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/qapps/2023-11-27/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/qapps/2023-11-27/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..6a9612c6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/qapps/2023-11-27/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/qapps/2023-11-27/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/qapps/2023-11-27/paginators-1.json
new file mode 100644
index 00000000..0d13e6c2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/qapps/2023-11-27/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "ListLibraryItems": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "limit",
+ "result_key": "libraryItems"
+ },
+ "ListQApps": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "limit",
+ "result_key": "apps"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/qapps/2023-11-27/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/qapps/2023-11-27/service-2.json.gz
new file mode 100644
index 00000000..7e82b71c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/qapps/2023-11-27/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/qapps/2023-11-27/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/qapps/2023-11-27/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/qapps/2023-11-27/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/qbusiness/2023-11-27/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/qbusiness/2023-11-27/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..a6e7f110
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/qbusiness/2023-11-27/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/qbusiness/2023-11-27/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/qbusiness/2023-11-27/paginators-1.json
new file mode 100644
index 00000000..16c9a5f3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/qbusiness/2023-11-27/paginators-1.json
@@ -0,0 +1,118 @@
+{
+ "pagination": {
+ "GetChatControlsConfiguration": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "topicConfigurations"
+ },
+ "ListApplications": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "applications"
+ },
+ "ListConversations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "conversations"
+ },
+ "ListDataSourceSyncJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "history"
+ },
+ "ListDataSources": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "dataSources"
+ },
+ "ListDocuments": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "documentDetailList"
+ },
+ "ListGroups": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListIndices": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "indices"
+ },
+ "ListMessages": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "messages"
+ },
+ "ListPlugins": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "plugins"
+ },
+ "ListRetrievers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "retrievers"
+ },
+ "ListWebExperiences": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "webExperiences"
+ },
+ "ListAttachments": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "attachments"
+ },
+ "ListDataAccessors": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "dataAccessors"
+ },
+ "ListPluginActions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListPluginTypeActions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListPluginTypeMetadata": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "SearchRelevantContent": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "relevantContent"
+ },
+ "ListSubscriptions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "subscriptions"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/qbusiness/2023-11-27/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/qbusiness/2023-11-27/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..5bb16e2f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/qbusiness/2023-11-27/paginators-1.sdk-extras.json
@@ -0,0 +1,15 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "GetChatControlsConfiguration": {
+ "non_aggregate_keys": [
+ "responseScope",
+ "blockedPhrases",
+ "creatorModeConfiguration",
+ "orchestrationConfiguration"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/qbusiness/2023-11-27/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/qbusiness/2023-11-27/service-2.json.gz
new file mode 100644
index 00000000..569dc6a4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/qbusiness/2023-11-27/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/qbusiness/2023-11-27/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/qbusiness/2023-11-27/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/qbusiness/2023-11-27/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/qconnect/2020-10-19/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/qconnect/2020-10-19/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..2d2f2eb8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/qconnect/2020-10-19/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/qconnect/2020-10-19/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/qconnect/2020-10-19/paginators-1.json
new file mode 100644
index 00000000..53ae6921
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/qconnect/2020-10-19/paginators-1.json
@@ -0,0 +1,130 @@
+{
+ "pagination": {
+ "ListAssistantAssociations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "assistantAssociationSummaries"
+ },
+ "ListAssistants": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "assistantSummaries"
+ },
+ "ListContents": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "contentSummaries"
+ },
+ "ListImportJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "importJobSummaries"
+ },
+ "ListKnowledgeBases": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "knowledgeBaseSummaries"
+ },
+ "ListQuickResponses": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "quickResponseSummaries"
+ },
+ "QueryAssistant": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "results"
+ },
+ "SearchContent": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "contentSummaries"
+ },
+ "SearchQuickResponses": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "results"
+ },
+ "SearchSessions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "sessionSummaries"
+ },
+ "ListContentAssociations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "contentAssociationSummaries"
+ },
+ "ListAIAgentVersions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "aiAgentVersionSummaries"
+ },
+ "ListAIAgents": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "aiAgentSummaries"
+ },
+ "ListAIPromptVersions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "aiPromptVersionSummaries"
+ },
+ "ListAIPrompts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "aiPromptSummaries"
+ },
+ "ListMessageTemplateVersions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "messageTemplateVersionSummaries"
+ },
+ "ListMessageTemplates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "messageTemplateSummaries"
+ },
+ "SearchMessageTemplates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "results"
+ },
+ "ListAIGuardrailVersions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "aiGuardrailVersionSummaries"
+ },
+ "ListAIGuardrails": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "aiGuardrailSummaries"
+ },
+ "ListMessages": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "messages"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/qconnect/2020-10-19/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/qconnect/2020-10-19/service-2.json.gz
new file mode 100644
index 00000000..421562f3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/qconnect/2020-10-19/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/qldb-session/2019-07-11/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/qldb-session/2019-07-11/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..5cad2605
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/qldb-session/2019-07-11/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/qldb-session/2019-07-11/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/qldb-session/2019-07-11/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/qldb-session/2019-07-11/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/qldb-session/2019-07-11/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/qldb-session/2019-07-11/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/qldb-session/2019-07-11/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/qldb-session/2019-07-11/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/qldb-session/2019-07-11/service-2.json.gz
new file mode 100644
index 00000000..fcfea857
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/qldb-session/2019-07-11/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/qldb/2019-01-02/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/qldb/2019-01-02/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b34d85ee
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/qldb/2019-01-02/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/qldb/2019-01-02/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/qldb/2019-01-02/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/qldb/2019-01-02/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/qldb/2019-01-02/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/qldb/2019-01-02/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/qldb/2019-01-02/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/qldb/2019-01-02/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/qldb/2019-01-02/service-2.json.gz
new file mode 100644
index 00000000..bfcde9aa
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/qldb/2019-01-02/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/quicksight/2018-04-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/quicksight/2018-04-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..bcc596da
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/quicksight/2018-04-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/quicksight/2018-04-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/quicksight/2018-04-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/quicksight/2018-04-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/quicksight/2018-04-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/quicksight/2018-04-01/paginators-1.json
new file mode 100644
index 00000000..0312ed2f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/quicksight/2018-04-01/paginators-1.json
@@ -0,0 +1,214 @@
+{
+ "pagination": {
+ "ListAnalyses": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AnalysisSummaryList"
+ },
+ "ListDashboardVersions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "DashboardVersionSummaryList"
+ },
+ "ListDashboards": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "DashboardSummaryList"
+ },
+ "ListDataSets": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "DataSetSummaries"
+ },
+ "ListDataSources": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "DataSources"
+ },
+ "ListIngestions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Ingestions"
+ },
+ "ListNamespaces": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Namespaces"
+ },
+ "ListTemplateAliases": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "TemplateAliasList"
+ },
+ "ListTemplateVersions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "TemplateVersionSummaryList"
+ },
+ "ListTemplates": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "TemplateSummaryList"
+ },
+ "ListThemeVersions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ThemeVersionSummaryList"
+ },
+ "ListThemes": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ThemeSummaryList"
+ },
+ "SearchAnalyses": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AnalysisSummaryList"
+ },
+ "SearchDashboards": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "DashboardSummaryList"
+ },
+ "SearchDataSets": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "DataSetSummaries"
+ },
+ "SearchDataSources": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "DataSourceSummaries"
+ },
+ "ListAssetBundleExportJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AssetBundleExportJobSummaryList"
+ },
+ "ListAssetBundleImportJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AssetBundleImportJobSummaryList"
+ },
+ "ListGroupMemberships": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "GroupMemberList"
+ },
+ "ListGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "GroupList"
+ },
+ "ListIAMPolicyAssignments": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "IAMPolicyAssignments"
+ },
+ "ListIAMPolicyAssignmentsForUser": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ActiveAssignments"
+ },
+ "ListUserGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "GroupList"
+ },
+ "ListUsers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "UserList"
+ },
+ "SearchGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "GroupList"
+ },
+ "DescribeFolderPermissions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Permissions"
+ },
+ "DescribeFolderResolvedPermissions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Permissions"
+ },
+ "ListFolderMembers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "FolderMemberList"
+ },
+ "ListFolders": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "FolderSummaryList"
+ },
+ "SearchFolders": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "FolderSummaryList"
+ },
+ "ListRoleMemberships": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "MembersList"
+ },
+ "ListFoldersForResource": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Folders"
+ },
+ "ListBrands": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Brands"
+ },
+ "ListCustomPermissions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "CustomPermissionsList"
+ },
+ "SearchTopics": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "TopicSummaryList"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/quicksight/2018-04-01/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/quicksight/2018-04-01/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..d056600e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/quicksight/2018-04-01/paginators-1.sdk-extras.json
@@ -0,0 +1,215 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "ListAnalyses": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListDashboardVersions": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListTemplateAliases": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListTemplateVersions": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListTemplates": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListThemeVersions": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListThemes": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "SearchAnalyses": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "SearchDashboards": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "SearchDataSets": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "SearchDataSources": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListNamespaces": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListIngestions": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListDataSources": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListDataSets": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListDashboards": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListAssetBundleExportJobs": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListAssetBundleImportJobs": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListGroupMemberships": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListGroups": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListIAMPolicyAssignments": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListIAMPolicyAssignmentsForUser": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListUserGroups": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListUsers": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "SearchGroups": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListFolders": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListFolderMembers": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "SearchFolders": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "DescribeFolderPermissions": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId",
+ "Arn",
+ "FolderId"
+ ]
+ },
+ "DescribeFolderResolvedPermissions": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId",
+ "Arn",
+ "FolderId"
+ ]
+ },
+ "ListRoleMemberships": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListFoldersForResource": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "ListCustomPermissions": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ },
+ "SearchTopics": {
+ "non_aggregate_keys": [
+ "Status",
+ "RequestId"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/quicksight/2018-04-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/quicksight/2018-04-01/service-2.json.gz
new file mode 100644
index 00000000..e76f8de3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/quicksight/2018-04-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ram/2018-01-04/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ram/2018-01-04/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..09a4608f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ram/2018-01-04/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ram/2018-01-04/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ram/2018-01-04/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ram/2018-01-04/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ram/2018-01-04/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ram/2018-01-04/paginators-1.json
new file mode 100644
index 00000000..ec438a09
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ram/2018-01-04/paginators-1.json
@@ -0,0 +1,40 @@
+{
+ "pagination": {
+ "GetResourcePolicies": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "policies"
+ },
+ "GetResourceShareAssociations": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "resourceShareAssociations"
+ },
+ "GetResourceShareInvitations": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "resourceShareInvitations"
+ },
+ "GetResourceShares": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "resourceShares"
+ },
+ "ListPrincipals": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "principals"
+ },
+ "ListResources": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "resources"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ram/2018-01-04/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ram/2018-01-04/service-2.json.gz
new file mode 100644
index 00000000..136ea680
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ram/2018-01-04/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rbin/2021-06-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/rbin/2021-06-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..c979dbcc
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rbin/2021-06-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rbin/2021-06-15/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/rbin/2021-06-15/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rbin/2021-06-15/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rbin/2021-06-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/rbin/2021-06-15/paginators-1.json
new file mode 100644
index 00000000..bdbfafb4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rbin/2021-06-15/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListRules": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Rules"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rbin/2021-06-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/rbin/2021-06-15/service-2.json.gz
new file mode 100644
index 00000000..911ef02f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rbin/2021-06-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rds-data/2018-08-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/rds-data/2018-08-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..670f0168
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rds-data/2018-08-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rds-data/2018-08-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/rds-data/2018-08-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rds-data/2018-08-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rds-data/2018-08-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/rds-data/2018-08-01/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rds-data/2018-08-01/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rds-data/2018-08-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/rds-data/2018-08-01/service-2.json.gz
new file mode 100644
index 00000000..ebd6c65e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rds-data/2018-08-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-09-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-09-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..525cf35c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-09-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-09-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-09-01/paginators-1.json
new file mode 100644
index 00000000..76c4f3a1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-09-01/paginators-1.json
@@ -0,0 +1,107 @@
+{
+ "pagination": {
+ "DescribeDBEngineVersions": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "DBEngineVersions"
+ },
+ "DescribeDBInstances": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "DBInstances"
+ },
+ "DescribeDBLogFiles": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "DescribeDBLogFiles"
+ },
+ "DescribeDBParameterGroups": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "DBParameterGroups"
+ },
+ "DescribeDBParameters": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "Parameters"
+ },
+ "DescribeDBSecurityGroups": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "DBSecurityGroups"
+ },
+ "DescribeDBSnapshots": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "DBSnapshots"
+ },
+ "DescribeDBSubnetGroups": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "DBSubnetGroups"
+ },
+ "DescribeEngineDefaultParameters": {
+ "input_token": "Marker",
+ "output_token": "EngineDefaults.Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "EngineDefaults.Parameters"
+ },
+ "DescribeEventSubscriptions": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "EventSubscriptionsList"
+ },
+ "DescribeEvents": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "Events"
+ },
+ "DescribeOptionGroupOptions": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "OptionGroupOptions"
+ },
+ "DescribeOptionGroups": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "OptionGroupsList"
+ },
+ "DescribeOrderableDBInstanceOptions": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "OrderableDBInstanceOptions"
+ },
+ "DescribeReservedDBInstances": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "ReservedDBInstances"
+ },
+ "DescribeReservedDBInstancesOfferings": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "ReservedDBInstancesOfferings"
+ },
+ "DownloadDBLogFilePortion": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "NumberOfLines",
+ "more_results": "AdditionalDataPending",
+ "result_key": "LogFileData"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-09-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-09-01/service-2.json.gz
new file mode 100644
index 00000000..f729875d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-09-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-09-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-09-01/waiters-2.json
new file mode 100644
index 00000000..b0150079
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-09-01/waiters-2.json
@@ -0,0 +1,97 @@
+{
+ "version": 2,
+ "waiters": {
+ "DBInstanceAvailable": {
+ "delay": 30,
+ "operation": "DescribeDBInstances",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "incompatible-restore",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "incompatible-parameters",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "incompatible-parameters",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "incompatible-restore",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ }
+ ]
+ },
+ "DBInstanceDeleted": {
+ "delay": 30,
+ "operation": "DescribeDBInstances",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "deleted",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "creating",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "modifying",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "rebooting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "resetting-master-credentials",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..5bff65a6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/examples-1.json
new file mode 100644
index 00000000..e72a328e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/examples-1.json
@@ -0,0 +1,1951 @@
+{
+ "version": "1.0",
+ "examples": {
+ "AddSourceIdentifierToSubscription": [
+ {
+ "input": {
+ "SourceIdentifier": "mymysqlinstance",
+ "SubscriptionName": "mymysqleventsubscription"
+ },
+ "output": {
+ "EventSubscription": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example add a source identifier to an event notification subscription.",
+ "id": "add-source-identifier-to-subscription-93fb6a15-0a59-4577-a7b5-e12db9752c14",
+ "title": "To add a source identifier to an event notification subscription"
+ }
+ ],
+ "AddTagsToResource": [
+ {
+ "input": {
+ "ResourceName": "arn:aws:rds:us-east-1:992648334831:og:mymysqloptiongroup",
+ "Tags": [
+ {
+ "Key": "Staging",
+ "Value": "LocationDB"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example adds a tag to an option group.",
+ "id": "add-tags-to-resource-fa99ef50-228b-449d-b893-ca4d4e9768ab",
+ "title": "To add tags to a resource"
+ }
+ ],
+ "ApplyPendingMaintenanceAction": [
+ {
+ "input": {
+ "ApplyAction": "system-update",
+ "OptInType": "immediate",
+ "ResourceIdentifier": "arn:aws:rds:us-east-1:992648334831:db:mymysqlinstance"
+ },
+ "output": {
+ "ResourcePendingMaintenanceActions": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example immediately applies a pending system update to a DB instance.",
+ "id": "apply-pending-maintenance-action-2a026047-8bbb-47fc-b695-abad9f308c24",
+ "title": "To apply a pending maintenance action"
+ }
+ ],
+ "AuthorizeDBSecurityGroupIngress": [
+ {
+ "input": {
+ "CIDRIP": "203.0.113.5/32",
+ "DBSecurityGroupName": "mydbsecuritygroup"
+ },
+ "output": {
+ "DBSecurityGroup": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example authorizes access to the specified security group by the specified CIDR block.",
+ "id": "authorize-db-security-group-ingress-ebf9ab91-8912-4b07-a32e-ca150668164f",
+ "title": "To authorize DB security group integress"
+ }
+ ],
+ "CopyDBClusterParameterGroup": [
+ {
+ "input": {
+ "SourceDBClusterParameterGroupIdentifier": "mydbclusterparametergroup",
+ "TargetDBClusterParameterGroupDescription": "My DB cluster parameter group copy",
+ "TargetDBClusterParameterGroupIdentifier": "mydbclusterparametergroup-copy"
+ },
+ "output": {
+ "DBClusterParameterGroup": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example copies a DB cluster parameter group.",
+ "id": "copy-db-cluster-parameter-group-6fefaffe-cde9-4dba-9f0b-d3f593572fe4",
+ "title": "To copy a DB cluster parameter group"
+ }
+ ],
+ "CopyDBClusterSnapshot": [
+ {
+ "input": {
+ "SourceDBClusterSnapshotIdentifier": "rds:sample-cluster-2016-09-14-10-38",
+ "TargetDBClusterSnapshotIdentifier": "cluster-snapshot-copy-1"
+ },
+ "output": {
+ "DBClusterSnapshot": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example copies an automated snapshot of a DB cluster to a new DB cluster snapshot.",
+ "id": "to-copy-a-db-cluster-snapshot-1473879770564",
+ "title": "To copy a DB cluster snapshot"
+ }
+ ],
+ "CopyDBParameterGroup": [
+ {
+ "input": {
+ "SourceDBParameterGroupIdentifier": "mymysqlparametergroup",
+ "TargetDBParameterGroupDescription": "My MySQL parameter group copy",
+ "TargetDBParameterGroupIdentifier": "mymysqlparametergroup-copy"
+ },
+ "output": {
+ "DBParameterGroup": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example copies a DB parameter group.",
+ "id": "copy-db-parameter-group-610d4dba-2c87-467f-ae5d-edd7f8e47349",
+ "title": "To copy a DB parameter group"
+ }
+ ],
+ "CopyDBSnapshot": [
+ {
+ "input": {
+ "SourceDBSnapshotIdentifier": "mydbsnapshot",
+ "TargetDBSnapshotIdentifier": "mydbsnapshot-copy"
+ },
+ "output": {
+ "DBSnapshot": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example copies a DB snapshot.",
+ "id": "copy-db-snapshot-1b2f0210-bc67-415d-9822-6eecf447dc86",
+ "title": "To copy a DB snapshot"
+ }
+ ],
+ "CopyOptionGroup": [
+ {
+ "input": {
+ "SourceOptionGroupIdentifier": "mymysqloptiongroup",
+ "TargetOptionGroupDescription": "My MySQL option group copy",
+ "TargetOptionGroupIdentifier": "mymysqloptiongroup-copy"
+ },
+ "output": {
+ "OptionGroup": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example copies an option group.",
+ "id": "copy-option-group-8d5c01c3-8846-4e9c-a4b0-1b7237f7d0ec",
+ "title": "To copy an option group"
+ }
+ ],
+ "CreateDBCluster": [
+ {
+ "input": {
+ "AvailabilityZones": [
+ "us-east-1a"
+ ],
+ "BackupRetentionPeriod": 1,
+ "DBClusterIdentifier": "mydbcluster",
+ "DBClusterParameterGroupName": "mydbclusterparametergroup",
+ "DatabaseName": "myauroradb",
+ "Engine": "aurora",
+ "EngineVersion": "5.6.10a",
+ "MasterUserPassword": "mypassword",
+ "MasterUsername": "myuser",
+ "Port": 3306,
+ "StorageEncrypted": true
+ },
+ "output": {
+ "DBCluster": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a DB cluster.",
+ "id": "create-db-cluster-423b998d-eba9-40dd-8e19-96c5b6e5f31d",
+ "title": "To create a DB cluster"
+ }
+ ],
+ "CreateDBClusterParameterGroup": [
+ {
+ "input": {
+ "DBClusterParameterGroupName": "mydbclusterparametergroup",
+ "DBParameterGroupFamily": "aurora5.6",
+ "Description": "My DB cluster parameter group"
+ },
+ "output": {
+ "DBClusterParameterGroup": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a DB cluster parameter group.",
+ "id": "create-db-cluster-parameter-group-8eb1c3ae-1965-4262-afe3-ee134c4430b1",
+ "title": "To create a DB cluster parameter group"
+ }
+ ],
+ "CreateDBClusterSnapshot": [
+ {
+ "input": {
+ "DBClusterIdentifier": "mydbcluster",
+ "DBClusterSnapshotIdentifier": "mydbclustersnapshot"
+ },
+ "output": {
+ "DBClusterSnapshot": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a DB cluster snapshot.",
+ "id": "create-db-cluster-snapshot-",
+ "title": "To create a DB cluster snapshot"
+ }
+ ],
+ "CreateDBInstance": [
+ {
+ "input": {
+ "AllocatedStorage": 5,
+ "DBInstanceClass": "db.t2.micro",
+ "DBInstanceIdentifier": "mymysqlinstance",
+ "Engine": "MySQL",
+ "MasterUserPassword": "MyPassword",
+ "MasterUsername": "MyUser"
+ },
+ "output": {
+ "DBInstance": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a DB instance.",
+ "id": "create-db-instance-57eb5d16-8bf8-4c84-9709-1700322b37b9",
+ "title": "To create a DB instance."
+ }
+ ],
+ "CreateDBInstanceReadReplica": [
+ {
+ "input": {
+ "AvailabilityZone": "us-east-1a",
+ "CopyTagsToSnapshot": true,
+ "DBInstanceClass": "db.t2.micro",
+ "DBInstanceIdentifier": "mydbreadreplica",
+ "PubliclyAccessible": true,
+ "SourceDBInstanceIdentifier": "mymysqlinstance",
+ "StorageType": "gp2",
+ "Tags": [
+ {
+ "Key": "mydbreadreplicakey",
+ "Value": "mydbreadreplicavalue"
+ }
+ ]
+ },
+ "output": {
+ "DBInstance": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a DB instance read replica.",
+ "id": "create-db-instance-read-replica-81b41cd5-2871-4dae-bc59-3e264449d5fe",
+ "title": "To create a DB instance read replica."
+ }
+ ],
+ "CreateDBParameterGroup": [
+ {
+ "input": {
+ "DBParameterGroupFamily": "mysql5.6",
+ "DBParameterGroupName": "mymysqlparametergroup",
+ "Description": "My MySQL parameter group"
+ },
+ "output": {
+ "DBParameterGroup": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a DB parameter group.",
+ "id": "create-db-parameter-group-42afcc37-12e9-4b6a-a55c-b8a141246e87",
+ "title": "To create a DB parameter group."
+ }
+ ],
+ "CreateDBSecurityGroup": [
+ {
+ "input": {
+ "DBSecurityGroupDescription": "My DB security group",
+ "DBSecurityGroupName": "mydbsecuritygroup"
+ },
+ "output": {
+ "DBSecurityGroup": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a DB security group.",
+ "id": "create-db-security-group-41b6786a-539e-42a5-a645-a8bc3cf99353",
+ "title": "To create a DB security group."
+ }
+ ],
+ "CreateDBSnapshot": [
+ {
+ "input": {
+ "DBInstanceIdentifier": "mymysqlinstance",
+ "DBSnapshotIdentifier": "mydbsnapshot"
+ },
+ "output": {
+ "DBSnapshot": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a DB snapshot.",
+ "id": "create-db-snapshot-e10e0e2c-9ac4-426d-9b17-6b6a3e382ce2",
+ "title": "To create a DB snapshot."
+ }
+ ],
+ "CreateDBSubnetGroup": [
+ {
+ "input": {
+ "DBSubnetGroupDescription": "My DB subnet group",
+ "DBSubnetGroupName": "mydbsubnetgroup",
+ "SubnetIds": [
+ "subnet-1fab8a69",
+ "subnet-d43a468c"
+ ]
+ },
+ "output": {
+ "DBSubnetGroup": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a DB subnet group.",
+ "id": "create-db-subnet-group-c3d162c2-0ec4-4955-ba89-18967615fdb8",
+ "title": "To create a DB subnet group."
+ }
+ ],
+ "CreateEventSubscription": [
+ {
+ "input": {
+ "Enabled": true,
+ "EventCategories": [
+ "availability"
+ ],
+ "SnsTopicArn": "arn:aws:sns:us-east-1:992648334831:MyDemoSNSTopic",
+ "SourceIds": [
+ "mymysqlinstance"
+ ],
+ "SourceType": "db-instance",
+ "SubscriptionName": "mymysqleventsubscription"
+ },
+ "output": {
+ "EventSubscription": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an event notification subscription.",
+ "id": "create-event-subscription-00dd0ee6-0e0f-4a38-ae83-e5f2ded5f69a",
+ "title": "To create an event notification subscription"
+ }
+ ],
+ "CreateOptionGroup": [
+ {
+ "input": {
+ "EngineName": "MySQL",
+ "MajorEngineVersion": "5.6",
+ "OptionGroupDescription": "My MySQL 5.6 option group",
+ "OptionGroupName": "mymysqloptiongroup"
+ },
+ "output": {
+ "OptionGroup": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an option group.",
+ "id": "create-option-group-a7708c87-1b79-4a5e-a762-21cf8fc62b78",
+ "title": "To create an option group"
+ }
+ ],
+ "DeleteDBCluster": [
+ {
+ "input": {
+ "DBClusterIdentifier": "mydbcluster",
+ "SkipFinalSnapshot": true
+ },
+ "output": {
+ "DBCluster": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified DB cluster.",
+ "id": "delete-db-cluster-927fc2c8-6c67-4075-b1ba-75490be0f7d6",
+ "title": "To delete a DB cluster."
+ }
+ ],
+ "DeleteDBClusterParameterGroup": [
+ {
+ "input": {
+ "DBClusterParameterGroupName": "mydbclusterparametergroup"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified DB cluster parameter group.",
+ "id": "delete-db-cluster-parameter-group-364f5555-ba0a-4cc8-979c-e769098924fc",
+ "title": "To delete a DB cluster parameter group."
+ }
+ ],
+ "DeleteDBClusterSnapshot": [
+ {
+ "input": {
+ "DBClusterSnapshotIdentifier": "mydbclustersnapshot"
+ },
+ "output": {
+ "DBClusterSnapshot": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified DB cluster snapshot.",
+ "id": "delete-db-cluster-snapshot-c67e0d95-670e-4fb5-af90-6d9a70a91b07",
+ "title": "To delete a DB cluster snapshot."
+ }
+ ],
+ "DeleteDBInstance": [
+ {
+ "input": {
+ "DBInstanceIdentifier": "mymysqlinstance",
+ "SkipFinalSnapshot": true
+ },
+ "output": {
+ "DBInstance": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified DB instance.",
+ "id": "delete-db-instance-4412e650-949c-488a-b32a-7d3038ebccc4",
+ "title": "To delete a DB instance."
+ }
+ ],
+ "DeleteDBParameterGroup": [
+ {
+ "input": {
+ "DBParameterGroupName": "mydbparamgroup3"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a DB parameter group.",
+ "id": "to-delete-a-db-parameter-group-1473888796509",
+ "title": "To delete a DB parameter group"
+ }
+ ],
+ "DeleteDBSecurityGroup": [
+ {
+ "input": {
+ "DBSecurityGroupName": "mysecgroup"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a DB security group.",
+ "id": "to-delete-a-db-security-group-1473960141889",
+ "title": "To delete a DB security group"
+ }
+ ],
+ "DeleteDBSnapshot": [
+ {
+ "input": {
+ "DBSnapshotIdentifier": "mydbsnapshot"
+ },
+ "output": {
+ "DBSnapshot": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified DB snapshot.",
+ "id": "delete-db-snapshot-505d6b4e-8ced-479c-856a-c460a33fe07b",
+ "title": "To delete a DB cluster snapshot."
+ }
+ ],
+ "DeleteDBSubnetGroup": [
+ {
+ "input": {
+ "DBSubnetGroupName": "mydbsubnetgroup"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified DB subnetgroup.",
+ "id": "delete-db-subnet-group-4ae00375-511e-443d-a01d-4b9f552244aa",
+ "title": "To delete a DB subnet group."
+ }
+ ],
+ "DeleteEventSubscription": [
+ {
+ "input": {
+ "SubscriptionName": "myeventsubscription"
+ },
+ "output": {
+ "EventSubscription": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified DB event subscription.",
+ "id": "delete-db-event-subscription-d33567e3-1d5d-48ff-873f-0270453f4a75",
+ "title": "To delete a DB event subscription."
+ }
+ ],
+ "DeleteOptionGroup": [
+ {
+ "input": {
+ "OptionGroupName": "mydboptiongroup"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified option group.",
+ "id": "delete-db-option-group-578be2be-3095-431a-9ea4-9a3c3b0daef4",
+ "title": "To delete an option group."
+ }
+ ],
+ "DescribeAccountAttributes": [
+ {
+ "input": {
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists account attributes.",
+ "id": "describe-account-attributes-683d3ff7-5524-421a-8da5-e88f1ea2222b",
+ "title": "To list account attributes"
+ }
+ ],
+ "DescribeCertificates": [
+ {
+ "input": {
+ "CertificateIdentifier": "rds-ca-2015",
+ "MaxRecords": 20
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists up to 20 certificates for the specified certificate identifier.",
+ "id": "describe-certificates-9d71a70d-7908-4444-b43f-321d842c62dc",
+ "title": "To list certificates"
+ }
+ ],
+ "DescribeDBClusterParameterGroups": [
+ {
+ "input": {
+ "DBClusterParameterGroupName": "mydbclusterparametergroup"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists settings for the specified DB cluster parameter group.",
+ "id": "describe-db-cluster-parameter-groups-cf9c6e66-664e-4f57-8e29-a9080abfc013",
+ "title": "To list DB cluster parameter group settings"
+ }
+ ],
+ "DescribeDBClusterParameters": [
+ {
+ "input": {
+ "DBClusterParameterGroupName": "mydbclusterparametergroup",
+ "Source": "system"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists system parameters for the specified DB cluster parameter group.",
+ "id": "describe-db-cluster-parameters-98043c28-e489-41a7-b118-bfd96dc779a1",
+ "title": "To list DB cluster parameters"
+ }
+ ],
+ "DescribeDBClusterSnapshotAttributes": [
+ {
+ "input": {
+ "DBClusterSnapshotIdentifier": "mydbclustersnapshot"
+ },
+ "output": {
+ "DBClusterSnapshotAttributesResult": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists attributes for the specified DB cluster snapshot.",
+ "id": "describe-db-cluster-snapshot-attributes-6752ade3-0c7b-4b06-a8e4-b76bf4e2d3571",
+ "title": "To list DB cluster snapshot attributes"
+ }
+ ],
+ "DescribeDBClusterSnapshots": [
+ {
+ "input": {
+ "DBClusterSnapshotIdentifier": "mydbclustersnapshot",
+ "SnapshotType": "manual"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists settings for the specified, manually-created cluster snapshot.",
+ "id": "describe-db-cluster-snapshots-52f38af1-3431-4a51-9a6a-e6bb8c961b32",
+ "title": "To list DB cluster snapshots"
+ }
+ ],
+ "DescribeDBClusters": [
+ {
+ "input": {
+ "DBClusterIdentifier": "mynewdbcluster"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists settings for the specified DB cluster.",
+ "id": "describe-db-clusters-7aae8861-cb95-4b3b-9042-f62df7698635",
+ "title": "To list DB clusters"
+ }
+ ],
+ "DescribeDBEngineVersions": [
+ {
+ "input": {
+ "DBParameterGroupFamily": "mysql5.6",
+ "DefaultOnly": true,
+ "Engine": "mysql",
+ "EngineVersion": "5.6",
+ "ListSupportedCharacterSets": true
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists settings for the specified DB engine version.",
+ "id": "describe-db-engine-versions-8e698cf2-2162-425a-a854-111cdaceb52b",
+ "title": "To list DB engine version settings"
+ }
+ ],
+ "DescribeDBInstances": [
+ {
+ "input": {
+ "DBInstanceIdentifier": "mymysqlinstance"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists settings for the specified DB instance.",
+ "id": "describe-db-instances-0e11a8c5-4ec3-4463-8cbf-f7254d04c4fc",
+ "title": "To list DB instance settings"
+ }
+ ],
+ "DescribeDBLogFiles": [
+ {
+ "input": {
+ "DBInstanceIdentifier": "mymysqlinstance",
+ "FileLastWritten": 1470873600000,
+ "FileSize": 0,
+ "FilenameContains": "error"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists matching log file names for the specified DB instance, file name pattern, last write date in POSIX time with milleseconds, and minimum file size.",
+ "id": "describe-db-log-files-5f002d8d-5c1d-44c2-b5f4-bd284c0f1285",
+ "title": "To list DB log file names"
+ }
+ ],
+ "DescribeDBParameterGroups": [
+ {
+ "input": {
+ "DBParameterGroupName": "mymysqlparametergroup"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists information about the specified DB parameter group.",
+ "id": "describe-db-parameter-groups-",
+ "title": "To list information about DB parameter groups"
+ }
+ ],
+ "DescribeDBParameters": [
+ {
+ "input": {
+ "DBParameterGroupName": "mymysqlparametergroup",
+ "MaxRecords": 20,
+ "Source": "system"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists information for up to the first 20 system parameters for the specified DB parameter group.",
+ "id": "describe-db-parameters-09db4201-ef4f-4d97-a4b5-d71c0715b901",
+ "title": "To list information about DB parameters"
+ }
+ ],
+ "DescribeDBSecurityGroups": [
+ {
+ "input": {
+ "DBSecurityGroupName": "mydbsecuritygroup"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists settings for the specified security group.",
+ "id": "describe-db-security-groups-66fe9ea1-17dd-4275-b82e-f771cee0c849",
+ "title": "To list DB security group settings"
+ }
+ ],
+ "DescribeDBSnapshotAttributes": [
+ {
+ "input": {
+ "DBSnapshotIdentifier": "mydbsnapshot"
+ },
+ "output": {
+ "DBSnapshotAttributesResult": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists attributes for the specified DB snapshot.",
+ "id": "describe-db-snapshot-attributes-1d4fb750-34f6-4e43-8b3d-b2751d796a95",
+ "title": "To list DB snapshot attributes"
+ }
+ ],
+ "DescribeDBSnapshots": [
+ {
+ "input": {
+ "DBInstanceIdentifier": "mymysqlinstance",
+ "IncludePublic": false,
+ "IncludeShared": true,
+ "SnapshotType": "manual"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists all manually-created, shared snapshots for the specified DB instance.",
+ "id": "describe-db-snapshots-2c935989-a1ef-4c85-aea4-1d0f45f17f26",
+ "title": "To list DB snapshot attributes"
+ }
+ ],
+ "DescribeDBSubnetGroups": [
+ {
+ "input": {
+ "DBSubnetGroupName": "mydbsubnetgroup"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists information about the specified DB subnet group.",
+ "id": "describe-db-subnet-groups-1d97b340-682f-4dd6-9653-8ed72a8d1221",
+ "title": "To list information about DB subnet groups"
+ }
+ ],
+ "DescribeEngineDefaultClusterParameters": [
+ {
+ "input": {
+ "DBParameterGroupFamily": "aurora5.6"
+ },
+ "output": {
+ "EngineDefaults": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists default parameters for the specified DB cluster engine.",
+ "id": "describe-engine-default-cluster-parameters-f130374a-7bee-434b-b51d-da20b6e000e0",
+ "title": "To list default parameters for a DB cluster engine"
+ }
+ ],
+ "DescribeEngineDefaultParameters": [
+ {
+ "input": {
+ "DBParameterGroupFamily": "mysql5.6"
+ },
+ "output": {
+ "EngineDefaults": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists default parameters for the specified DB engine.",
+ "id": "describe-engine-default-parameters-35d5108e-1d44-4fac-8aeb-04b8fdfface1",
+ "title": "To list default parameters for a DB engine"
+ }
+ ],
+ "DescribeEventCategories": [
+ {
+ "input": {
+ "SourceType": "db-instance"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists all DB instance event categories.",
+ "id": "describe-event-categories-97bd4c77-12da-4be6-b42f-edf77771428b",
+ "title": "To list event categories."
+ }
+ ],
+ "DescribeEventSubscriptions": [
+ {
+ "input": {
+ "SubscriptionName": "mymysqleventsubscription"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists information for the specified DB event notification subscription.",
+ "id": "describe-event-subscriptions-11184a82-e58a-4d0c-b558-f3a7489e0850",
+ "title": "To list information about DB event notification subscriptions"
+ }
+ ],
+ "DescribeEvents": [
+ {
+ "input": {
+ "Duration": 10080,
+ "EventCategories": [
+ "backup"
+ ],
+ "SourceIdentifier": "mymysqlinstance",
+ "SourceType": "db-instance"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists information for all backup-related events for the specified DB instance for the past 7 days (7 days * 24 hours * 60 minutes = 10,080 minutes).",
+ "id": "describe-events-3836e5ed-3913-4f76-8452-c77fcad5016b",
+ "title": "To list information about events"
+ }
+ ],
+ "DescribeOptionGroupOptions": [
+ {
+ "input": {
+ "EngineName": "mysql",
+ "MajorEngineVersion": "5.6"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists information for all option group options for the specified DB engine.",
+ "id": "describe-option-group-options-30d735a4-81f1-49e4-b3f2-5dc45d50c8ed",
+ "title": "To list information about DB option group options"
+ }
+ ],
+ "DescribeOptionGroups": [
+ {
+ "input": {
+ "EngineName": "mysql",
+ "MajorEngineVersion": "5.6"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists information for all option groups for the specified DB engine.",
+ "id": "describe-option-groups-4ef478a1-66d5-45f2-bec3-e608720418a4",
+ "title": "To list information about DB option groups"
+ }
+ ],
+ "DescribeOrderableDBInstanceOptions": [
+ {
+ "input": {
+ "DBInstanceClass": "db.t2.micro",
+ "Engine": "mysql",
+ "EngineVersion": "5.6.27",
+ "LicenseModel": "general-public-license",
+ "Vpc": true
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists information for all orderable DB instance options for the specified DB engine, engine version, DB instance class, license model, and VPC settings.",
+ "id": "describe-orderable-db-instance-options-7444d3ed-82eb-42b9-9ed9-896b8c27a782",
+ "title": "To list information about orderable DB instance options"
+ }
+ ],
+ "DescribePendingMaintenanceActions": [
+ {
+ "input": {
+ "ResourceIdentifier": "arn:aws:rds:us-east-1:992648334831:db:mymysqlinstance"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists information for all pending maintenance actions for the specified DB instance.",
+ "id": "describe-pending-maintenance-actions-e6021f7e-58ae-49cc-b874-11996176835c",
+ "title": "To list information about pending maintenance actions"
+ }
+ ],
+ "DescribeReservedDBInstances": [
+ {
+ "input": {
+ "DBInstanceClass": "db.t2.micro",
+ "Duration": "1y",
+ "MultiAZ": false,
+ "OfferingType": "No Upfront",
+ "ProductDescription": "mysql"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists information for all reserved DB instances for the specified DB instance class, duration, product, offering type, and availability zone settings.",
+ "id": "describe-reserved-db-instances-d45adaca-2e30-407c-a0f3-aa7b98bea17f",
+ "title": "To list information about reserved DB instances"
+ }
+ ],
+ "DescribeReservedDBInstancesOfferings": [
+ {
+ "input": {
+ "DBInstanceClass": "db.t2.micro",
+ "Duration": "1y",
+ "MultiAZ": false,
+ "OfferingType": "No Upfront",
+ "ProductDescription": "mysql"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists information for all reserved DB instance offerings for the specified DB instance class, duration, product, offering type, and availability zone settings.",
+ "id": "describe-reserved-db-instances-offerings-9de7d1fd-d6a6-4a72-84ae-b2ef58d47d8d",
+ "title": "To list information about reserved DB instance offerings"
+ }
+ ],
+ "DescribeSourceRegions": [
+ {
+ "input": {
+ },
+ "output": {
+ "SourceRegions": [
+ {
+ "Endpoint": "https://rds.ap-northeast-1.amazonaws.com",
+ "RegionName": "ap-northeast-1",
+ "Status": "available"
+ },
+ {
+ "Endpoint": "https://rds.ap-northeast-2.amazonaws.com",
+ "RegionName": "ap-northeast-2",
+ "Status": "available"
+ },
+ {
+ "Endpoint": "https://rds.ap-south-1.amazonaws.com",
+ "RegionName": "ap-south-1",
+ "Status": "available"
+ },
+ {
+ "Endpoint": "https://rds.ap-southeast-1.amazonaws.com",
+ "RegionName": "ap-southeast-1",
+ "Status": "available"
+ },
+ {
+ "Endpoint": "https://rds.ap-southeast-2.amazonaws.com",
+ "RegionName": "ap-southeast-2",
+ "Status": "available"
+ },
+ {
+ "Endpoint": "https://rds.eu-central-1.amazonaws.com",
+ "RegionName": "eu-central-1",
+ "Status": "available"
+ },
+ {
+ "Endpoint": "https://rds.eu-west-1.amazonaws.com",
+ "RegionName": "eu-west-1",
+ "Status": "available"
+ },
+ {
+ "Endpoint": "https://rds.sa-east-1.amazonaws.com",
+ "RegionName": "sa-east-1",
+ "Status": "available"
+ },
+ {
+ "Endpoint": "https://rds.us-west-1.amazonaws.com",
+ "RegionName": "us-west-1",
+ "Status": "available"
+ },
+ {
+ "Endpoint": "https://rds.us-west-2.amazonaws.com",
+ "RegionName": "us-west-2",
+ "Status": "available"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "To list the AWS regions where a Read Replica can be created.",
+ "id": "to-describe-source-regions-1473457722410",
+ "title": "To describe source regions"
+ }
+ ],
+ "DownloadDBLogFilePortion": [
+ {
+ "input": {
+ "DBInstanceIdentifier": "mymysqlinstance",
+ "LogFileName": "mysqlUpgrade"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists information for the specified log file for the specified DB instance.",
+ "id": "download-db-log-file-portion-54a82731-a441-4fc7-a010-8eccae6fa202",
+ "title": "To list information about DB log files"
+ }
+ ],
+ "FailoverDBCluster": [
+ {
+ "input": {
+ "DBClusterIdentifier": "myaurorainstance-cluster",
+ "TargetDBInstanceIdentifier": "myaurorareplica"
+ },
+ "output": {
+ "DBCluster": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example performs a failover for the specified DB cluster to the specified DB instance.",
+ "id": "failover-db-cluster-9e7f2f93-d98c-42c7-bb0e-d6c485c096d6",
+ "title": "To perform a failover for a DB cluster"
+ }
+ ],
+ "ListTagsForResource": [
+ {
+ "input": {
+ "ResourceName": "arn:aws:rds:us-east-1:992648334831:og:mymysqloptiongroup"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists information about all tags associated with the specified DB option group.",
+ "id": "list-tags-for-resource-8401f3c2-77cd-4f90-bfd5-b523f0adcc2f",
+ "title": "To list information about tags associated with a resource"
+ }
+ ],
+ "ModifyDBCluster": [
+ {
+ "input": {
+ "ApplyImmediately": true,
+ "DBClusterIdentifier": "mydbcluster",
+ "MasterUserPassword": "mynewpassword",
+ "NewDBClusterIdentifier": "mynewdbcluster",
+ "PreferredBackupWindow": "04:00-04:30",
+ "PreferredMaintenanceWindow": "Tue:05:00-Tue:05:30"
+ },
+ "output": {
+ "DBCluster": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example changes the specified settings for the specified DB cluster.",
+ "id": "modify-db-cluster-a370ee1b-768d-450a-853b-707cb1ab663d",
+ "title": "To change DB cluster settings"
+ }
+ ],
+ "ModifyDBClusterParameterGroup": [
+ {
+ "input": {
+ "DBClusterParameterGroupName": "mydbclusterparametergroup",
+ "Parameters": [
+ {
+ "ApplyMethod": "immediate",
+ "ParameterName": "time_zone",
+ "ParameterValue": "America/Phoenix"
+ }
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example immediately changes the specified setting for the specified DB cluster parameter group.",
+ "id": "modify-db-cluster-parameter-group-f9156bc9-082a-442e-8d12-239542c1a113",
+ "title": "To change DB cluster parameter group settings"
+ }
+ ],
+ "ModifyDBClusterSnapshotAttribute": [
+ {
+ "input": {
+ "AttributeName": "restore",
+ "DBClusterSnapshotIdentifier": "manual-cluster-snapshot1",
+ "ValuesToAdd": [
+ "123451234512",
+ "123456789012"
+ ],
+ "ValuesToRemove": [
+ "all"
+ ]
+ },
+ "output": {
+ "DBClusterSnapshotAttributesResult": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example gives two AWS accounts access to a manual DB cluster snapshot and ensures that the DB cluster snapshot is private by removing the value \"all\".",
+ "id": "to-add-or-remove-access-to-a-manual-db-cluster-snapshot-1473889426431",
+ "title": "To add or remove access to a manual DB cluster snapshot"
+ }
+ ],
+ "ModifyDBInstance": [
+ {
+ "input": {
+ "AllocatedStorage": 10,
+ "ApplyImmediately": true,
+ "BackupRetentionPeriod": 1,
+ "DBInstanceClass": "db.t2.small",
+ "DBInstanceIdentifier": "mymysqlinstance",
+ "MasterUserPassword": "mynewpassword",
+ "PreferredBackupWindow": "04:00-04:30",
+ "PreferredMaintenanceWindow": "Tue:05:00-Tue:05:30"
+ },
+ "output": {
+ "DBInstance": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example immediately changes the specified settings for the specified DB instance.",
+ "id": "modify-db-instance-6979a368-6254-467b-8a8d-61103f4fcde9",
+ "title": "To change DB instance settings"
+ }
+ ],
+ "ModifyDBParameterGroup": [
+ {
+ "input": {
+ "DBParameterGroupName": "mymysqlparametergroup",
+ "Parameters": [
+ {
+ "ApplyMethod": "immediate",
+ "ParameterName": "time_zone",
+ "ParameterValue": "America/Phoenix"
+ }
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example immediately changes the specified setting for the specified DB parameter group.",
+ "id": "modify-db-parameter-group-f3a4e52a-68e4-4b88-b559-f912d34c457a",
+ "title": "To change DB parameter group settings"
+ }
+ ],
+ "ModifyDBSnapshotAttribute": [
+ {
+ "input": {
+ "AttributeName": "restore",
+ "DBSnapshotIdentifier": "mydbsnapshot",
+ "ValuesToAdd": [
+ "all"
+ ]
+ },
+ "output": {
+ "DBSnapshotAttributesResult": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example adds the specified attribute for the specified DB snapshot.",
+ "id": "modify-db-snapshot-attribute-2e66f120-2b21-4a7c-890b-4474da88bde6",
+ "title": "To change DB snapshot attributes"
+ }
+ ],
+ "ModifyDBSubnetGroup": [
+ {
+ "input": {
+ "DBSubnetGroupName": "mydbsubnetgroup",
+ "SubnetIds": [
+ "subnet-70e1975a",
+ "subnet-747a5c49"
+ ]
+ },
+ "output": {
+ "DBSubnetGroup": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example changes the specified setting for the specified DB subnet group.",
+ "id": "modify-db-subnet-group-e34a97d9-8fe6-4239-a4ed-ad6e73a956b0",
+ "title": "To change DB subnet group settings"
+ }
+ ],
+ "ModifyEventSubscription": [
+ {
+ "input": {
+ "Enabled": true,
+ "EventCategories": [
+ "deletion",
+ "low storage"
+ ],
+ "SourceType": "db-instance",
+ "SubscriptionName": "mymysqleventsubscription"
+ },
+ "output": {
+ "EventSubscription": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example changes the specified setting for the specified event notification subscription.",
+ "id": "modify-event-subscription-405ac869-1f02-42cd-b8f4-6950a435f30e",
+ "title": "To change event notification subscription settings"
+ }
+ ],
+ "ModifyOptionGroup": [
+ {
+ "input": {
+ "ApplyImmediately": true,
+ "OptionGroupName": "myawsuser-og02",
+ "OptionsToInclude": [
+ {
+ "DBSecurityGroupMemberships": [
+ "default"
+ ],
+ "OptionName": "MEMCACHED"
+ }
+ ]
+ },
+ "output": {
+ "OptionGroup": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example adds an option to an option group.",
+ "id": "to-modify-an-option-group-1473890247875",
+ "title": "To modify an option group"
+ }
+ ],
+ "PromoteReadReplica": [
+ {
+ "input": {
+ "BackupRetentionPeriod": 1,
+ "DBInstanceIdentifier": "mydbreadreplica",
+ "PreferredBackupWindow": "03:30-04:00"
+ },
+ "output": {
+ "DBInstance": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example promotes the specified read replica and sets its backup retention period and preferred backup window.",
+ "id": "promote-read-replica-cc580039-c55d-4035-838a-def4a1ae4181",
+ "title": "To promote a read replica"
+ }
+ ],
+ "PurchaseReservedDBInstancesOffering": [
+ {
+ "input": {
+ "ReservedDBInstanceId": "myreservationid",
+ "ReservedDBInstancesOfferingId": "fb29428a-646d-4390-850e-5fe89926e727"
+ },
+ "output": {
+ "ReservedDBInstance": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example purchases a reserved DB instance offering that matches the specified settings.",
+ "id": "purchase-reserved-db-instances-offfering-f423c736-8413-429b-ba13-850fd4fa4dcd",
+ "title": "To purchase a reserved DB instance offering"
+ }
+ ],
+ "RebootDBInstance": [
+ {
+ "input": {
+ "DBInstanceIdentifier": "mymysqlinstance",
+ "ForceFailover": false
+ },
+ "output": {
+ "DBInstance": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example reboots the specified DB instance without forcing a failover.",
+ "id": "reboot-db-instance-b9ce8a0a-2920-451d-a1f3-01d288aa7366",
+ "title": "To reboot a DB instance"
+ }
+ ],
+ "RemoveSourceIdentifierFromSubscription": [
+ {
+ "input": {
+ "SourceIdentifier": "mymysqlinstance",
+ "SubscriptionName": "myeventsubscription"
+ },
+ "output": {
+ "EventSubscription": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example removes the specified source identifier from the specified DB event subscription.",
+ "id": "remove-source-identifier-from-subscription-30d25493-c19d-4cf7-b4e5-68371d0d8770",
+ "title": "To remove a source identifier from a DB event subscription"
+ }
+ ],
+ "RemoveTagsFromResource": [
+ {
+ "input": {
+ "ResourceName": "arn:aws:rds:us-east-1:992648334831:og:mydboptiongroup",
+ "TagKeys": [
+ "MyKey"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example removes the specified tag associated with the specified DB option group.",
+ "id": "remove-tags-from-resource-49f00574-38f6-4d01-ac89-d3c668449ce3",
+ "title": "To remove tags from a resource"
+ }
+ ],
+ "ResetDBClusterParameterGroup": [
+ {
+ "input": {
+ "DBClusterParameterGroupName": "mydbclusterparametergroup",
+ "ResetAllParameters": true
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example resets all parameters for the specified DB cluster parameter group to their default values.",
+ "id": "reset-db-cluster-parameter-group-b04aeaf7-7f73-49e1-9bb4-857573ea3ee4",
+ "title": "To reset the values of a DB cluster parameter group"
+ }
+ ],
+ "ResetDBParameterGroup": [
+ {
+ "input": {
+ "DBParameterGroupName": "mydbparametergroup",
+ "ResetAllParameters": true
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example resets all parameters for the specified DB parameter group to their default values.",
+ "id": "reset-db-parameter-group-ed2ed723-de0d-4824-8af5-3c65fa130abf",
+ "title": "To reset the values of a DB parameter group"
+ }
+ ],
+ "RestoreDBClusterFromSnapshot": [
+ {
+ "input": {
+ "DBClusterIdentifier": "restored-cluster1",
+ "Engine": "aurora",
+ "SnapshotIdentifier": "sample-cluster-snapshot1"
+ },
+ "output": {
+ "DBCluster": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example restores an Amazon Aurora DB cluster from a DB cluster snapshot.",
+ "id": "to-restore-an-amazon-aurora-db-cluster-from-a-db-cluster-snapshot-1473958144325",
+ "title": "To restore an Amazon Aurora DB cluster from a DB cluster snapshot"
+ }
+ ],
+ "RestoreDBClusterToPointInTime": [
+ {
+ "input": {
+ "DBClusterIdentifier": "sample-restored-cluster1",
+ "RestoreToTime": "2016-09-13T18:45:00Z",
+ "SourceDBClusterIdentifier": "sample-cluster1"
+ },
+ "output": {
+ "DBCluster": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example restores a DB cluster to a new DB cluster at a point in time from the source DB cluster.",
+ "id": "to-restore-a-db-cluster-to-a-point-in-time-1473962082214",
+ "title": "To restore a DB cluster to a point in time."
+ }
+ ],
+ "RestoreDBInstanceFromDBSnapshot": [
+ {
+ "input": {
+ "DBInstanceIdentifier": "mysqldb-restored",
+ "DBSnapshotIdentifier": "rds:mysqldb-2014-04-22-08-15"
+ },
+ "output": {
+ "DBInstance": {
+ "AllocatedStorage": 200,
+ "AutoMinorVersionUpgrade": true,
+ "AvailabilityZone": "us-west-2b",
+ "BackupRetentionPeriod": 7,
+ "CACertificateIdentifier": "rds-ca-2015",
+ "CopyTagsToSnapshot": false,
+ "DBInstanceArn": "arn:aws:rds:us-west-2:123456789012:db:mysqldb-restored",
+ "DBInstanceClass": "db.t2.small",
+ "DBInstanceIdentifier": "mysqldb-restored",
+ "DBInstanceStatus": "available",
+ "DBName": "sample",
+ "DBParameterGroups": [
+ {
+ "DBParameterGroupName": "default.mysql5.6",
+ "ParameterApplyStatus": "in-sync"
+ }
+ ],
+ "DBSecurityGroups": [
+
+ ],
+ "DBSubnetGroup": {
+ "DBSubnetGroupDescription": "default",
+ "DBSubnetGroupName": "default",
+ "SubnetGroupStatus": "Complete",
+ "Subnets": [
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-west-2a"
+ },
+ "SubnetIdentifier": "subnet-77e8db03",
+ "SubnetStatus": "Active"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-west-2b"
+ },
+ "SubnetIdentifier": "subnet-c39989a1",
+ "SubnetStatus": "Active"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-west-2c"
+ },
+ "SubnetIdentifier": "subnet-4b267b0d",
+ "SubnetStatus": "Active"
+ }
+ ],
+ "VpcId": "vpc-c1c5b3a3"
+ },
+ "DbInstancePort": 0,
+ "DbiResourceId": "db-VNZUCCBTEDC4WR7THXNJO72HVQ",
+ "DomainMemberships": [
+
+ ],
+ "Engine": "mysql",
+ "EngineVersion": "5.6.27",
+ "LicenseModel": "general-public-license",
+ "MasterUsername": "mymasteruser",
+ "MonitoringInterval": 0,
+ "MultiAZ": false,
+ "OptionGroupMemberships": [
+ {
+ "OptionGroupName": "default:mysql-5-6",
+ "Status": "in-sync"
+ }
+ ],
+ "PendingModifiedValues": {
+ },
+ "PreferredBackupWindow": "12:58-13:28",
+ "PreferredMaintenanceWindow": "tue:10:16-tue:10:46",
+ "PubliclyAccessible": true,
+ "ReadReplicaDBInstanceIdentifiers": [
+
+ ],
+ "StorageEncrypted": false,
+ "StorageType": "gp2",
+ "VpcSecurityGroups": [
+ {
+ "Status": "active",
+ "VpcSecurityGroupId": "sg-e5e5b0d2"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example restores a DB instance from a DB snapshot.",
+ "id": "to-restore-a-db-instance-from-a-db-snapshot-1473961657311",
+ "title": "To restore a DB instance from a DB snapshot."
+ }
+ ],
+ "RestoreDBInstanceToPointInTime": [
+ {
+ "input": {
+ "RestoreTime": "2016-09-13T18:45:00Z",
+ "SourceDBInstanceIdentifier": "mysql-sample",
+ "TargetDBInstanceIdentifier": "mysql-sample-restored"
+ },
+ "output": {
+ "DBInstance": {
+ "AllocatedStorage": 200,
+ "AutoMinorVersionUpgrade": true,
+ "AvailabilityZone": "us-west-2b",
+ "BackupRetentionPeriod": 7,
+ "CACertificateIdentifier": "rds-ca-2015",
+ "CopyTagsToSnapshot": false,
+ "DBInstanceArn": "arn:aws:rds:us-west-2:123456789012:db:mysql-sample-restored",
+ "DBInstanceClass": "db.t2.small",
+ "DBInstanceIdentifier": "mysql-sample-restored",
+ "DBInstanceStatus": "available",
+ "DBName": "sample",
+ "DBParameterGroups": [
+ {
+ "DBParameterGroupName": "default.mysql5.6",
+ "ParameterApplyStatus": "in-sync"
+ }
+ ],
+ "DBSecurityGroups": [
+
+ ],
+ "DBSubnetGroup": {
+ "DBSubnetGroupDescription": "default",
+ "DBSubnetGroupName": "default",
+ "SubnetGroupStatus": "Complete",
+ "Subnets": [
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-west-2a"
+ },
+ "SubnetIdentifier": "subnet-77e8db03",
+ "SubnetStatus": "Active"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-west-2b"
+ },
+ "SubnetIdentifier": "subnet-c39989a1",
+ "SubnetStatus": "Active"
+ },
+ {
+ "SubnetAvailabilityZone": {
+ "Name": "us-west-2c"
+ },
+ "SubnetIdentifier": "subnet-4b267b0d",
+ "SubnetStatus": "Active"
+ }
+ ],
+ "VpcId": "vpc-c1c5b3a3"
+ },
+ "DbInstancePort": 0,
+ "DbiResourceId": "db-VNZUCCBTEDC4WR7THXNJO72HVQ",
+ "DomainMemberships": [
+
+ ],
+ "Engine": "mysql",
+ "EngineVersion": "5.6.27",
+ "LicenseModel": "general-public-license",
+ "MasterUsername": "mymasteruser",
+ "MonitoringInterval": 0,
+ "MultiAZ": false,
+ "OptionGroupMemberships": [
+ {
+ "OptionGroupName": "default:mysql-5-6",
+ "Status": "in-sync"
+ }
+ ],
+ "PendingModifiedValues": {
+ },
+ "PreferredBackupWindow": "12:58-13:28",
+ "PreferredMaintenanceWindow": "tue:10:16-tue:10:46",
+ "PubliclyAccessible": true,
+ "ReadReplicaDBInstanceIdentifiers": [
+
+ ],
+ "StorageEncrypted": false,
+ "StorageType": "gp2",
+ "VpcSecurityGroups": [
+ {
+ "Status": "active",
+ "VpcSecurityGroupId": "sg-e5e5b0d2"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example restores a DB instance to a new DB instance at a point in time from the source DB instance.",
+ "id": "to-restore-a-db-instance-to-a-point-in-time-1473962652154",
+ "title": "To restore a DB instance to a point in time."
+ }
+ ],
+ "RevokeDBSecurityGroupIngress": [
+ {
+ "input": {
+ "CIDRIP": "203.0.113.5/32",
+ "DBSecurityGroupName": "mydbsecuritygroup"
+ },
+ "output": {
+ "DBSecurityGroup": {
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example revokes ingress for the specified CIDR block associated with the specified DB security group.",
+ "id": "revoke-db-security-group-ingress-ce5b2c1c-bd4e-4809-b04a-6d78ec448813",
+ "title": "To revoke ingress for a DB security group"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/paginators-1.json
new file mode 100644
index 00000000..ea213b11
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/paginators-1.json
@@ -0,0 +1,245 @@
+{
+ "pagination": {
+ "DescribeCertificates": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "Certificates"
+ },
+ "DescribeDBClusterBacktracks": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "DBClusterBacktracks"
+ },
+ "DescribeDBClusterParameterGroups": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "DBClusterParameterGroups"
+ },
+ "DescribeDBClusterParameters": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "Parameters"
+ },
+ "DescribeDBClusterSnapshots": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "DBClusterSnapshots"
+ },
+ "DescribeDBClusters": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBClusters"
+ },
+ "DescribeDBEngineVersions": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "DBEngineVersions"
+ },
+ "DescribeDBInstanceAutomatedBackups": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBInstanceAutomatedBackups"
+ },
+ "DescribeDBInstances": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "DBInstances"
+ },
+ "DescribeDBLogFiles": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "DescribeDBLogFiles"
+ },
+ "DescribeDBParameterGroups": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "DBParameterGroups"
+ },
+ "DescribeDBParameters": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "Parameters"
+ },
+ "DescribeDBSecurityGroups": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "DBSecurityGroups"
+ },
+ "DescribeDBSnapshots": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "DBSnapshots"
+ },
+ "DescribeDBSubnetGroups": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "DBSubnetGroups"
+ },
+ "DescribeEngineDefaultClusterParameters": {
+ "input_token": "Marker",
+ "output_token": "EngineDefaults.Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "EngineDefaults.Parameters"
+ },
+ "DescribeEngineDefaultParameters": {
+ "input_token": "Marker",
+ "output_token": "EngineDefaults.Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "EngineDefaults.Parameters"
+ },
+ "DescribeEventSubscriptions": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "EventSubscriptionsList"
+ },
+ "DescribeEvents": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "Events"
+ },
+ "DescribeGlobalClusters": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "GlobalClusters"
+ },
+ "DescribeOptionGroupOptions": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "OptionGroupOptions"
+ },
+ "DescribeOptionGroups": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "OptionGroupsList"
+ },
+ "DescribeOrderableDBInstanceOptions": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "OrderableDBInstanceOptions"
+ },
+ "DescribePendingMaintenanceActions": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "PendingMaintenanceActions"
+ },
+ "DescribeReservedDBInstances": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "ReservedDBInstances"
+ },
+ "DescribeReservedDBInstancesOfferings": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "ReservedDBInstancesOfferings"
+ },
+ "DescribeSourceRegions": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "SourceRegions"
+ },
+ "DownloadDBLogFilePortion": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "NumberOfLines",
+ "more_results": "AdditionalDataPending",
+ "result_key": "LogFileData"
+ },
+ "DescribeDBClusterEndpoints": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBClusterEndpoints"
+ },
+ "DescribeDBProxies": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBProxies"
+ },
+ "DescribeDBProxyTargetGroups": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "TargetGroups"
+ },
+ "DescribeDBProxyTargets": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "Targets"
+ },
+ "DescribeExportTasks": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "ExportTasks"
+ },
+ "DescribeDBProxyEndpoints": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBProxyEndpoints"
+ },
+ "DescribeBlueGreenDeployments": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "BlueGreenDeployments"
+ },
+ "DescribeDBClusterAutomatedBackups": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBClusterAutomatedBackups"
+ },
+ "DescribeIntegrations": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "Integrations"
+ },
+ "DescribeDBSnapshotTenantDatabases": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBSnapshotTenantDatabases"
+ },
+ "DescribeTenantDatabases": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "TenantDatabases"
+ },
+ "DescribeDBRecommendations": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DBRecommendations"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..5016e028
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/paginators-1.sdk-extras.json
@@ -0,0 +1,12 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "DescribeCertificates": {
+ "non_aggregate_keys": [
+ "DefaultCertificateForNewLaunches"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/service-2.json.gz
new file mode 100644
index 00000000..16ad2b29
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/service-2.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/service-2.sdk-extras.json
new file mode 100644
index 00000000..36aea1fc
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/service-2.sdk-extras.json
@@ -0,0 +1,47 @@
+ {
+ "version": 1.0,
+ "merge": {
+ "shapes": {
+ "CopyDBClusterSnapshotMessage": {
+ "members": {
+ "SourceRegion": {
+ "shape": "String",
+ "documentation": "<p>The ID of the region that contains the snapshot to be copied.</p>"
+ }
+ }
+ },
+ "CreateDBClusterMessage": {
+ "members": {
+ "SourceRegion": {
+ "shape": "String",
+ "documentation": "<p>The ID of the region that contains the source for the db cluster.</p>"
+ }
+ }
+ },
+ "CopyDBSnapshotMessage": {
+ "members": {
+ "SourceRegion": {
+ "shape": "String",
+ "documentation": "<p>The ID of the region that contains the snapshot to be copied.</p>"
+ }
+ }
+ },
+ "CreateDBInstanceReadReplicaMessage": {
+ "members": {
+ "SourceRegion": {
+ "shape": "String",
+ "documentation": "<p>The ID of the region that contains the source for the read replica.</p>"
+ }
+ }
+ },
+ "StartDBInstanceAutomatedBackupsReplicationMessage": {
+ "members": {
+ "SourceRegion": {
+ "shape": "String",
+ "documentation": "<p>The ID of the region that contains the source for the db instance.</p>"
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/waiters-2.json
new file mode 100644
index 00000000..d91adea3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rds/2014-10-31/waiters-2.json
@@ -0,0 +1,412 @@
+{
+ "version": 2,
+ "waiters": {
+ "DBInstanceAvailable": {
+ "delay": 30,
+ "operation": "DescribeDBInstances",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "incompatible-restore",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "incompatible-parameters",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ }
+ ]
+ },
+ "DBInstanceDeleted": {
+ "delay": 30,
+ "operation": "DescribeDBInstances",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": true,
+ "matcher": "path",
+ "state": "success",
+ "argument": "length(DBInstances) == `0`"
+ },
+ {
+ "expected": "DBInstanceNotFound",
+ "matcher": "error",
+ "state": "success"
+ },
+ {
+ "expected": "creating",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "modifying",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "rebooting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ },
+ {
+ "expected": "resetting-master-credentials",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBInstances[].DBInstanceStatus"
+ }
+ ]
+ },
+ "DBSnapshotAvailable": {
+ "delay": 30,
+ "operation": "DescribeDBSnapshots",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "DBSnapshots[].Status"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBSnapshots[].Status"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBSnapshots[].Status"
+ },
+ {
+ "expected": "failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBSnapshots[].Status"
+ },
+ {
+ "expected": "incompatible-restore",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBSnapshots[].Status"
+ },
+ {
+ "expected": "incompatible-parameters",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBSnapshots[].Status"
+ }
+ ]
+ },
+ "DBSnapshotDeleted": {
+ "delay": 30,
+ "operation": "DescribeDBSnapshots",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": true,
+ "matcher": "path",
+ "state": "success",
+ "argument": "length(DBSnapshots) == `0`"
+ },
+ {
+ "expected": "DBSnapshotNotFound",
+ "matcher": "error",
+ "state": "success"
+ },
+ {
+ "expected": "creating",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBSnapshots[].Status"
+ },
+ {
+ "expected": "modifying",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBSnapshots[].Status"
+ },
+ {
+ "expected": "rebooting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBSnapshots[].Status"
+ },
+ {
+ "expected": "resetting-master-credentials",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBSnapshots[].Status"
+ }
+ ]
+ },
+ "DBClusterSnapshotAvailable": {
+ "delay": 30,
+ "operation": "DescribeDBClusterSnapshots",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "DBClusterSnapshots[].Status"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBClusterSnapshots[].Status"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBClusterSnapshots[].Status"
+ },
+ {
+ "expected": "failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBClusterSnapshots[].Status"
+ },
+ {
+ "expected": "incompatible-restore",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBClusterSnapshots[].Status"
+ },
+ {
+ "expected": "incompatible-parameters",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBClusterSnapshots[].Status"
+ }
+ ]
+ },
+ "DBClusterSnapshotDeleted": {
+ "delay": 30,
+ "operation": "DescribeDBClusterSnapshots",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": true,
+ "matcher": "path",
+ "state": "success",
+ "argument": "length(DBClusterSnapshots) == `0`"
+ },
+ {
+ "expected": "DBClusterSnapshotNotFoundFault",
+ "matcher": "error",
+ "state": "success"
+ },
+ {
+ "expected": "creating",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBClusterSnapshots[].Status"
+ },
+ {
+ "expected": "modifying",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBClusterSnapshots[].Status"
+ },
+ {
+ "expected": "rebooting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBClusterSnapshots[].Status"
+ },
+ {
+ "expected": "resetting-master-credentials",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBClusterSnapshots[].Status"
+ }
+ ]
+ },
+ "DBClusterAvailable": {
+ "delay": 30,
+ "operation": "DescribeDBClusters",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "DBClusters[].Status"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBClusters[].Status"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBClusters[].Status"
+ },
+ {
+ "expected": "failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBClusters[].Status"
+ },
+ {
+ "expected": "incompatible-restore",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBClusters[].Status"
+ },
+ {
+ "expected": "incompatible-parameters",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBClusters[].Status"
+ }
+ ]
+ },
+ "DBClusterDeleted": {
+ "delay": 30,
+ "operation": "DescribeDBClusters",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": true,
+ "matcher": "path",
+ "state": "success",
+ "argument": "length(DBClusters) == `0`"
+ },
+ {
+ "expected": "DBClusterNotFoundFault",
+ "matcher": "error",
+ "state": "success"
+ },
+ {
+ "expected": "creating",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBClusters[].Status"
+ },
+ {
+ "expected": "modifying",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBClusters[].Status"
+ },
+ {
+ "expected": "rebooting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBClusters[].Status"
+ },
+ {
+ "expected": "resetting-master-credentials",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "DBClusters[].Status"
+ }
+ ]
+ },
+ "TenantDatabaseAvailable": {
+ "delay": 30,
+ "operation": "DescribeTenantDatabases",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "TenantDatabases[].Status"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "TenantDatabases[].Status"
+ },
+ {
+ "expected": "incompatible-parameters",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "TenantDatabases[].Status"
+ },
+ {
+ "expected": "incompatible-restore",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "TenantDatabases[].Status"
+ }
+ ]
+ },
+ "TenantDatabaseDeleted": {
+ "delay": 30,
+ "operation": "DescribeTenantDatabases",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": true,
+ "matcher": "path",
+ "state": "success",
+ "argument": "length(TenantDatabases) == `0`"
+ },
+ {
+ "expected": "DBInstanceNotFoundFault",
+ "matcher": "error",
+ "state": "success"
+ }
+ ]
+ },
+ "DBSnapshotCompleted": {
+ "delay": 15,
+ "operation": "DescribeDBSnapshots",
+ "maxAttempts": 40,
+ "acceptors": [
+ {
+ "expected": "DBSnapshotNotFound",
+ "matcher": "error",
+ "state": "success"
+ },
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "DBSnapshots[].Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/redshift-data/2019-12-20/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/redshift-data/2019-12-20/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..9559af8e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/redshift-data/2019-12-20/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/redshift-data/2019-12-20/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/redshift-data/2019-12-20/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/redshift-data/2019-12-20/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/redshift-data/2019-12-20/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/redshift-data/2019-12-20/paginators-1.json
new file mode 100644
index 00000000..ba46aa4b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/redshift-data/2019-12-20/paginators-1.json
@@ -0,0 +1,44 @@
+{
+ "pagination": {
+ "DescribeTable": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ColumnList"
+ },
+ "GetStatementResult": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Records"
+ },
+ "ListDatabases": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Databases"
+ },
+ "ListSchemas": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Schemas"
+ },
+ "ListStatements": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Statements"
+ },
+ "ListTables": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Tables"
+ },
+ "GetStatementResultV2": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Records"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/redshift-data/2019-12-20/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/redshift-data/2019-12-20/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..8a060167
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/redshift-data/2019-12-20/paginators-1.sdk-extras.json
@@ -0,0 +1,25 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "GetStatementResult": {
+ "non_aggregate_keys": [
+ "ColumnMetadata",
+ "TotalNumRows"
+ ]
+ },
+ "GetStatementResultV2": {
+ "non_aggregate_keys": [
+ "ColumnMetadata",
+ "TotalNumRows",
+ "ResultFormat"
+ ]
+ },
+ "DescribeTable": {
+ "non_aggregate_keys": [
+ "TableName"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/redshift-data/2019-12-20/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/redshift-data/2019-12-20/service-2.json.gz
new file mode 100644
index 00000000..31fa7179
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/redshift-data/2019-12-20/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/redshift-serverless/2021-04-21/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/redshift-serverless/2021-04-21/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..aa110090
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/redshift-serverless/2021-04-21/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/redshift-serverless/2021-04-21/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/redshift-serverless/2021-04-21/paginators-1.json
new file mode 100644
index 00000000..6b74f501
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/redshift-serverless/2021-04-21/paginators-1.json
@@ -0,0 +1,76 @@
+{
+ "pagination": {
+ "ListEndpointAccess": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "endpoints"
+ },
+ "ListNamespaces": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "namespaces"
+ },
+ "ListRecoveryPoints": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "recoveryPoints"
+ },
+ "ListSnapshots": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "snapshots"
+ },
+ "ListUsageLimits": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "usageLimits"
+ },
+ "ListWorkgroups": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "workgroups"
+ },
+ "ListTableRestoreStatus": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "tableRestoreStatuses"
+ },
+ "ListCustomDomainAssociations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "associations"
+ },
+ "ListScheduledActions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "scheduledActions"
+ },
+ "ListSnapshotCopyConfigurations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "snapshotCopyConfigurations"
+ },
+ "ListManagedWorkgroups": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "managedWorkgroups"
+ },
+ "ListTracks": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "tracks"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/redshift-serverless/2021-04-21/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/redshift-serverless/2021-04-21/service-2.json.gz
new file mode 100644
index 00000000..ed5e7748
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/redshift-serverless/2021-04-21/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/redshift/2012-12-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/redshift/2012-12-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..45c07df9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/redshift/2012-12-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/redshift/2012-12-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/redshift/2012-12-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/redshift/2012-12-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/redshift/2012-12-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/redshift/2012-12-01/paginators-1.json
new file mode 100644
index 00000000..97559e47
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/redshift/2012-12-01/paginators-1.json
@@ -0,0 +1,226 @@
+{
+ "pagination": {
+ "DescribeClusterParameterGroups": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "ParameterGroups"
+ },
+ "DescribeClusterParameters": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "Parameters"
+ },
+ "DescribeClusterSecurityGroups": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "ClusterSecurityGroups"
+ },
+ "DescribeClusterSnapshots": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "Snapshots"
+ },
+ "DescribeClusterSubnetGroups": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "ClusterSubnetGroups"
+ },
+ "DescribeClusterVersions": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "ClusterVersions"
+ },
+ "DescribeClusters": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "Clusters"
+ },
+ "DescribeDefaultClusterParameters": {
+ "input_token": "Marker",
+ "output_token": "DefaultClusterParameters.Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "DefaultClusterParameters.Parameters"
+ },
+ "DescribeEventSubscriptions": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "EventSubscriptionsList"
+ },
+ "DescribeEvents": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "Events"
+ },
+ "DescribeHsmClientCertificates": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "HsmClientCertificates"
+ },
+ "DescribeHsmConfigurations": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "HsmConfigurations"
+ },
+ "DescribeOrderableClusterOptions": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "OrderableClusterOptions"
+ },
+ "DescribeReservedNodeOfferings": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "ReservedNodeOfferings"
+ },
+ "DescribeReservedNodes": {
+ "input_token": "Marker",
+ "output_token": "Marker",
+ "limit_key": "MaxRecords",
+ "result_key": "ReservedNodes"
+ },
+ "DescribeClusterDbRevisions": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "ClusterDbRevisions"
+ },
+ "DescribeClusterTracks": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "MaintenanceTracks"
+ },
+ "DescribeSnapshotCopyGrants": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "SnapshotCopyGrants"
+ },
+ "DescribeSnapshotSchedules": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "SnapshotSchedules"
+ },
+ "DescribeTableRestoreStatus": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "TableRestoreStatusDetails"
+ },
+ "DescribeTags": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "TaggedResources"
+ },
+ "GetReservedNodeExchangeOfferings": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "ReservedNodeOfferings"
+ },
+ "DescribeNodeConfigurationOptions": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "NodeConfigurationOptionList"
+ },
+ "DescribeScheduledActions": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "ScheduledActions"
+ },
+ "DescribeUsageLimits": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "UsageLimits"
+ },
+ "DescribeEndpointAccess": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "EndpointAccessList"
+ },
+ "DescribeEndpointAuthorization": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "EndpointAuthorizationList"
+ },
+ "DescribeDataShares": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DataShares"
+ },
+ "DescribeDataSharesForConsumer": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DataShares"
+ },
+ "DescribeDataSharesForProducer": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "DataShares"
+ },
+ "DescribeReservedNodeExchangeStatus": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "ReservedNodeExchangeStatusDetails"
+ },
+ "GetReservedNodeExchangeConfigurationOptions": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "ReservedNodeConfigurationOptionList"
+ },
+ "DescribeCustomDomainAssociations": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "Associations"
+ },
+ "DescribeInboundIntegrations": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "InboundIntegrations"
+ },
+ "DescribeRedshiftIdcApplications": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "RedshiftIdcApplications"
+ },
+ "ListRecommendations": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "Recommendations"
+ },
+ "DescribeIntegrations": {
+ "input_token": "Marker",
+ "limit_key": "MaxRecords",
+ "output_token": "Marker",
+ "result_key": "Integrations"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/redshift/2012-12-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/redshift/2012-12-01/service-2.json.gz
new file mode 100644
index 00000000..99900d82
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/redshift/2012-12-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/redshift/2012-12-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/redshift/2012-12-01/waiters-2.json
new file mode 100644
index 00000000..164e9b0d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/redshift/2012-12-01/waiters-2.json
@@ -0,0 +1,97 @@
+{
+ "version": 2,
+ "waiters": {
+ "ClusterAvailable": {
+ "delay": 60,
+ "operation": "DescribeClusters",
+ "maxAttempts": 30,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Clusters[].ClusterStatus"
+ },
+ {
+ "expected": "deleting",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Clusters[].ClusterStatus"
+ },
+ {
+ "expected": "ClusterNotFound",
+ "matcher": "error",
+ "state": "retry"
+ }
+ ]
+ },
+ "ClusterDeleted": {
+ "delay": 60,
+ "operation": "DescribeClusters",
+ "maxAttempts": 30,
+ "acceptors": [
+ {
+ "expected": "ClusterNotFound",
+ "matcher": "error",
+ "state": "success"
+ },
+ {
+ "expected": "creating",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Clusters[].ClusterStatus"
+ },
+ {
+ "expected": "modifying",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Clusters[].ClusterStatus"
+ }
+ ]
+ },
+ "ClusterRestored": {
+ "operation": "DescribeClusters",
+ "maxAttempts": 30,
+ "delay": 60,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "Clusters[].RestoreStatus.Status",
+ "expected": "completed"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "Clusters[].ClusterStatus",
+ "expected": "deleting"
+ }
+ ]
+ },
+ "SnapshotAvailable": {
+ "delay": 15,
+ "operation": "DescribeClusterSnapshots",
+ "maxAttempts": 20,
+ "acceptors": [
+ {
+ "expected": "available",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "Snapshots[].Status"
+ },
+ {
+ "expected": "failed",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Snapshots[].Status"
+ },
+ {
+ "expected": "deleted",
+ "matcher": "pathAny",
+ "state": "failure",
+ "argument": "Snapshots[].Status"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rekognition/2016-06-27/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/rekognition/2016-06-27/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..0aaa4e4e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rekognition/2016-06-27/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rekognition/2016-06-27/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/rekognition/2016-06-27/examples-1.json
new file mode 100644
index 00000000..039e04d6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rekognition/2016-06-27/examples-1.json
@@ -0,0 +1,651 @@
+{
+ "version": "1.0",
+ "examples": {
+ "CompareFaces": [
+ {
+ "input": {
+ "SimilarityThreshold": 90,
+ "SourceImage": {
+ "S3Object": {
+ "Bucket": "mybucket",
+ "Name": "mysourceimage"
+ }
+ },
+ "TargetImage": {
+ "S3Object": {
+ "Bucket": "mybucket",
+ "Name": "mytargetimage"
+ }
+ }
+ },
+ "output": {
+ "FaceMatches": [
+ {
+ "Face": {
+ "BoundingBox": {
+ "Height": 0.33481481671333313,
+ "Left": 0.31888890266418457,
+ "Top": 0.4933333396911621,
+ "Width": 0.25
+ },
+ "Confidence": 99.9991226196289
+ },
+ "Similarity": 100
+ }
+ ],
+ "SourceImageFace": {
+ "BoundingBox": {
+ "Height": 0.33481481671333313,
+ "Left": 0.31888890266418457,
+ "Top": 0.4933333396911621,
+ "Width": 0.25
+ },
+ "Confidence": 99.9991226196289
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation compares the largest face detected in the source image with each face detected in the target image.",
+ "id": "to-compare-two-images-1482181985581",
+ "title": "To compare two images"
+ }
+ ],
+ "CreateCollection": [
+ {
+ "input": {
+ "CollectionId": "myphotos"
+ },
+ "output": {
+ "CollectionArn": "aws:rekognition:us-west-2:123456789012:collection/myphotos",
+ "StatusCode": 200
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation creates a Rekognition collection for storing image data.",
+ "id": "to-create-a-collection-1481833313674",
+ "title": "To create a collection"
+ }
+ ],
+ "DeleteCollection": [
+ {
+ "input": {
+ "CollectionId": "myphotos"
+ },
+ "output": {
+ "StatusCode": 200
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation deletes a Rekognition collection.",
+ "id": "to-delete-a-collection-1481838179973",
+ "title": "To delete a collection"
+ }
+ ],
+ "DeleteFaces": [
+ {
+ "input": {
+ "CollectionId": "myphotos",
+ "FaceIds": [
+ "ff43d742-0c13-5d16-a3e8-03d3f58e980b"
+ ]
+ },
+ "output": {
+ "DeletedFaces": [
+ "ff43d742-0c13-5d16-a3e8-03d3f58e980b"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation deletes one or more faces from a Rekognition collection.",
+ "id": "to-delete-a-face-1482182799377",
+ "title": "To delete a face"
+ }
+ ],
+ "DetectFaces": [
+ {
+ "input": {
+ "Image": {
+ "S3Object": {
+ "Bucket": "mybucket",
+ "Name": "myphoto"
+ }
+ }
+ },
+ "output": {
+ "FaceDetails": [
+ {
+ "BoundingBox": {
+ "Height": 0.18000000715255737,
+ "Left": 0.5555555820465088,
+ "Top": 0.33666667342185974,
+ "Width": 0.23999999463558197
+ },
+ "Confidence": 100,
+ "Landmarks": [
+ {
+ "Type": "eyeLeft",
+ "X": 0.6394737362861633,
+ "Y": 0.40819624066352844
+ },
+ {
+ "Type": "eyeRight",
+ "X": 0.7266660928726196,
+ "Y": 0.41039225459098816
+ },
+ {
+ "Type": "eyeRight",
+ "X": 0.6912462115287781,
+ "Y": 0.44240960478782654
+ },
+ {
+ "Type": "mouthDown",
+ "X": 0.6306198239326477,
+ "Y": 0.46700039505958557
+ },
+ {
+ "Type": "mouthUp",
+ "X": 0.7215608954429626,
+ "Y": 0.47114261984825134
+ }
+ ],
+ "Pose": {
+ "Pitch": 4.050806522369385,
+ "Roll": 0.9950747489929199,
+ "Yaw": 13.693790435791016
+ },
+ "Quality": {
+ "Brightness": 37.60169982910156,
+ "Sharpness": 80
+ }
+ }
+ ],
+ "OrientationCorrection": "ROTATE_0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation detects faces in an image stored in an AWS S3 bucket.",
+ "id": "to-detect-faces-in-an-image-1481841782793",
+ "title": "To detect faces in an image"
+ }
+ ],
+ "DetectLabels": [
+ {
+ "input": {
+ "Image": {
+ "S3Object": {
+ "Bucket": "mybucket",
+ "Name": "myphoto"
+ }
+ },
+ "MaxLabels": 123,
+ "MinConfidence": 70
+ },
+ "output": {
+ "Labels": [
+ {
+ "Confidence": 99.25072479248047,
+ "Name": "People"
+ },
+ {
+ "Confidence": 99.25074005126953,
+ "Name": "Person"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation detects labels in the supplied image",
+ "id": "to-detect-labels-1481834255770",
+ "title": "To detect labels"
+ }
+ ],
+ "IndexFaces": [
+ {
+ "input": {
+ "CollectionId": "myphotos",
+ "DetectionAttributes": [
+
+ ],
+ "ExternalImageId": "myphotoid",
+ "Image": {
+ "S3Object": {
+ "Bucket": "mybucket",
+ "Name": "myphoto"
+ }
+ }
+ },
+ "output": {
+ "FaceRecords": [
+ {
+ "Face": {
+ "BoundingBox": {
+ "Height": 0.33481481671333313,
+ "Left": 0.31888890266418457,
+ "Top": 0.4933333396911621,
+ "Width": 0.25
+ },
+ "Confidence": 99.9991226196289,
+ "FaceId": "ff43d742-0c13-5d16-a3e8-03d3f58e980b",
+ "ImageId": "465f4e93-763e-51d0-b030-b9667a2d94b1"
+ },
+ "FaceDetail": {
+ "BoundingBox": {
+ "Height": 0.33481481671333313,
+ "Left": 0.31888890266418457,
+ "Top": 0.4933333396911621,
+ "Width": 0.25
+ },
+ "Confidence": 99.9991226196289,
+ "Landmarks": [
+ {
+ "Type": "eyeLeft",
+ "X": 0.3976764678955078,
+ "Y": 0.6248345971107483
+ },
+ {
+ "Type": "eyeRight",
+ "X": 0.4810936450958252,
+ "Y": 0.6317117214202881
+ },
+ {
+ "Type": "noseLeft",
+ "X": 0.41986238956451416,
+ "Y": 0.7111940383911133
+ },
+ {
+ "Type": "mouthDown",
+ "X": 0.40525302290916443,
+ "Y": 0.7497701048851013
+ },
+ {
+ "Type": "mouthUp",
+ "X": 0.4753248989582062,
+ "Y": 0.7558549642562866
+ }
+ ],
+ "Pose": {
+ "Pitch": -9.713645935058594,
+ "Roll": 4.707281112670898,
+ "Yaw": -24.438663482666016
+ },
+ "Quality": {
+ "Brightness": 29.23358917236328,
+ "Sharpness": 80
+ }
+ }
+ },
+ {
+ "Face": {
+ "BoundingBox": {
+ "Height": 0.32592591643333435,
+ "Left": 0.5144444704055786,
+ "Top": 0.15111111104488373,
+ "Width": 0.24444444477558136
+ },
+ "Confidence": 99.99950408935547,
+ "FaceId": "8be04dba-4e58-520d-850e-9eae4af70eb2",
+ "ImageId": "465f4e93-763e-51d0-b030-b9667a2d94b1"
+ },
+ "FaceDetail": {
+ "BoundingBox": {
+ "Height": 0.32592591643333435,
+ "Left": 0.5144444704055786,
+ "Top": 0.15111111104488373,
+ "Width": 0.24444444477558136
+ },
+ "Confidence": 99.99950408935547,
+ "Landmarks": [
+ {
+ "Type": "eyeLeft",
+ "X": 0.6006892323493958,
+ "Y": 0.290842205286026
+ },
+ {
+ "Type": "eyeRight",
+ "X": 0.6808141469955444,
+ "Y": 0.29609042406082153
+ },
+ {
+ "Type": "noseLeft",
+ "X": 0.6395332217216492,
+ "Y": 0.3522595763206482
+ },
+ {
+ "Type": "mouthDown",
+ "X": 0.5892083048820496,
+ "Y": 0.38689887523651123
+ },
+ {
+ "Type": "mouthUp",
+ "X": 0.674560010433197,
+ "Y": 0.394125759601593
+ }
+ ],
+ "Pose": {
+ "Pitch": -4.683138370513916,
+ "Roll": 2.1029529571533203,
+ "Yaw": 6.716655254364014
+ },
+ "Quality": {
+ "Brightness": 34.951698303222656,
+ "Sharpness": 160
+ }
+ }
+ }
+ ],
+ "OrientationCorrection": "ROTATE_0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation detects faces in an image and adds them to the specified Rekognition collection.",
+ "id": "to-add-a-face-to-a-collection-1482179542923",
+ "title": "To add a face to a collection"
+ }
+ ],
+ "ListCollections": [
+ {
+ "input": {
+ },
+ "output": {
+ "CollectionIds": [
+ "myphotos"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation returns a list of Rekognition collections.",
+ "id": "to-list-the-collections-1482179199088",
+ "title": "To list the collections"
+ }
+ ],
+ "ListFaces": [
+ {
+ "input": {
+ "CollectionId": "myphotos",
+ "MaxResults": 20
+ },
+ "output": {
+ "Faces": [
+ {
+ "BoundingBox": {
+ "Height": 0.18000000715255737,
+ "Left": 0.5555559992790222,
+ "Top": 0.336667001247406,
+ "Width": 0.23999999463558197
+ },
+ "Confidence": 100,
+ "FaceId": "1c62e8b5-69a7-5b7d-b3cd-db4338a8a7e7",
+ "ImageId": "147fdf82-7a71-52cf-819b-e786c7b9746e"
+ },
+ {
+ "BoundingBox": {
+ "Height": 0.16555599868297577,
+ "Left": 0.30963000655174255,
+ "Top": 0.7066670060157776,
+ "Width": 0.22074100375175476
+ },
+ "Confidence": 100,
+ "FaceId": "29a75abe-397b-5101-ba4f-706783b2246c",
+ "ImageId": "147fdf82-7a71-52cf-819b-e786c7b9746e"
+ },
+ {
+ "BoundingBox": {
+ "Height": 0.3234420120716095,
+ "Left": 0.3233329951763153,
+ "Top": 0.5,
+ "Width": 0.24222199618816376
+ },
+ "Confidence": 99.99829864501953,
+ "FaceId": "38271d79-7bc2-5efb-b752-398a8d575b85",
+ "ImageId": "d5631190-d039-54e4-b267-abd22c8647c5"
+ },
+ {
+ "BoundingBox": {
+ "Height": 0.03555560111999512,
+ "Left": 0.37388700246810913,
+ "Top": 0.2477779984474182,
+ "Width": 0.04747769981622696
+ },
+ "Confidence": 99.99210357666016,
+ "FaceId": "3b01bef0-c883-5654-ba42-d5ad28b720b3",
+ "ImageId": "812d9f04-86f9-54fc-9275-8d0dcbcb6784"
+ },
+ {
+ "BoundingBox": {
+ "Height": 0.05333330109715462,
+ "Left": 0.2937690019607544,
+ "Top": 0.35666701197624207,
+ "Width": 0.07121659815311432
+ },
+ "Confidence": 99.99919891357422,
+ "FaceId": "4839a608-49d0-566c-8301-509d71b534d1",
+ "ImageId": "812d9f04-86f9-54fc-9275-8d0dcbcb6784"
+ },
+ {
+ "BoundingBox": {
+ "Height": 0.3249259889125824,
+ "Left": 0.5155559778213501,
+ "Top": 0.1513350009918213,
+ "Width": 0.24333299696445465
+ },
+ "Confidence": 99.99949645996094,
+ "FaceId": "70008e50-75e4-55d0-8e80-363fb73b3a14",
+ "ImageId": "d5631190-d039-54e4-b267-abd22c8647c5"
+ },
+ {
+ "BoundingBox": {
+ "Height": 0.03777780011296272,
+ "Left": 0.7002969980239868,
+ "Top": 0.18777799606323242,
+ "Width": 0.05044509842991829
+ },
+ "Confidence": 99.92639923095703,
+ "FaceId": "7f5f88ed-d684-5a88-b0df-01e4a521552b",
+ "ImageId": "812d9f04-86f9-54fc-9275-8d0dcbcb6784"
+ },
+ {
+ "BoundingBox": {
+ "Height": 0.05555560067296028,
+ "Left": 0.13946600258350372,
+ "Top": 0.46333301067352295,
+ "Width": 0.07270029932260513
+ },
+ "Confidence": 99.99469757080078,
+ "FaceId": "895b4e2c-81de-5902-a4bd-d1792bda00b2",
+ "ImageId": "812d9f04-86f9-54fc-9275-8d0dcbcb6784"
+ },
+ {
+ "BoundingBox": {
+ "Height": 0.3259260058403015,
+ "Left": 0.5144439935684204,
+ "Top": 0.15111100673675537,
+ "Width": 0.24444399774074554
+ },
+ "Confidence": 99.99949645996094,
+ "FaceId": "8be04dba-4e58-520d-850e-9eae4af70eb2",
+ "ImageId": "465f4e93-763e-51d0-b030-b9667a2d94b1"
+ },
+ {
+ "BoundingBox": {
+ "Height": 0.18888899683952332,
+ "Left": 0.3783380091190338,
+ "Top": 0.2355560064315796,
+ "Width": 0.25222599506378174
+ },
+ "Confidence": 99.9999008178711,
+ "FaceId": "908544ad-edc3-59df-8faf-6a87cc256cf5",
+ "ImageId": "3c731605-d772-541a-a5e7-0375dbc68a07"
+ },
+ {
+ "BoundingBox": {
+ "Height": 0.33481499552726746,
+ "Left": 0.31888899207115173,
+ "Top": 0.49333301186561584,
+ "Width": 0.25
+ },
+ "Confidence": 99.99909973144531,
+ "FaceId": "ff43d742-0c13-5d16-a3e8-03d3f58e980b",
+ "ImageId": "465f4e93-763e-51d0-b030-b9667a2d94b1"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation lists the faces in a Rekognition collection.",
+ "id": "to-list-the-faces-in-a-collection-1482181416530",
+ "title": "To list the faces in a collection"
+ }
+ ],
+ "SearchFaces": [
+ {
+ "input": {
+ "CollectionId": "myphotos",
+ "FaceId": "70008e50-75e4-55d0-8e80-363fb73b3a14",
+ "FaceMatchThreshold": 90,
+ "MaxFaces": 10
+ },
+ "output": {
+ "FaceMatches": [
+ {
+ "Face": {
+ "BoundingBox": {
+ "Height": 0.3259260058403015,
+ "Left": 0.5144439935684204,
+ "Top": 0.15111100673675537,
+ "Width": 0.24444399774074554
+ },
+ "Confidence": 99.99949645996094,
+ "FaceId": "8be04dba-4e58-520d-850e-9eae4af70eb2",
+ "ImageId": "465f4e93-763e-51d0-b030-b9667a2d94b1"
+ },
+ "Similarity": 99.97222137451172
+ },
+ {
+ "Face": {
+ "BoundingBox": {
+ "Height": 0.16555599868297577,
+ "Left": 0.30963000655174255,
+ "Top": 0.7066670060157776,
+ "Width": 0.22074100375175476
+ },
+ "Confidence": 100,
+ "FaceId": "29a75abe-397b-5101-ba4f-706783b2246c",
+ "ImageId": "147fdf82-7a71-52cf-819b-e786c7b9746e"
+ },
+ "Similarity": 97.04154968261719
+ },
+ {
+ "Face": {
+ "BoundingBox": {
+ "Height": 0.18888899683952332,
+ "Left": 0.3783380091190338,
+ "Top": 0.2355560064315796,
+ "Width": 0.25222599506378174
+ },
+ "Confidence": 99.9999008178711,
+ "FaceId": "908544ad-edc3-59df-8faf-6a87cc256cf5",
+ "ImageId": "3c731605-d772-541a-a5e7-0375dbc68a07"
+ },
+ "Similarity": 95.94520568847656
+ }
+ ],
+ "SearchedFaceId": "70008e50-75e4-55d0-8e80-363fb73b3a14"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation searches for matching faces in the collection the supplied face belongs to.",
+ "id": "to-delete-a-face-1482182799377",
+ "title": "To delete a face"
+ }
+ ],
+ "SearchFacesByImage": [
+ {
+ "input": {
+ "CollectionId": "myphotos",
+ "FaceMatchThreshold": 95,
+ "Image": {
+ "S3Object": {
+ "Bucket": "mybucket",
+ "Name": "myphoto"
+ }
+ },
+ "MaxFaces": 5
+ },
+ "output": {
+ "FaceMatches": [
+ {
+ "Face": {
+ "BoundingBox": {
+ "Height": 0.3234420120716095,
+ "Left": 0.3233329951763153,
+ "Top": 0.5,
+ "Width": 0.24222199618816376
+ },
+ "Confidence": 99.99829864501953,
+ "FaceId": "38271d79-7bc2-5efb-b752-398a8d575b85",
+ "ImageId": "d5631190-d039-54e4-b267-abd22c8647c5"
+ },
+ "Similarity": 99.97036743164062
+ }
+ ],
+ "SearchedFaceBoundingBox": {
+ "Height": 0.33481481671333313,
+ "Left": 0.31888890266418457,
+ "Top": 0.4933333396911621,
+ "Width": 0.25
+ },
+ "SearchedFaceConfidence": 99.9991226196289
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation searches for faces in a Rekognition collection that match the largest face in an S3 bucket stored image.",
+ "id": "to-search-for-faces-matching-a-supplied-image-1482175994491",
+ "title": "To search for faces matching a supplied image"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rekognition/2016-06-27/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/rekognition/2016-06-27/paginators-1.json
new file mode 100644
index 00000000..436503d6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rekognition/2016-06-27/paginators-1.json
@@ -0,0 +1,64 @@
+{
+ "pagination": {
+ "ListCollections": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": [
+ "CollectionIds",
+ "FaceModelVersions"
+ ]
+ },
+ "ListFaces": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Faces",
+ "non_aggregate_keys": [
+ "FaceModelVersion"
+ ]
+ },
+ "ListStreamProcessors": {
+ "result_key": "StreamProcessors",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "DescribeProjectVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ProjectVersionDescriptions"
+ },
+ "DescribeProjects": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ProjectDescriptions"
+ },
+ "ListDatasetEntries": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "DatasetEntries"
+ },
+ "ListDatasetLabels": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "DatasetLabelDescriptions"
+ },
+ "ListProjectPolicies": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ProjectPolicies"
+ },
+ "ListUsers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Users"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rekognition/2016-06-27/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/rekognition/2016-06-27/service-2.json.gz
new file mode 100644
index 00000000..2f4fa5fc
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rekognition/2016-06-27/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rekognition/2016-06-27/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/rekognition/2016-06-27/waiters-2.json
new file mode 100644
index 00000000..c67dc623
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rekognition/2016-06-27/waiters-2.json
@@ -0,0 +1,45 @@
+{
+ "version": 2,
+ "waiters": {
+ "ProjectVersionTrainingCompleted": {
+ "description": "Wait until the ProjectVersion training completes.",
+ "operation": "DescribeProjectVersions",
+ "delay": 120,
+ "maxAttempts": 360,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "ProjectVersionDescriptions[].Status",
+ "expected": "TRAINING_COMPLETED"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "ProjectVersionDescriptions[].Status",
+ "expected": "TRAINING_FAILED"
+ }
+ ]
+ },
+ "ProjectVersionRunning": {
+ "description": "Wait until the ProjectVersion is running.",
+ "delay": 30,
+ "maxAttempts": 40,
+ "operation": "DescribeProjectVersions",
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "pathAll",
+ "argument": "ProjectVersionDescriptions[].Status",
+ "expected": "RUNNING"
+ },
+ {
+ "state": "failure",
+ "matcher": "pathAny",
+ "argument": "ProjectVersionDescriptions[].Status",
+ "expected": "FAILED"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/repostspace/2022-05-13/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/repostspace/2022-05-13/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..3badf3c8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/repostspace/2022-05-13/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/repostspace/2022-05-13/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/repostspace/2022-05-13/paginators-1.json
new file mode 100644
index 00000000..75eb51bd
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/repostspace/2022-05-13/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListSpaces": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "spaces"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/repostspace/2022-05-13/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/repostspace/2022-05-13/service-2.json.gz
new file mode 100644
index 00000000..7c4d43eb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/repostspace/2022-05-13/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/resiliencehub/2020-04-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/resiliencehub/2020-04-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..2f2ba298
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/resiliencehub/2020-04-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/resiliencehub/2020-04-30/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/resiliencehub/2020-04-30/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/resiliencehub/2020-04-30/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/resiliencehub/2020-04-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/resiliencehub/2020-04-30/paginators-1.json
new file mode 100644
index 00000000..665877a8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/resiliencehub/2020-04-30/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListAppAssessmentResourceDrifts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "resourceDrifts"
+ },
+ "ListResourceGroupingRecommendations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "groupingRecommendations"
+ },
+ "ListMetrics": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "rows"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/resiliencehub/2020-04-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/resiliencehub/2020-04-30/service-2.json.gz
new file mode 100644
index 00000000..4be0ddc8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/resiliencehub/2020-04-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/resource-explorer-2/2022-07-28/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/resource-explorer-2/2022-07-28/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..dddb88ea
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/resource-explorer-2/2022-07-28/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/resource-explorer-2/2022-07-28/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/resource-explorer-2/2022-07-28/paginators-1.json
new file mode 100644
index 00000000..ed6acb73
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/resource-explorer-2/2022-07-28/paginators-1.json
@@ -0,0 +1,46 @@
+{
+ "pagination": {
+ "ListIndexes": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Indexes"
+ },
+ "ListSupportedResourceTypes": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ResourceTypes"
+ },
+ "ListViews": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Views"
+ },
+ "Search": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Resources"
+ },
+ "ListIndexesForMembers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Indexes"
+ },
+ "ListResources": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Resources"
+ },
+ "ListManagedViews": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ManagedViews"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/resource-explorer-2/2022-07-28/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/resource-explorer-2/2022-07-28/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..92a00fe2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/resource-explorer-2/2022-07-28/paginators-1.sdk-extras.json
@@ -0,0 +1,18 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "Search": {
+ "non_aggregate_keys": [
+ "ViewArn",
+ "Count"
+ ]
+ },
+ "ListResources": {
+ "non_aggregate_keys": [
+ "ViewArn"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/resource-explorer-2/2022-07-28/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/resource-explorer-2/2022-07-28/service-2.json.gz
new file mode 100644
index 00000000..88d892a4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/resource-explorer-2/2022-07-28/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/resource-groups/2017-11-27/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/resource-groups/2017-11-27/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..ef7cf620
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/resource-groups/2017-11-27/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/resource-groups/2017-11-27/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/resource-groups/2017-11-27/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/resource-groups/2017-11-27/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/resource-groups/2017-11-27/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/resource-groups/2017-11-27/paginators-1.json
new file mode 100644
index 00000000..1210885d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/resource-groups/2017-11-27/paginators-1.json
@@ -0,0 +1,40 @@
+{
+ "pagination": {
+ "ListGroups": {
+ "result_key": [
+ "GroupIdentifiers",
+ "Groups"
+ ],
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "SearchResources": {
+ "result_key": "ResourceIdentifiers",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListGroupResources": {
+ "result_key": [
+ "ResourceIdentifiers",
+ "Resources"
+ ],
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListGroupingStatuses": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "GroupingStatuses"
+ },
+ "ListTagSyncTasks": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "TagSyncTasks"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/resource-groups/2017-11-27/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/resource-groups/2017-11-27/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..eaa52320
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/resource-groups/2017-11-27/paginators-1.sdk-extras.json
@@ -0,0 +1,12 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "ListGroupingStatuses": {
+ "non_aggregate_keys": [
+ "Group"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/resource-groups/2017-11-27/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/resource-groups/2017-11-27/service-2.json.gz
new file mode 100644
index 00000000..2b5f725a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/resource-groups/2017-11-27/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/resourcegroupstaggingapi/2017-01-26/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/resourcegroupstaggingapi/2017-01-26/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..159fbd98
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/resourcegroupstaggingapi/2017-01-26/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/resourcegroupstaggingapi/2017-01-26/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/resourcegroupstaggingapi/2017-01-26/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/resourcegroupstaggingapi/2017-01-26/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/resourcegroupstaggingapi/2017-01-26/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/resourcegroupstaggingapi/2017-01-26/paginators-1.json
new file mode 100644
index 00000000..7312afc5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/resourcegroupstaggingapi/2017-01-26/paginators-1.json
@@ -0,0 +1,26 @@
+{
+ "pagination": {
+ "GetResources": {
+ "input_token": "PaginationToken",
+ "limit_key": "ResourcesPerPage",
+ "output_token": "PaginationToken",
+ "result_key": "ResourceTagMappingList"
+ },
+ "GetTagKeys": {
+ "input_token": "PaginationToken",
+ "output_token": "PaginationToken",
+ "result_key": "TagKeys"
+ },
+ "GetTagValues": {
+ "input_token": "PaginationToken",
+ "output_token": "PaginationToken",
+ "result_key": "TagValues"
+ },
+ "GetComplianceSummary": {
+ "input_token": "PaginationToken",
+ "limit_key": "MaxResults",
+ "output_token": "PaginationToken",
+ "result_key": "SummaryList"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/resourcegroupstaggingapi/2017-01-26/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/resourcegroupstaggingapi/2017-01-26/service-2.json.gz
new file mode 100644
index 00000000..579c09b3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/resourcegroupstaggingapi/2017-01-26/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/robomaker/2018-06-29/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/robomaker/2018-06-29/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..f62c6f39
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/robomaker/2018-06-29/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/robomaker/2018-06-29/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/robomaker/2018-06-29/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/robomaker/2018-06-29/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/robomaker/2018-06-29/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/robomaker/2018-06-29/paginators-1.json
new file mode 100644
index 00000000..380e723c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/robomaker/2018-06-29/paginators-1.json
@@ -0,0 +1,70 @@
+{
+ "pagination": {
+ "ListDeploymentJobs": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "deploymentJobs"
+ },
+ "ListFleets": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "fleetDetails"
+ },
+ "ListRobotApplications": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "robotApplicationSummaries"
+ },
+ "ListRobots": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "robots"
+ },
+ "ListSimulationApplications": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "simulationApplicationSummaries"
+ },
+ "ListSimulationJobs": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "simulationJobSummaries"
+ },
+ "ListSimulationJobBatches": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "simulationJobBatchSummaries"
+ },
+ "ListWorldExportJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "worldExportJobSummaries"
+ },
+ "ListWorldGenerationJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "worldGenerationJobSummaries"
+ },
+ "ListWorldTemplates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "templateSummaries"
+ },
+ "ListWorlds": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "worldSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/robomaker/2018-06-29/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/robomaker/2018-06-29/service-2.json.gz
new file mode 100644
index 00000000..fa1db5d0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/robomaker/2018-06-29/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rolesanywhere/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/rolesanywhere/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b957678b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rolesanywhere/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rolesanywhere/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/rolesanywhere/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..97298614
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rolesanywhere/2018-05-10/paginators-1.json
@@ -0,0 +1,24 @@
+{
+ "pagination": {
+ "ListCrls": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "crls"
+ },
+ "ListProfiles": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "profiles"
+ },
+ "ListSubjects": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "subjects"
+ },
+ "ListTrustAnchors": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "trustAnchors"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rolesanywhere/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/rolesanywhere/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..e7eaf612
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rolesanywhere/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-cluster/2019-12-02/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-cluster/2019-12-02/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..3c4d8253
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-cluster/2019-12-02/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-cluster/2019-12-02/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-cluster/2019-12-02/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-cluster/2019-12-02/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-cluster/2019-12-02/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-cluster/2019-12-02/paginators-1.json
new file mode 100644
index 00000000..a2ef01b9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-cluster/2019-12-02/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListRoutingControls": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RoutingControls"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-cluster/2019-12-02/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-cluster/2019-12-02/service-2.json.gz
new file mode 100644
index 00000000..314c3c9e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-cluster/2019-12-02/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-control-config/2020-11-02/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-control-config/2020-11-02/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..bcc15545
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-control-config/2020-11-02/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-control-config/2020-11-02/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-control-config/2020-11-02/paginators-1.json
new file mode 100644
index 00000000..024682ba
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-control-config/2020-11-02/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "ListAssociatedRoute53HealthChecks": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "HealthCheckIds"
+ },
+ "ListClusters": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Clusters"
+ },
+ "ListControlPanels": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ControlPanels"
+ },
+ "ListRoutingControls": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RoutingControls"
+ },
+ "ListSafetyRules": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SafetyRules"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-control-config/2020-11-02/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-control-config/2020-11-02/service-2.json.gz
new file mode 100644
index 00000000..0e8348f0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-control-config/2020-11-02/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-control-config/2020-11-02/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-control-config/2020-11-02/waiters-2.json
new file mode 100644
index 00000000..1794757e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-control-config/2020-11-02/waiters-2.json
@@ -0,0 +1,152 @@
+{
+ "version": 2,
+ "waiters": {
+ "ClusterCreated": {
+ "description": "Wait until a cluster is created",
+ "operation": "DescribeCluster",
+ "delay": 5,
+ "maxAttempts": 26,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "Cluster.Status",
+ "expected": "DEPLOYED"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "Cluster.Status",
+ "expected": "PENDING"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ }
+ ]
+ },
+ "ClusterDeleted": {
+ "description": "Wait for a cluster to be deleted",
+ "operation": "DescribeCluster",
+ "delay": 5,
+ "maxAttempts": 26,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "status",
+ "expected": 404
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "Cluster.Status",
+ "expected": "PENDING_DELETION"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ }
+ ]
+ },
+ "ControlPanelCreated": {
+ "description": "Wait until a control panel is created",
+ "operation": "DescribeControlPanel",
+ "delay": 5,
+ "maxAttempts": 26,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "ControlPanel.Status",
+ "expected": "DEPLOYED"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "ControlPanel.Status",
+ "expected": "PENDING"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ }
+ ]
+ },
+ "ControlPanelDeleted": {
+ "description": "Wait until a control panel is deleted",
+ "operation": "DescribeControlPanel",
+ "delay": 5,
+ "maxAttempts": 26,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "status",
+ "expected": 404
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "ControlPanel.Status",
+ "expected": "PENDING_DELETION"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ }
+ ]
+ },
+ "RoutingControlCreated": {
+ "description": "Wait until a routing control is created",
+ "operation": "DescribeRoutingControl",
+ "delay": 5,
+ "maxAttempts": 26,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "path",
+ "argument": "RoutingControl.Status",
+ "expected": "DEPLOYED"
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "RoutingControl.Status",
+ "expected": "PENDING"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ }
+ ]
+ },
+ "RoutingControlDeleted": {
+ "description": "Wait for a routing control to be deleted",
+ "operation": "DescribeRoutingControl",
+ "delay": 5,
+ "maxAttempts": 26,
+ "acceptors": [
+ {
+ "state": "success",
+ "matcher": "status",
+ "expected": 404
+ },
+ {
+ "state": "retry",
+ "matcher": "path",
+ "argument": "RoutingControl.Status",
+ "expected": "PENDING_DELETION"
+ },
+ {
+ "state": "retry",
+ "matcher": "status",
+ "expected": 500
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-readiness/2019-12-02/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-readiness/2019-12-02/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..405d5da8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-readiness/2019-12-02/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-readiness/2019-12-02/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-readiness/2019-12-02/paginators-1.json
new file mode 100644
index 00000000..a71f0880
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-readiness/2019-12-02/paginators-1.json
@@ -0,0 +1,77 @@
+{
+ "pagination": {
+ "ListReadinessChecks": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ReadinessChecks"
+ },
+ "ListResourceSets": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ResourceSets"
+ },
+ "ListCells": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Cells"
+ },
+ "ListRecoveryGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RecoveryGroups"
+ },
+ "ListRules": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Rules"
+ },
+ "ListCrossAccountAuthorizations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "CrossAccountAuthorizations"
+ },
+ "GetCellReadinessSummary": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ReadinessChecks",
+ "non_aggregate_keys": [
+ "Readiness"
+ ]
+ },
+ "GetRecoveryGroupReadinessSummary": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ReadinessChecks",
+ "non_aggregate_keys": [
+ "Readiness"
+ ]
+ },
+ "GetReadinessCheckStatus": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Resources",
+ "non_aggregate_keys": [
+ "Readiness",
+ "Messages"
+ ]
+ },
+ "GetReadinessCheckResourceStatus": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Rules",
+ "non_aggregate_keys": [
+ "Readiness"
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-readiness/2019-12-02/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-readiness/2019-12-02/service-2.json.gz
new file mode 100644
index 00000000..974b7919
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53-recovery-readiness/2019-12-02/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53/2013-04-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/route53/2013-04-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..de47c0f5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53/2013-04-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53/2013-04-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/route53/2013-04-01/examples-1.json
new file mode 100644
index 00000000..d757c2b9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53/2013-04-01/examples-1.json
@@ -0,0 +1,762 @@
+{
+ "version": "1.0",
+ "examples": {
+ "AssociateVPCWithHostedZone": [
+ {
+ "input": {
+ "Comment": "",
+ "HostedZoneId": "Z3M3LMPEXAMPLE",
+ "VPC": {
+ "VPCId": "vpc-1a2b3c4d",
+ "VPCRegion": "us-east-2"
+ }
+ },
+ "output": {
+ "ChangeInfo": {
+ "Comment": "",
+ "Id": "/change/C3HC6WDB2UANE2",
+ "Status": "INSYNC",
+ "SubmittedAt": "2017-01-31T01:36:41.958Z"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ "Status": "Valid values are PENDING and INSYNC.",
+ "SubmittedAt": "The date and time are in Coordinated Universal Time (UTC) and ISO 8601 format."
+ }
+ },
+ "description": "The following example associates the VPC with ID vpc-1a2b3c4d with the hosted zone with ID Z3M3LMPEXAMPLE.",
+ "id": "to-associate-a-vpc-with-a-hosted-zone-1484069228699",
+ "title": "To associate a VPC with a hosted zone"
+ }
+ ],
+ "ChangeResourceRecordSets": [
+ {
+ "input": {
+ "ChangeBatch": {
+ "Changes": [
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "Name": "example.com",
+ "ResourceRecords": [
+ {
+ "Value": "192.0.2.44"
+ }
+ ],
+ "TTL": 60,
+ "Type": "A"
+ }
+ }
+ ],
+ "Comment": "Web server for example.com"
+ },
+ "HostedZoneId": "Z3M3LMPEXAMPLE"
+ },
+ "output": {
+ "ChangeInfo": {
+ "Comment": "Web server for example.com",
+ "Id": "/change/C2682N5HXP0BZ4",
+ "Status": "PENDING",
+ "SubmittedAt": "2017-02-10T01:36:41.958Z"
+ }
+ },
+ "comments": {
+ "input": {
+ "Action": "Valid values: CREATE, DELETE, UPSERT",
+ "TTL": "The amount of time in seconds that you want DNS resolvers to cache the values in this resource record set before submitting another request to Route 53",
+ "Value": "The value that is applicable to the value of Type. For example, if Type is A, Value is an IPv4 address"
+ },
+ "output": {
+ "SubmittedAt": "The date and time are in Coordinated Universal Time (UTC) and ISO 8601 format."
+ }
+ },
+ "description": "The following example creates a resource record set that routes Internet traffic to a resource with an IP address of 192.0.2.44.",
+ "id": "to-create-update-or-delete-resource-record-sets-1484344703668",
+ "title": "To create a basic resource record set"
+ },
+ {
+ "input": {
+ "ChangeBatch": {
+ "Changes": [
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "HealthCheckId": "abcdef11-2222-3333-4444-555555fedcba",
+ "Name": "example.com",
+ "ResourceRecords": [
+ {
+ "Value": "192.0.2.44"
+ }
+ ],
+ "SetIdentifier": "Seattle data center",
+ "TTL": 60,
+ "Type": "A",
+ "Weight": 100
+ }
+ },
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "HealthCheckId": "abcdef66-7777-8888-9999-000000fedcba",
+ "Name": "example.com",
+ "ResourceRecords": [
+ {
+ "Value": "192.0.2.45"
+ }
+ ],
+ "SetIdentifier": "Portland data center",
+ "TTL": 60,
+ "Type": "A",
+ "Weight": 200
+ }
+ }
+ ],
+ "Comment": "Web servers for example.com"
+ },
+ "HostedZoneId": "Z3M3LMPEXAMPLE"
+ },
+ "output": {
+ "ChangeInfo": {
+ "Comment": "Web servers for example.com",
+ "Id": "/change/C2682N5HXP0BZ4",
+ "Status": "PENDING",
+ "SubmittedAt": "2017-02-10T01:36:41.958Z"
+ }
+ },
+ "comments": {
+ "input": {
+ "Action": "Valid values: CREATE, DELETE, UPSERT",
+ "TTL": "The amount of time in seconds that you want DNS resolvers to cache the values in this resource record set before submitting another request to Route 53. TTLs must be the same for all weighted resource record sets that have the same name and type.",
+ "Value": "The value that is applicable to the value of Type. For example, if Type is A, Value is an IPv4 address"
+ },
+ "output": {
+ "SubmittedAt": "The date and time are in Coordinated Universal Time (UTC) and ISO 8601 format."
+ }
+ },
+ "description": "The following example creates two weighted resource record sets. The resource with a Weight of 100 will get 1/3rd of traffic (100/100+200), and the other resource will get the rest of the traffic for example.com.",
+ "id": "to-create-weighted-resource-record-sets-1484348208522",
+ "title": "To create weighted resource record sets"
+ },
+ {
+ "input": {
+ "ChangeBatch": {
+ "Changes": [
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "AliasTarget": {
+ "DNSName": "d123rk29d0stfj.cloudfront.net",
+ "EvaluateTargetHealth": false,
+ "HostedZoneId": "Z2FDTNDATAQYW2"
+ },
+ "Name": "example.com",
+ "Type": "A"
+ }
+ }
+ ],
+ "Comment": "CloudFront distribution for example.com"
+ },
+ "HostedZoneId": "Z3M3LMPEXAMPLE"
+ },
+ "output": {
+ "ChangeInfo": {
+ "Comment": "CloudFront distribution for example.com",
+ "Id": "/change/C2682N5HXP0BZ4",
+ "Status": "PENDING",
+ "SubmittedAt": "2017-02-10T01:36:41.958Z"
+ }
+ },
+ "comments": {
+ "input": {
+ "Action": "Valid values: CREATE, DELETE, UPSERT",
+ "DNSName": "The DNS name assigned to the resource",
+ "HostedZoneId": "Depends on the type of resource that you want to route traffic to",
+ "Type": "A or AAAA, depending on the type of resource that you want to route traffic to"
+ },
+ "output": {
+ "SubmittedAt": "The date and time are in Coordinated Universal Time (UTC) and ISO 8601 format."
+ }
+ },
+ "description": "The following example creates an alias resource record set that routes traffic to a CloudFront distribution.",
+ "id": "to-create-an-alias-resource-record-set-1484348404062",
+ "title": "To create an alias resource record set"
+ },
+ {
+ "input": {
+ "ChangeBatch": {
+ "Changes": [
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "AliasTarget": {
+ "DNSName": "example-com-123456789.us-east-2.elb.amazonaws.com ",
+ "EvaluateTargetHealth": true,
+ "HostedZoneId": "Z3AADJGX6KTTL2"
+ },
+ "Name": "example.com",
+ "SetIdentifier": "Ohio region",
+ "Type": "A",
+ "Weight": 100
+ }
+ },
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "AliasTarget": {
+ "DNSName": "example-com-987654321.us-west-2.elb.amazonaws.com ",
+ "EvaluateTargetHealth": true,
+ "HostedZoneId": "Z1H1FL5HABSF5"
+ },
+ "Name": "example.com",
+ "SetIdentifier": "Oregon region",
+ "Type": "A",
+ "Weight": 200
+ }
+ }
+ ],
+ "Comment": "ELB load balancers for example.com"
+ },
+ "HostedZoneId": "Z3M3LMPEXAMPLE"
+ },
+ "output": {
+ "ChangeInfo": {
+ "Comment": "ELB load balancers for example.com",
+ "Id": "/change/C2682N5HXP0BZ4",
+ "Status": "PENDING",
+ "SubmittedAt": "2017-02-10T01:36:41.958Z"
+ }
+ },
+ "comments": {
+ "input": {
+ "Action": "Valid values: CREATE, DELETE, UPSERT",
+ "DNSName": "The DNS name assigned to the resource",
+ "HostedZoneId": "Depends on the type of resource that you want to route traffic to",
+ "Type": "A or AAAA, depending on the type of resource that you want to route traffic to"
+ },
+ "output": {
+ "SubmittedAt": "The date and time are in Coordinated Universal Time (UTC) and ISO 8601 format."
+ }
+ },
+ "description": "The following example creates two weighted alias resource record sets that route traffic to ELB load balancers. The resource with a Weight of 100 will get 1/3rd of traffic (100/100+200), and the other resource will get the rest of the traffic for example.com.",
+ "id": "to-create-weighted-alias-resource-record-sets-1484349467416",
+ "title": "To create weighted alias resource record sets"
+ },
+ {
+ "input": {
+ "ChangeBatch": {
+ "Changes": [
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "HealthCheckId": "abcdef11-2222-3333-4444-555555fedcba",
+ "Name": "example.com",
+ "Region": "us-east-2",
+ "ResourceRecords": [
+ {
+ "Value": "192.0.2.44"
+ }
+ ],
+ "SetIdentifier": "Ohio region",
+ "TTL": 60,
+ "Type": "A"
+ }
+ },
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "HealthCheckId": "abcdef66-7777-8888-9999-000000fedcba",
+ "Name": "example.com",
+ "Region": "us-west-2",
+ "ResourceRecords": [
+ {
+ "Value": "192.0.2.45"
+ }
+ ],
+ "SetIdentifier": "Oregon region",
+ "TTL": 60,
+ "Type": "A"
+ }
+ }
+ ],
+ "Comment": "EC2 instances for example.com"
+ },
+ "HostedZoneId": "Z3M3LMPEXAMPLE"
+ },
+ "output": {
+ "ChangeInfo": {
+ "Comment": "EC2 instances for example.com",
+ "Id": "/change/C2682N5HXP0BZ4",
+ "Status": "PENDING",
+ "SubmittedAt": "2017-02-10T01:36:41.958Z"
+ }
+ },
+ "comments": {
+ "input": {
+ "Action": "Valid values: CREATE, DELETE, UPSERT",
+ "TTL": "The amount of time in seconds that you want DNS resolvers to cache the values in this resource record set before submitting another request to Route 53",
+ "Value": "The value that is applicable to the value of Type. For example, if Type is A, Value is an IPv4 address"
+ },
+ "output": {
+ "SubmittedAt": "The date and time are in Coordinated Universal Time (UTC) and ISO 8601 format."
+ }
+ },
+ "description": "The following example creates two latency resource record sets that route traffic to EC2 instances. Traffic for example.com is routed either to the Ohio region or the Oregon region, depending on the latency between the user and those regions.",
+ "id": "to-create-latency-resource-record-sets-1484350219917",
+ "title": "To create latency resource record sets"
+ },
+ {
+ "input": {
+ "ChangeBatch": {
+ "Changes": [
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "AliasTarget": {
+ "DNSName": "example-com-123456789.us-east-2.elb.amazonaws.com ",
+ "EvaluateTargetHealth": true,
+ "HostedZoneId": "Z3AADJGX6KTTL2"
+ },
+ "Name": "example.com",
+ "Region": "us-east-2",
+ "SetIdentifier": "Ohio region",
+ "Type": "A"
+ }
+ },
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "AliasTarget": {
+ "DNSName": "example-com-987654321.us-west-2.elb.amazonaws.com ",
+ "EvaluateTargetHealth": true,
+ "HostedZoneId": "Z1H1FL5HABSF5"
+ },
+ "Name": "example.com",
+ "Region": "us-west-2",
+ "SetIdentifier": "Oregon region",
+ "Type": "A"
+ }
+ }
+ ],
+ "Comment": "ELB load balancers for example.com"
+ },
+ "HostedZoneId": "Z3M3LMPEXAMPLE"
+ },
+ "output": {
+ "ChangeInfo": {
+ "Comment": "ELB load balancers for example.com",
+ "Id": "/change/C2682N5HXP0BZ4",
+ "Status": "PENDING",
+ "SubmittedAt": "2017-02-10T01:36:41.958Z"
+ }
+ },
+ "comments": {
+ "input": {
+ "Action": "Valid values: CREATE, DELETE, UPSERT",
+ "DNSName": "The DNS name assigned to the resource",
+ "HostedZoneId": "Depends on the type of resource that you want to route traffic to",
+ "Type": "A or AAAA, depending on the type of resource that you want to route traffic to"
+ },
+ "output": {
+ "SubmittedAt": "The date and time are in Coordinated Universal Time (UTC) and ISO 8601 format."
+ }
+ },
+ "description": "The following example creates two latency alias resource record sets that route traffic for example.com to ELB load balancers. Requests are routed either to the Ohio region or the Oregon region, depending on the latency between the user and those regions.",
+ "id": "to-create-latency-alias-resource-record-sets-1484601774179",
+ "title": "To create latency alias resource record sets"
+ },
+ {
+ "input": {
+ "ChangeBatch": {
+ "Changes": [
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "Failover": "PRIMARY",
+ "HealthCheckId": "abcdef11-2222-3333-4444-555555fedcba",
+ "Name": "example.com",
+ "ResourceRecords": [
+ {
+ "Value": "192.0.2.44"
+ }
+ ],
+ "SetIdentifier": "Ohio region",
+ "TTL": 60,
+ "Type": "A"
+ }
+ },
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "Failover": "SECONDARY",
+ "HealthCheckId": "abcdef66-7777-8888-9999-000000fedcba",
+ "Name": "example.com",
+ "ResourceRecords": [
+ {
+ "Value": "192.0.2.45"
+ }
+ ],
+ "SetIdentifier": "Oregon region",
+ "TTL": 60,
+ "Type": "A"
+ }
+ }
+ ],
+ "Comment": "Failover configuration for example.com"
+ },
+ "HostedZoneId": "Z3M3LMPEXAMPLE"
+ },
+ "output": {
+ "ChangeInfo": {
+ "Comment": "Failover configuration for example.com",
+ "Id": "/change/C2682N5HXP0BZ4",
+ "Status": "PENDING",
+ "SubmittedAt": "2017-02-10T01:36:41.958Z"
+ }
+ },
+ "comments": {
+ "input": {
+ "Action": "Valid values: CREATE, DELETE, UPSERT",
+ "TTL": "The amount of time in seconds that you want DNS resolvers to cache the values in this resource record set before submitting another request to Route 53",
+ "Value": "The value that is applicable to the value of Type. For example, if Type is A, Value is an IPv4 address"
+ },
+ "output": {
+ "SubmittedAt": "The date and time are in Coordinated Universal Time (UTC) and ISO 8601 format."
+ }
+ },
+ "description": "The following example creates primary and secondary failover resource record sets that route traffic to EC2 instances. Traffic is generally routed to the primary resource, in the Ohio region. If that resource is unavailable, traffic is routed to the secondary resource, in the Oregon region.",
+ "id": "to-create-failover-resource-record-sets-1484604541740",
+ "title": "To create failover resource record sets"
+ },
+ {
+ "input": {
+ "ChangeBatch": {
+ "Changes": [
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "AliasTarget": {
+ "DNSName": "example-com-123456789.us-east-2.elb.amazonaws.com ",
+ "EvaluateTargetHealth": true,
+ "HostedZoneId": "Z3AADJGX6KTTL2"
+ },
+ "Failover": "PRIMARY",
+ "Name": "example.com",
+ "SetIdentifier": "Ohio region",
+ "Type": "A"
+ }
+ },
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "AliasTarget": {
+ "DNSName": "example-com-987654321.us-west-2.elb.amazonaws.com ",
+ "EvaluateTargetHealth": true,
+ "HostedZoneId": "Z1H1FL5HABSF5"
+ },
+ "Failover": "SECONDARY",
+ "Name": "example.com",
+ "SetIdentifier": "Oregon region",
+ "Type": "A"
+ }
+ }
+ ],
+ "Comment": "Failover alias configuration for example.com"
+ },
+ "HostedZoneId": "Z3M3LMPEXAMPLE"
+ },
+ "output": {
+ "ChangeInfo": {
+ "Comment": "Failover alias configuration for example.com",
+ "Id": "/change/C2682N5HXP0BZ4",
+ "Status": "PENDING",
+ "SubmittedAt": "2017-02-10T01:36:41.958Z"
+ }
+ },
+ "comments": {
+ "input": {
+ "Action": "Valid values: CREATE, DELETE, UPSERT",
+ "DNSName": "The DNS name assigned to the resource",
+ "HostedZoneId": "Depends on the type of resource that you want to route traffic to",
+ "Type": "A or AAAA, depending on the type of resource that you want to route traffic to"
+ },
+ "output": {
+ "SubmittedAt": "The date and time are in Coordinated Universal Time (UTC) and ISO 8601 format."
+ }
+ },
+ "description": "The following example creates primary and secondary failover alias resource record sets that route traffic to ELB load balancers. Traffic is generally routed to the primary resource, in the Ohio region. If that resource is unavailable, traffic is routed to the secondary resource, in the Oregon region.",
+ "id": "to-create-failover-alias-resource-record-sets-1484607497724",
+ "title": "To create failover alias resource record sets"
+ },
+ {
+ "input": {
+ "ChangeBatch": {
+ "Changes": [
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "GeoLocation": {
+ "ContinentCode": "NA"
+ },
+ "Name": "example.com",
+ "ResourceRecords": [
+ {
+ "Value": "192.0.2.44"
+ }
+ ],
+ "SetIdentifier": "North America",
+ "TTL": 60,
+ "Type": "A"
+ }
+ },
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "GeoLocation": {
+ "ContinentCode": "SA"
+ },
+ "Name": "example.com",
+ "ResourceRecords": [
+ {
+ "Value": "192.0.2.45"
+ }
+ ],
+ "SetIdentifier": "South America",
+ "TTL": 60,
+ "Type": "A"
+ }
+ },
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "GeoLocation": {
+ "ContinentCode": "EU"
+ },
+ "Name": "example.com",
+ "ResourceRecords": [
+ {
+ "Value": "192.0.2.46"
+ }
+ ],
+ "SetIdentifier": "Europe",
+ "TTL": 60,
+ "Type": "A"
+ }
+ },
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "GeoLocation": {
+ "CountryCode": "*"
+ },
+ "Name": "example.com",
+ "ResourceRecords": [
+ {
+ "Value": "192.0.2.47"
+ }
+ ],
+ "SetIdentifier": "Other locations",
+ "TTL": 60,
+ "Type": "A"
+ }
+ }
+ ],
+ "Comment": "Geolocation configuration for example.com"
+ },
+ "HostedZoneId": "Z3M3LMPEXAMPLE"
+ },
+ "output": {
+ "ChangeInfo": {
+ "Comment": "Geolocation configuration for example.com",
+ "Id": "/change/C2682N5HXP0BZ4",
+ "Status": "PENDING",
+ "SubmittedAt": "2017-02-10T01:36:41.958Z"
+ }
+ },
+ "comments": {
+ "input": {
+ "Action": "Valid values: CREATE, DELETE, UPSERT",
+ "TTL": "The amount of time in seconds that you want DNS resolvers to cache the values in this resource record set before submitting another request to Route 53",
+ "Value": "The value that is applicable to the value of Type. For example, if Type is A, Value is an IPv4 address"
+ },
+ "output": {
+ "SubmittedAt": "The date and time are in Coordinated Universal Time (UTC) and ISO 8601 format."
+ }
+ },
+ "description": "The following example creates four geolocation resource record sets that use IPv4 addresses to route traffic to resources such as web servers running on EC2 instances. Traffic is routed to one of four IP addresses, for North America (NA), for South America (SA), for Europe (EU), and for all other locations (*).",
+ "id": "to-create-geolocation-resource-record-sets-1484612462466",
+ "title": "To create geolocation resource record sets"
+ },
+ {
+ "input": {
+ "ChangeBatch": {
+ "Changes": [
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "AliasTarget": {
+ "DNSName": "example-com-123456789.us-east-2.elb.amazonaws.com ",
+ "EvaluateTargetHealth": true,
+ "HostedZoneId": "Z3AADJGX6KTTL2"
+ },
+ "GeoLocation": {
+ "ContinentCode": "NA"
+ },
+ "Name": "example.com",
+ "SetIdentifier": "North America",
+ "Type": "A"
+ }
+ },
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "AliasTarget": {
+ "DNSName": "example-com-234567890.sa-east-1.elb.amazonaws.com ",
+ "EvaluateTargetHealth": true,
+ "HostedZoneId": "Z2P70J7HTTTPLU"
+ },
+ "GeoLocation": {
+ "ContinentCode": "SA"
+ },
+ "Name": "example.com",
+ "SetIdentifier": "South America",
+ "Type": "A"
+ }
+ },
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "AliasTarget": {
+ "DNSName": "example-com-234567890.eu-central-1.elb.amazonaws.com ",
+ "EvaluateTargetHealth": true,
+ "HostedZoneId": "Z215JYRZR1TBD5"
+ },
+ "GeoLocation": {
+ "ContinentCode": "EU"
+ },
+ "Name": "example.com",
+ "SetIdentifier": "Europe",
+ "Type": "A"
+ }
+ },
+ {
+ "Action": "CREATE",
+ "ResourceRecordSet": {
+ "AliasTarget": {
+ "DNSName": "example-com-234567890.ap-southeast-1.elb.amazonaws.com ",
+ "EvaluateTargetHealth": true,
+ "HostedZoneId": "Z1LMS91P8CMLE5"
+ },
+ "GeoLocation": {
+ "CountryCode": "*"
+ },
+ "Name": "example.com",
+ "SetIdentifier": "Other locations",
+ "Type": "A"
+ }
+ }
+ ],
+ "Comment": "Geolocation alias configuration for example.com"
+ },
+ "HostedZoneId": "Z3M3LMPEXAMPLE"
+ },
+ "output": {
+ "ChangeInfo": {
+ "Comment": "Geolocation alias configuration for example.com",
+ "Id": "/change/C2682N5HXP0BZ4",
+ "Status": "PENDING",
+ "SubmittedAt": "2017-02-10T01:36:41.958Z"
+ }
+ },
+ "comments": {
+ "input": {
+ "Action": "Valid values: CREATE, DELETE, UPSERT",
+ "DNSName": "The DNS name assigned to the resource",
+ "HostedZoneId": "Depends on the type of resource that you want to route traffic to",
+ "Type": "A or AAAA, depending on the type of resource that you want to route traffic to"
+ },
+ "output": {
+ "SubmittedAt": "The date and time are in Coordinated Universal Time (UTC) and ISO 8601 format."
+ }
+ },
+ "description": "The following example creates four geolocation alias resource record sets that route traffic to ELB load balancers. Traffic is routed to one of four IP addresses, for North America (NA), for South America (SA), for Europe (EU), and for all other locations (*).",
+ "id": "to-create-geolocation-alias-resource-record-sets-1484612871203",
+ "title": "To create geolocation alias resource record sets"
+ }
+ ],
+ "ChangeTagsForResource": [
+ {
+ "input": {
+ "AddTags": [
+ {
+ "Key": "apex",
+ "Value": "3874"
+ },
+ {
+ "Key": "acme",
+ "Value": "4938"
+ }
+ ],
+ "RemoveTagKeys": [
+ "Nadir"
+ ],
+ "ResourceId": "Z3M3LMPEXAMPLE",
+ "ResourceType": "hostedzone"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ "ResourceType": "Valid values are healthcheck and hostedzone."
+ },
+ "output": {
+ }
+ },
+ "description": "The following example adds two tags and removes one tag from the hosted zone with ID Z3M3LMPEXAMPLE.",
+ "id": "to-add-or-remove-tags-from-a-hosted-zone-or-health-check-1484084752409",
+ "title": "To add or remove tags from a hosted zone or health check"
+ }
+ ],
+ "GetHostedZone": [
+ {
+ "input": {
+ "Id": "Z3M3LMPEXAMPLE"
+ },
+ "output": {
+ "DelegationSet": {
+ "NameServers": [
+ "ns-2048.awsdns-64.com",
+ "ns-2049.awsdns-65.net",
+ "ns-2050.awsdns-66.org",
+ "ns-2051.awsdns-67.co.uk"
+ ]
+ },
+ "HostedZone": {
+ "CallerReference": "C741617D-04E4-F8DE-B9D7-0D150FC61C2E",
+ "Config": {
+ "PrivateZone": false
+ },
+ "Id": "/hostedzone/Z3M3LMPEXAMPLE",
+ "Name": "myawsbucket.com.",
+ "ResourceRecordSetCount": 8
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ "Id": "The ID of the hosted zone that you specified in the GetHostedZone request.",
+ "Name": "The name of the hosted zone.",
+ "NameServers": "The servers that you specify in your domain configuration.",
+ "PrivateZone": "True if this is a private hosted zone, false if it's a public hosted zone."
+ }
+ },
+ "description": "The following example gets information about the Z3M3LMPEXAMPLE hosted zone.",
+ "id": "to-get-information-about-a-hosted-zone-1481752361124",
+ "title": "To get information about a hosted zone"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53/2013-04-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/route53/2013-04-01/paginators-1.json
new file mode 100644
index 00000000..2c370965
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53/2013-04-01/paginators-1.json
@@ -0,0 +1,67 @@
+{
+ "pagination": {
+ "ListHealthChecks": {
+ "input_token": "Marker",
+ "output_token": "NextMarker",
+ "more_results": "IsTruncated",
+ "limit_key": "MaxItems",
+ "result_key": "HealthChecks"
+ },
+ "ListHostedZones": {
+ "input_token": "Marker",
+ "output_token": "NextMarker",
+ "more_results": "IsTruncated",
+ "limit_key": "MaxItems",
+ "result_key": "HostedZones"
+ },
+ "ListResourceRecordSets": {
+ "more_results": "IsTruncated",
+ "limit_key": "MaxItems",
+ "result_key": "ResourceRecordSets",
+ "input_token": [
+ "StartRecordName",
+ "StartRecordType",
+ "StartRecordIdentifier"
+ ],
+ "output_token": [
+ "NextRecordName",
+ "NextRecordType",
+ "NextRecordIdentifier"
+ ]
+ },
+ "ListVPCAssociationAuthorizations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "non_aggregate_keys": [
+ "HostedZoneId"
+ ],
+ "result_key": [
+ "VPCs"
+ ]
+ },
+ "ListQueryLoggingConfigs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "QueryLoggingConfigs"
+ },
+ "ListCidrBlocks": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "CidrBlocks"
+ },
+ "ListCidrCollections": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "CidrCollections"
+ },
+ "ListCidrLocations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "CidrLocations"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53/2013-04-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/route53/2013-04-01/service-2.json.gz
new file mode 100644
index 00000000..ef0bd4cb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53/2013-04-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53/2013-04-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/route53/2013-04-01/waiters-2.json
new file mode 100644
index 00000000..94aad399
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53/2013-04-01/waiters-2.json
@@ -0,0 +1,18 @@
+{
+ "version": 2,
+ "waiters": {
+ "ResourceRecordSetsChanged": {
+ "delay": 30,
+ "maxAttempts": 60,
+ "operation": "GetChange",
+ "acceptors": [
+ {
+ "matcher": "path",
+ "expected": "INSYNC",
+ "argument": "ChangeInfo.Status",
+ "state": "success"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53domains/2014-05-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/route53domains/2014-05-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..22257665
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53domains/2014-05-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53domains/2014-05-15/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/route53domains/2014-05-15/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53domains/2014-05-15/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53domains/2014-05-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/route53domains/2014-05-15/paginators-1.json
new file mode 100644
index 00000000..c2f5cbcb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53domains/2014-05-15/paginators-1.json
@@ -0,0 +1,29 @@
+{
+ "version": "1.0",
+ "pagination": {
+ "ListDomains": {
+ "limit_key": "MaxItems",
+ "input_token": "Marker",
+ "output_token": "NextPageMarker",
+ "result_key": "Domains"
+ },
+ "ListOperations": {
+ "limit_key": "MaxItems",
+ "input_token": "Marker",
+ "output_token": "NextPageMarker",
+ "result_key": "Operations"
+ },
+ "ViewBilling": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "output_token": "NextPageMarker",
+ "result_key": "BillingRecords"
+ },
+ "ListPrices": {
+ "input_token": "Marker",
+ "limit_key": "MaxItems",
+ "output_token": "NextPageMarker",
+ "result_key": "Prices"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53domains/2014-05-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/route53domains/2014-05-15/service-2.json.gz
new file mode 100644
index 00000000..cc13594a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53domains/2014-05-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53profiles/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/route53profiles/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..885e99a5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53profiles/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53profiles/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/route53profiles/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..a321bb7c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53profiles/2018-05-10/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListProfileAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ProfileAssociations"
+ },
+ "ListProfileResourceAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ProfileResourceAssociations"
+ },
+ "ListProfiles": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ProfileSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53profiles/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/route53profiles/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..c9123a7c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53profiles/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53resolver/2018-04-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/route53resolver/2018-04-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..d6603631
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53resolver/2018-04-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53resolver/2018-04-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/route53resolver/2018-04-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53resolver/2018-04-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53resolver/2018-04-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/route53resolver/2018-04-01/paginators-1.json
new file mode 100644
index 00000000..d6529438
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53resolver/2018-04-01/paginators-1.json
@@ -0,0 +1,100 @@
+{
+ "pagination": {
+ "ListTagsForResource": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Tags"
+ },
+ "ListResolverEndpointIpAddresses": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "IpAddresses"
+ },
+ "ListResolverEndpoints": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ResolverEndpoints"
+ },
+ "ListResolverQueryLogConfigAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ResolverQueryLogConfigAssociations"
+ },
+ "ListResolverQueryLogConfigs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ResolverQueryLogConfigs"
+ },
+ "ListResolverRuleAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ResolverRuleAssociations"
+ },
+ "ListResolverRules": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ResolverRules"
+ },
+ "ListResolverDnssecConfigs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ResolverDnssecConfigs"
+ },
+ "ListFirewallConfigs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "FirewallConfigs"
+ },
+ "ListFirewallDomainLists": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "FirewallDomainLists"
+ },
+ "ListFirewallDomains": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Domains"
+ },
+ "ListFirewallRuleGroupAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "FirewallRuleGroupAssociations"
+ },
+ "ListFirewallRuleGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "FirewallRuleGroups"
+ },
+ "ListFirewallRules": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "FirewallRules"
+ },
+ "ListResolverConfigs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ResolverConfigs"
+ },
+ "ListOutpostResolvers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "OutpostResolvers"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53resolver/2018-04-01/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/route53resolver/2018-04-01/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..68087936
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53resolver/2018-04-01/paginators-1.sdk-extras.json
@@ -0,0 +1,39 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "ListResolverEndpointIpAddresses": {
+ "non_aggregate_keys": [
+ "MaxResults"
+ ]
+ },
+ "ListResolverEndpoints": {
+ "non_aggregate_keys": [
+ "MaxResults"
+ ]
+ },
+ "ListResolverQueryLogConfigAssociations": {
+ "non_aggregate_keys": [
+ "TotalCount",
+ "TotalFilteredCount"
+ ]
+ },
+ "ListResolverQueryLogConfigs": {
+ "non_aggregate_keys": [
+ "TotalCount",
+ "TotalFilteredCount"
+ ]
+ },
+ "ListResolverRuleAssociations": {
+ "non_aggregate_keys": [
+ "MaxResults"
+ ]
+ },
+ "ListResolverRules": {
+ "non_aggregate_keys": [
+ "MaxResults"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/route53resolver/2018-04-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/route53resolver/2018-04-01/service-2.json.gz
new file mode 100644
index 00000000..0d2e7a92
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/route53resolver/2018-04-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rum/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/rum/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..cbd877ee
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rum/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rum/2018-05-10/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/rum/2018-05-10/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rum/2018-05-10/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rum/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/rum/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..1a044920
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rum/2018-05-10/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "GetAppMonitorData": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Events"
+ },
+ "ListAppMonitors": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AppMonitorSummaries"
+ },
+ "BatchGetRumMetricDefinitions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "MetricDefinitions"
+ },
+ "ListRumMetricsDestinations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Destinations"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/rum/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/rum/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..bd14cc73
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/rum/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..f2df6cc7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/examples-1.json
new file mode 100644
index 00000000..38a47bb3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/examples-1.json
@@ -0,0 +1,1843 @@
+{
+ "version": "1.0",
+ "examples": {
+ "AbortMultipartUpload": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "Key": "bigobject",
+ "UploadId": "xadcOB_7YPBOJuoFiQ9cz4P3Pe6FIZwO4f7wN93uHsNBEw97pl5eNwzExg0LAT2dUN91cOmrEQHDsP3WA60CEg--"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example aborts a multipart upload.",
+ "id": "to-abort-a-multipart-upload-1481853354987",
+ "title": "To abort a multipart upload"
+ }
+ ],
+ "CompleteMultipartUpload": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "Key": "bigobject",
+ "MultipartUpload": {
+ "Parts": [
+ {
+ "ETag": "\"d8c2eafd90c266e19ab9dcacc479f8af\"",
+ "PartNumber": "1"
+ },
+ {
+ "ETag": "\"d8c2eafd90c266e19ab9dcacc479f8af\"",
+ "PartNumber": "2"
+ }
+ ]
+ },
+ "UploadId": "7YPBOJuoFiQ9cz4P3Pe6FIZwO4f7wN93uHsNBEw97pl5eNwzExg0LAT2dUN91cOmrEQHDsP3WA60CEg--"
+ },
+ "output": {
+ "Bucket": "acexamplebucket",
+ "ETag": "\"4d9031c7644d8081c2829f4ea23c55f7-2\"",
+ "Key": "bigobject",
+ "Location": "https://examplebucket.s3.amazonaws.com/bigobject"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example completes a multipart upload.",
+ "id": "to-complete-multipart-upload-1481851590483",
+ "title": "To complete multipart upload"
+ }
+ ],
+ "CopyObject": [
+ {
+ "input": {
+ "Bucket": "destinationbucket",
+ "CopySource": "/sourcebucket/HappyFacejpg",
+ "Key": "HappyFaceCopyjpg"
+ },
+ "output": {
+ "CopyObjectResult": {
+ "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"",
+ "LastModified": "2016-12-15T17:38:53.000Z"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example copies an object from one bucket to another.",
+ "id": "to-copy-an-object-1481823186878",
+ "title": "To copy an object"
+ }
+ ],
+ "CreateBucket": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "CreateBucketConfiguration": {
+ "LocationConstraint": "eu-west-1"
+ }
+ },
+ "output": {
+ "Location": "http://examplebucket.s3.amazonaws.com/"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates a bucket. The request specifies an AWS region where to create the bucket.",
+ "id": "to-create-a-bucket-in-a-specific-region-1483399072992",
+ "title": "To create a bucket in a specific region"
+ },
+ {
+ "input": {
+ "Bucket": "examplebucket"
+ },
+ "output": {
+ "Location": "/examplebucket"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates a bucket.",
+ "id": "to-create-a-bucket--1472851826060",
+ "title": "To create a bucket "
+ }
+ ],
+ "CreateMultipartUpload": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "Key": "largeobject"
+ },
+ "output": {
+ "Bucket": "examplebucket",
+ "Key": "largeobject",
+ "UploadId": "ibZBv_75gd9r8lH_gqXatLdxMVpAlj6ZQjEs.OwyF3953YdwbcQnMA2BLGn8Lx12fQNICtMw5KyteFeHw.Sjng--"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example initiates a multipart upload.",
+ "id": "to-initiate-a-multipart-upload-1481836794513",
+ "title": "To initiate a multipart upload"
+ }
+ ],
+ "DeleteBucket": [
+ {
+ "input": {
+ "Bucket": "forrandall2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes the specified bucket.",
+ "id": "to-delete-a-bucket-1473108514262",
+ "title": "To delete a bucket"
+ }
+ ],
+ "DeleteBucketCors": [
+ {
+ "input": {
+ "Bucket": "examplebucket"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes CORS configuration on a bucket.",
+ "id": "to-delete-cors-configuration-on-a-bucket-1483042856112",
+ "title": "To delete cors configuration on a bucket."
+ }
+ ],
+ "DeleteBucketLifecycle": [
+ {
+ "input": {
+ "Bucket": "examplebucket"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes lifecycle configuration on a bucket.",
+ "id": "to-delete-lifecycle-configuration-on-a-bucket-1483043310583",
+ "title": "To delete lifecycle configuration on a bucket."
+ }
+ ],
+ "DeleteBucketPolicy": [
+ {
+ "input": {
+ "Bucket": "examplebucket"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes bucket policy on the specified bucket.",
+ "id": "to-delete-bucket-policy-1483043406577",
+ "title": "To delete bucket policy"
+ }
+ ],
+ "DeleteBucketReplication": [
+ {
+ "input": {
+ "Bucket": "example"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes replication configuration set on bucket.",
+ "id": "to-delete-bucket-replication-configuration-1483043684668",
+ "title": "To delete bucket replication configuration"
+ }
+ ],
+ "DeleteBucketTagging": [
+ {
+ "input": {
+ "Bucket": "examplebucket"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes bucket tags.",
+ "id": "to-delete-bucket-tags-1483043846509",
+ "title": "To delete bucket tags"
+ }
+ ],
+ "DeleteBucketWebsite": [
+ {
+ "input": {
+ "Bucket": "examplebucket"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes bucket website configuration.",
+ "id": "to-delete-bucket-website-configuration-1483043937825",
+ "title": "To delete bucket website configuration"
+ }
+ ],
+ "DeleteObject": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "Key": "objectkey.jpg"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes an object from an S3 bucket.",
+ "id": "to-delete-an-object-1472850136595",
+ "title": "To delete an object"
+ },
+ {
+ "input": {
+ "Bucket": "ExampleBucket",
+ "Key": "HappyFace.jpg"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes an object from a non-versioned bucket.",
+ "id": "to-delete-an-object-from-a-non-versioned-bucket-1481588533089",
+ "title": "To delete an object (from a non-versioned bucket)"
+ }
+ ],
+ "DeleteObjectTagging": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "Key": "HappyFace.jpg",
+ "VersionId": "ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI"
+ },
+ "output": {
+ "VersionId": "ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example removes tag set associated with the specified object version. The request specifies both the object key and object version.",
+ "id": "to-remove-tag-set-from-an-object-version-1483145285913",
+ "title": "To remove tag set from an object version"
+ },
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "Key": "HappyFace.jpg"
+ },
+ "output": {
+ "VersionId": "null"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example removes tag set associated with the specified object. If the bucket is versioning enabled, the operation removes tag set from the latest object version.",
+ "id": "to-remove-tag-set-from-an-object-1483145342862",
+ "title": "To remove tag set from an object"
+ }
+ ],
+ "DeleteObjects": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "Delete": {
+ "Objects": [
+ {
+ "Key": "HappyFace.jpg",
+ "VersionId": "2LWg7lQLnY41.maGB5Z6SWW.dcq0vx7b"
+ },
+ {
+ "Key": "HappyFace.jpg",
+ "VersionId": "yoz3HB.ZhCS_tKVEmIOr7qYyyAaZSKVd"
+ }
+ ],
+ "Quiet": false
+ }
+ },
+ "output": {
+ "Deleted": [
+ {
+ "Key": "HappyFace.jpg",
+ "VersionId": "yoz3HB.ZhCS_tKVEmIOr7qYyyAaZSKVd"
+ },
+ {
+ "Key": "HappyFace.jpg",
+ "VersionId": "2LWg7lQLnY41.maGB5Z6SWW.dcq0vx7b"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes objects from a bucket. The request specifies object versions. S3 deletes specific object versions and returns the key and versions of deleted objects in the response.",
+ "id": "to-delete-multiple-object-versions-from-a-versioned-bucket-1483147087737",
+ "title": "To delete multiple object versions from a versioned bucket"
+ },
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "Delete": {
+ "Objects": [
+ {
+ "Key": "objectkey1"
+ },
+ {
+ "Key": "objectkey2"
+ }
+ ],
+ "Quiet": false
+ }
+ },
+ "output": {
+ "Deleted": [
+ {
+ "DeleteMarker": "true",
+ "DeleteMarkerVersionId": "A._w1z6EFiCF5uhtQMDal9JDkID9tQ7F",
+ "Key": "objectkey1"
+ },
+ {
+ "DeleteMarker": "true",
+ "DeleteMarkerVersionId": "iOd_ORxhkKe_e8G8_oSGxt2PjsCZKlkt",
+ "Key": "objectkey2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes objects from a bucket. The bucket is versioned, and the request does not specify the object version to delete. In this case, all versions remain in the bucket and S3 adds a delete marker.",
+ "id": "to-delete-multiple-objects-from-a-versioned-bucket-1483146248805",
+ "title": "To delete multiple objects from a versioned bucket"
+ }
+ ],
+ "GetBucketCors": [
+ {
+ "input": {
+ "Bucket": "examplebucket"
+ },
+ "output": {
+ "CORSRules": [
+ {
+ "AllowedHeaders": [
+ "Authorization"
+ ],
+ "AllowedMethods": [
+ "GET"
+ ],
+ "AllowedOrigins": [
+ "*"
+ ],
+ "MaxAgeSeconds": 3000
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns cross-origin resource sharing (CORS) configuration set on a bucket.",
+ "id": "to-get-cors-configuration-set-on-a-bucket-1481596855475",
+ "title": "To get cors configuration set on a bucket"
+ }
+ ],
+ "GetBucketLifecycle": [
+ {
+ "input": {
+ "Bucket": "acl1"
+ },
+ "output": {
+ "Rules": [
+ {
+ "Expiration": {
+ "Days": 1
+ },
+ "ID": "delete logs",
+ "Prefix": "123/",
+ "Status": "Enabled"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example gets ACL on the specified bucket.",
+ "id": "to-get-a-bucket-acl-1474413606503",
+ "title": "To get a bucket acl"
+ }
+ ],
+ "GetBucketLifecycleConfiguration": [
+ {
+ "input": {
+ "Bucket": "examplebucket"
+ },
+ "output": {
+ "Rules": [
+ {
+ "ID": "Rule for TaxDocs/",
+ "Prefix": "TaxDocs",
+ "Status": "Enabled",
+ "Transitions": [
+ {
+ "Days": 365,
+ "StorageClass": "STANDARD_IA"
+ }
+ ]
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example retrieves lifecycle configuration on set on a bucket. ",
+ "id": "to-get-lifecycle-configuration-on-a-bucket-1481666063200",
+ "title": "To get lifecycle configuration on a bucket"
+ }
+ ],
+ "GetBucketLocation": [
+ {
+ "input": {
+ "Bucket": "examplebucket"
+ },
+ "output": {
+ "LocationConstraint": "us-west-2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns bucket location.",
+ "id": "to-get-bucket-location-1481594573609",
+ "title": "To get bucket location"
+ }
+ ],
+ "GetBucketNotification": [
+ {
+ "input": {
+ "Bucket": "examplebucket"
+ },
+ "output": {
+ "QueueConfiguration": {
+ "Event": "s3:ObjectCreated:Put",
+ "Events": [
+ "s3:ObjectCreated:Put"
+ ],
+ "Id": "MDQ2OGQ4NDEtOTBmNi00YTM4LTk0NzYtZDIwN2I3NWQ1NjIx",
+ "Queue": "arn:aws:sqs:us-east-1:acct-id:S3ObjectCreatedEventQueue"
+ },
+ "TopicConfiguration": {
+ "Event": "s3:ObjectCreated:Copy",
+ "Events": [
+ "s3:ObjectCreated:Copy"
+ ],
+ "Id": "YTVkMWEzZGUtNTY1NS00ZmE2LWJjYjktMmRlY2QwODFkNTJi",
+ "Topic": "arn:aws:sns:us-east-1:acct-id:S3ObjectCreatedEventTopic"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns notification configuration set on a bucket.",
+ "id": "to-get-notification-configuration-set-on-a-bucket-1481594028667",
+ "title": "To get notification configuration set on a bucket"
+ },
+ {
+ "input": {
+ "Bucket": "examplebucket"
+ },
+ "output": {
+ "QueueConfiguration": {
+ "Event": "s3:ObjectCreated:Put",
+ "Events": [
+ "s3:ObjectCreated:Put"
+ ],
+ "Id": "MDQ2OGQ4NDEtOTBmNi00YTM4LTk0NzYtZDIwN2I3NWQ1NjIx",
+ "Queue": "arn:aws:sqs:us-east-1:acct-id:S3ObjectCreatedEventQueue"
+ },
+ "TopicConfiguration": {
+ "Event": "s3:ObjectCreated:Copy",
+ "Events": [
+ "s3:ObjectCreated:Copy"
+ ],
+ "Id": "YTVkMWEzZGUtNTY1NS00ZmE2LWJjYjktMmRlY2QwODFkNTJi",
+ "Topic": "arn:aws:sns:us-east-1:acct-id:S3ObjectCreatedEventTopic"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns notification configuration set on a bucket.",
+ "id": "to-get-notification-configuration-set-on-a-bucket-1481594028667",
+ "title": "To get notification configuration set on a bucket"
+ }
+ ],
+ "GetBucketPolicy": [
+ {
+ "input": {
+ "Bucket": "examplebucket"
+ },
+ "output": {
+ "Policy": "{\"Version\":\"2008-10-17\",\"Id\":\"LogPolicy\",\"Statement\":[{\"Sid\":\"Enables the log delivery group to publish logs to your bucket \",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"111122223333\"},\"Action\":[\"s3:GetBucketAcl\",\"s3:GetObjectAcl\",\"s3:PutObject\"],\"Resource\":[\"arn:aws:s3:::policytest1/*\",\"arn:aws:s3:::policytest1\"]}]}"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns bucket policy associated with a bucket.",
+ "id": "to-get-bucket-policy-1481595098424",
+ "title": "To get bucket policy"
+ }
+ ],
+ "GetBucketReplication": [
+ {
+ "input": {
+ "Bucket": "examplebucket"
+ },
+ "output": {
+ "ReplicationConfiguration": {
+ "Role": "arn:aws:iam::acct-id:role/example-role",
+ "Rules": [
+ {
+ "Destination": {
+ "Bucket": "arn:aws:s3:::destination-bucket"
+ },
+ "ID": "MWIwNTkwZmItMTE3MS00ZTc3LWJkZDEtNzRmODQwYzc1OTQy",
+ "Prefix": "Tax",
+ "Status": "Enabled"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns replication configuration set on a bucket.",
+ "id": "to-get-replication-configuration-set-on-a-bucket-1481593597175",
+ "title": "To get replication configuration set on a bucket"
+ }
+ ],
+ "GetBucketRequestPayment": [
+ {
+ "input": {
+ "Bucket": "examplebucket"
+ },
+ "output": {
+ "Payer": "BucketOwner"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example retrieves bucket versioning configuration.",
+ "id": "to-get-bucket-versioning-configuration-1483037183929",
+ "title": "To get bucket versioning configuration"
+ }
+ ],
+ "GetBucketTagging": [
+ {
+ "input": {
+ "Bucket": "examplebucket"
+ },
+ "output": {
+ "TagSet": [
+ {
+ "Key": "key1",
+ "Value": "value1"
+ },
+ {
+ "Key": "key2",
+ "Value": "value2"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns tag set associated with a bucket",
+ "id": "to-get-tag-set-associated-with-a-bucket-1481593232107",
+ "title": "To get tag set associated with a bucket"
+ }
+ ],
+ "GetBucketVersioning": [
+ {
+ "input": {
+ "Bucket": "examplebucket"
+ },
+ "output": {
+ "MFADelete": "Disabled",
+ "Status": "Enabled"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example retrieves bucket versioning configuration.",
+ "id": "to-get-bucket-versioning-configuration-1483037183929",
+ "title": "To get bucket versioning configuration"
+ }
+ ],
+ "GetBucketWebsite": [
+ {
+ "input": {
+ "Bucket": "examplebucket"
+ },
+ "output": {
+ "ErrorDocument": {
+ "Key": "error.html"
+ },
+ "IndexDocument": {
+ "Suffix": "index.html"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example retrieves website configuration of a bucket.",
+ "id": "to-get-bucket-website-configuration-1483037016926",
+ "title": "To get bucket website configuration"
+ }
+ ],
+ "GetObject": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "Key": "HappyFace.jpg"
+ },
+ "output": {
+ "AcceptRanges": "bytes",
+ "ContentLength": "3191",
+ "ContentType": "image/jpeg",
+ "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"",
+ "LastModified": "Thu, 15 Dec 2016 01:19:41 GMT",
+ "Metadata": {
+ },
+ "TagCount": 2,
+ "VersionId": "null"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example retrieves an object for an S3 bucket.",
+ "id": "to-retrieve-an-object-1481827837012",
+ "title": "To retrieve an object"
+ },
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "Key": "SampleFile.txt",
+ "Range": "bytes=0-9"
+ },
+ "output": {
+ "AcceptRanges": "bytes",
+ "ContentLength": "10",
+ "ContentRange": "bytes 0-9/43",
+ "ContentType": "text/plain",
+ "ETag": "\"0d94420ffd0bc68cd3d152506b97a9cc\"",
+ "LastModified": "Thu, 09 Oct 2014 22:57:28 GMT",
+ "Metadata": {
+ },
+ "VersionId": "null"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example retrieves an object for an S3 bucket. The request specifies the range header to retrieve a specific byte range.",
+ "id": "to-retrieve-a-byte-range-of-an-object--1481832674603",
+ "title": "To retrieve a byte range of an object "
+ }
+ ],
+ "GetObjectAcl": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "Key": "HappyFace.jpg"
+ },
+ "output": {
+ "Grants": [
+ {
+ "Grantee": {
+ "DisplayName": "owner-display-name",
+ "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc",
+ "Type": "CanonicalUser"
+ },
+ "Permission": "WRITE"
+ },
+ {
+ "Grantee": {
+ "DisplayName": "owner-display-name",
+ "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc",
+ "Type": "CanonicalUser"
+ },
+ "Permission": "WRITE_ACP"
+ },
+ {
+ "Grantee": {
+ "DisplayName": "owner-display-name",
+ "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc",
+ "Type": "CanonicalUser"
+ },
+ "Permission": "READ"
+ },
+ {
+ "Grantee": {
+ "DisplayName": "owner-display-name",
+ "ID": "852b113eexamplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc",
+ "Type": "CanonicalUser"
+ },
+ "Permission": "READ_ACP"
+ }
+ ],
+ "Owner": {
+ "DisplayName": "owner-display-name",
+ "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example retrieves access control list (ACL) of an object.",
+ "id": "to-retrieve-object-acl-1481833557740",
+ "title": "To retrieve object ACL"
+ }
+ ],
+ "GetObjectTagging": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "Key": "HappyFace.jpg"
+ },
+ "output": {
+ "TagSet": [
+ {
+ "Key": "Key4",
+ "Value": "Value4"
+ },
+ {
+ "Key": "Key3",
+ "Value": "Value3"
+ }
+ ],
+ "VersionId": "null"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example retrieves tag set of an object.",
+ "id": "to-retrieve-tag-set-of-an-object-1481833847896",
+ "title": "To retrieve tag set of an object"
+ },
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "Key": "exampleobject",
+ "VersionId": "ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI"
+ },
+ "output": {
+ "TagSet": [
+ {
+ "Key": "Key1",
+ "Value": "Value1"
+ }
+ ],
+ "VersionId": "ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example retrieves tag set of an object. The request specifies object version.",
+ "id": "to-retrieve-tag-set-of-a-specific-object-version-1483400283663",
+ "title": "To retrieve tag set of a specific object version"
+ }
+ ],
+ "GetObjectTorrent": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "Key": "HappyFace.jpg"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example retrieves torrent files of an object.",
+ "id": "to-retrieve-torrent-files-for-an-object-1481834115959",
+ "title": "To retrieve torrent files for an object"
+ }
+ ],
+ "HeadBucket": [
+ {
+ "input": {
+ "Bucket": "acl1"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation checks to see if a bucket exists.",
+ "id": "to-determine-if-bucket-exists-1473110292262",
+ "title": "To determine if bucket exists"
+ }
+ ],
+ "HeadObject": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "Key": "HappyFace.jpg"
+ },
+ "output": {
+ "AcceptRanges": "bytes",
+ "ContentLength": "3191",
+ "ContentType": "image/jpeg",
+ "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"",
+ "LastModified": "Thu, 15 Dec 2016 01:19:41 GMT",
+ "Metadata": {
+ },
+ "VersionId": "null"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example retrieves an object metadata.",
+ "id": "to-retrieve-metadata-of-an-object-without-returning-the-object-itself-1481834820480",
+ "title": "To retrieve metadata of an object without returning the object itself"
+ }
+ ],
+ "ListMultipartUploads": [
+ {
+ "input": {
+ "Bucket": "examplebucket"
+ },
+ "output": {
+ "Uploads": [
+ {
+ "Initiated": "2014-05-01T05:40:58.000Z",
+ "Initiator": {
+ "DisplayName": "display-name",
+ "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc"
+ },
+ "Key": "JavaFile",
+ "Owner": {
+ "DisplayName": "display-name",
+ "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc"
+ },
+ "StorageClass": "STANDARD",
+ "UploadId": "examplelUa.CInXklLQtSMJITdUnoZ1Y5GACB5UckOtspm5zbDMCkPF_qkfZzMiFZ6dksmcnqxJyIBvQMG9X9Q--"
+ },
+ {
+ "Initiated": "2014-05-01T05:41:27.000Z",
+ "Initiator": {
+ "DisplayName": "display-name",
+ "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc"
+ },
+ "Key": "JavaFile",
+ "Owner": {
+ "DisplayName": "display-name",
+ "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc"
+ },
+ "StorageClass": "STANDARD",
+ "UploadId": "examplelo91lv1iwvWpvCiJWugw2xXLPAD7Z8cJyX9.WiIRgNrdG6Ldsn.9FtS63TCl1Uf5faTB.1U5Ckcbmdw--"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example lists in-progress multipart uploads on a specific bucket.",
+ "id": "to-list-in-progress-multipart-uploads-on-a-bucket-1481852775260",
+ "title": "To list in-progress multipart uploads on a bucket"
+ },
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "KeyMarker": "nextkeyfrompreviousresponse",
+ "MaxUploads": "2",
+ "UploadIdMarker": "valuefrompreviousresponse"
+ },
+ "output": {
+ "Bucket": "acl1",
+ "IsTruncated": true,
+ "KeyMarker": "",
+ "MaxUploads": "2",
+ "NextKeyMarker": "someobjectkey",
+ "NextUploadIdMarker": "examplelo91lv1iwvWpvCiJWugw2xXLPAD7Z8cJyX9.WiIRgNrdG6Ldsn.9FtS63TCl1Uf5faTB.1U5Ckcbmdw--",
+ "UploadIdMarker": "",
+ "Uploads": [
+ {
+ "Initiated": "2014-05-01T05:40:58.000Z",
+ "Initiator": {
+ "DisplayName": "ownder-display-name",
+ "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc"
+ },
+ "Key": "JavaFile",
+ "Owner": {
+ "DisplayName": "mohanataws",
+ "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc"
+ },
+ "StorageClass": "STANDARD",
+ "UploadId": "gZ30jIqlUa.CInXklLQtSMJITdUnoZ1Y5GACB5UckOtspm5zbDMCkPF_qkfZzMiFZ6dksmcnqxJyIBvQMG9X9Q--"
+ },
+ {
+ "Initiated": "2014-05-01T05:41:27.000Z",
+ "Initiator": {
+ "DisplayName": "ownder-display-name",
+ "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc"
+ },
+ "Key": "JavaFile",
+ "Owner": {
+ "DisplayName": "ownder-display-name",
+ "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc"
+ },
+ "StorageClass": "STANDARD",
+ "UploadId": "b7tZSqIlo91lv1iwvWpvCiJWugw2xXLPAD7Z8cJyX9.WiIRgNrdG6Ldsn.9FtS63TCl1Uf5faTB.1U5Ckcbmdw--"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example specifies the upload-id-marker and key-marker from previous truncated response to retrieve next setup of multipart uploads.",
+ "id": "list-next-set-of-multipart-uploads-when-previous-result-is-truncated-1482428106748",
+ "title": "List next set of multipart uploads when previous result is truncated"
+ }
+ ],
+ "ListObjectVersions": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "Prefix": "HappyFace.jpg"
+ },
+ "output": {
+ "Versions": [
+ {
+ "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"",
+ "IsLatest": true,
+ "Key": "HappyFace.jpg",
+ "LastModified": "2016-12-15T01:19:41.000Z",
+ "Owner": {
+ "DisplayName": "owner-display-name",
+ "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc"
+ },
+ "Size": 3191,
+ "StorageClass": "STANDARD",
+ "VersionId": "null"
+ },
+ {
+ "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"",
+ "IsLatest": false,
+ "Key": "HappyFace.jpg",
+ "LastModified": "2016-12-13T00:58:26.000Z",
+ "Owner": {
+ "DisplayName": "owner-display-name",
+ "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc"
+ },
+ "Size": 3191,
+ "StorageClass": "STANDARD",
+ "VersionId": "PHtexPGjH2y.zBgT8LmB7wwLI2mpbz.k"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example return versions of an object with specific key name prefix. The request limits the number of items returned to two. If there are are more than two object version, S3 returns NextToken in the response. You can specify this token value in your next request to fetch next set of object versions.",
+ "id": "to-list-object-versions-1481910996058",
+ "title": "To list object versions"
+ }
+ ],
+ "ListObjects": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "MaxKeys": "2"
+ },
+ "output": {
+ "Contents": [
+ {
+ "ETag": "\"70ee1738b6b21e2c8a43f3a5ab0eee71\"",
+ "Key": "example1.jpg",
+ "LastModified": "2014-11-21T19:40:05.000Z",
+ "Owner": {
+ "DisplayName": "myname",
+ "ID": "12345example25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc"
+ },
+ "Size": 11,
+ "StorageClass": "STANDARD"
+ },
+ {
+ "ETag": "\"9c8af9a76df052144598c115ef33e511\"",
+ "Key": "example2.jpg",
+ "LastModified": "2013-11-15T01:10:49.000Z",
+ "Owner": {
+ "DisplayName": "myname",
+ "ID": "12345example25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc"
+ },
+ "Size": 713193,
+ "StorageClass": "STANDARD"
+ }
+ ],
+ "NextMarker": "eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAyfQ=="
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example list two objects in a bucket.",
+ "id": "to-list-objects-in-a-bucket-1473447646507",
+ "title": "To list objects in a bucket"
+ }
+ ],
+ "ListObjectsV2": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "MaxKeys": "2"
+ },
+ "output": {
+ "Contents": [
+ {
+ "ETag": "\"70ee1738b6b21e2c8a43f3a5ab0eee71\"",
+ "Key": "happyface.jpg",
+ "LastModified": "2014-11-21T19:40:05.000Z",
+ "Size": 11,
+ "StorageClass": "STANDARD"
+ },
+ {
+ "ETag": "\"becf17f89c30367a9a44495d62ed521a-1\"",
+ "Key": "test.jpg",
+ "LastModified": "2014-05-02T04:51:50.000Z",
+ "Size": 4192256,
+ "StorageClass": "STANDARD"
+ }
+ ],
+ "IsTruncated": true,
+ "KeyCount": "2",
+ "MaxKeys": "2",
+ "Name": "examplebucket",
+ "NextContinuationToken": "1w41l63U0xa8q7smH50vCxyTQqdxo69O3EmK28Bi5PcROI4wI/EyIJg==",
+ "Prefix": ""
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example retrieves object list. The request specifies max keys to limit response to include only 2 object keys. ",
+ "id": "to-get-object-list",
+ "title": "To get object list"
+ }
+ ],
+ "ListParts": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "Key": "bigobject",
+ "UploadId": "example7YPBOJuoFiQ9cz4P3Pe6FIZwO4f7wN93uHsNBEw97pl5eNwzExg0LAT2dUN91cOmrEQHDsP3WA60CEg--"
+ },
+ "output": {
+ "Initiator": {
+ "DisplayName": "owner-display-name",
+ "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc"
+ },
+ "Owner": {
+ "DisplayName": "owner-display-name",
+ "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc"
+ },
+ "Parts": [
+ {
+ "ETag": "\"d8c2eafd90c266e19ab9dcacc479f8af\"",
+ "LastModified": "2016-12-16T00:11:42.000Z",
+ "PartNumber": "1",
+ "Size": 26246026
+ },
+ {
+ "ETag": "\"d8c2eafd90c266e19ab9dcacc479f8af\"",
+ "LastModified": "2016-12-16T00:15:01.000Z",
+ "PartNumber": "2",
+ "Size": 26246026
+ }
+ ],
+ "StorageClass": "STANDARD"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example lists parts uploaded for a specific multipart upload.",
+ "id": "to-list-parts-of-a-multipart-upload-1481852006923",
+ "title": "To list parts of a multipart upload."
+ }
+ ],
+ "PutBucketAcl": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "GrantFullControl": "id=examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484",
+ "GrantWrite": "uri=http://acs.amazonaws.com/groups/s3/LogDelivery"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example replaces existing ACL on a bucket. The ACL grants the bucket owner (specified using the owner ID) and write permission to the LogDelivery group. Because this is a replace operation, you must specify all the grants in your request. To incrementally add or remove ACL grants, you might use the console.",
+ "id": "put-bucket-acl-1482260397033",
+ "title": "Put bucket acl"
+ }
+ ],
+ "PutBucketCors": [
+ {
+ "input": {
+ "Bucket": "",
+ "CORSConfiguration": {
+ "CORSRules": [
+ {
+ "AllowedHeaders": [
+ "*"
+ ],
+ "AllowedMethods": [
+ "PUT",
+ "POST",
+ "DELETE"
+ ],
+ "AllowedOrigins": [
+ "http://www.example.com"
+ ],
+ "ExposeHeaders": [
+ "x-amz-server-side-encryption"
+ ],
+ "MaxAgeSeconds": 3000
+ },
+ {
+ "AllowedHeaders": [
+ "Authorization"
+ ],
+ "AllowedMethods": [
+ "GET"
+ ],
+ "AllowedOrigins": [
+ "*"
+ ],
+ "MaxAgeSeconds": 3000
+ }
+ ]
+ },
+ "ContentMD5": ""
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example enables PUT, POST, and DELETE requests from www.example.com, and enables GET requests from any domain.",
+ "id": "to-set-cors-configuration-on-a-bucket-1483037818805",
+ "title": "To set cors configuration on a bucket."
+ }
+ ],
+ "PutBucketLifecycleConfiguration": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "LifecycleConfiguration": {
+ "Rules": [
+ {
+ "Expiration": {
+ "Days": 3650
+ },
+ "Filter": {
+ "Prefix": "documents/"
+ },
+ "ID": "TestOnly",
+ "Status": "Enabled",
+ "Transitions": [
+ {
+ "Days": 365,
+ "StorageClass": "GLACIER"
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example replaces existing lifecycle configuration, if any, on the specified bucket. ",
+ "id": "put-bucket-lifecycle-1482264533092",
+ "title": "Put bucket lifecycle"
+ }
+ ],
+ "PutBucketLogging": [
+ {
+ "input": {
+ "Bucket": "sourcebucket",
+ "BucketLoggingStatus": {
+ "LoggingEnabled": {
+ "TargetBucket": "targetbucket",
+ "TargetGrants": [
+ {
+ "Grantee": {
+ "Type": "Group",
+ "URI": "http://acs.amazonaws.com/groups/global/AllUsers"
+ },
+ "Permission": "READ"
+ }
+ ],
+ "TargetPrefix": "MyBucketLogs/"
+ }
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example sets logging policy on a bucket. For the Log Delivery group to deliver logs to the destination bucket, it needs permission for the READ_ACP action which the policy grants.",
+ "id": "set-logging-configuration-for-a-bucket-1482269119909",
+ "title": "Set logging configuration for a bucket"
+ }
+ ],
+ "PutBucketNotificationConfiguration": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "NotificationConfiguration": {
+ "TopicConfigurations": [
+ {
+ "Events": [
+ "s3:ObjectCreated:*"
+ ],
+ "TopicArn": "arn:aws:sns:us-west-2:123456789012:s3-notification-topic"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example sets notification configuration on a bucket to publish the object created events to an SNS topic.",
+ "id": "set-notification-configuration-for-a-bucket-1482270296426",
+ "title": "Set notification configuration for a bucket"
+ }
+ ],
+ "PutBucketPolicy": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "Policy": "{\"Version\": \"2012-10-17\", \"Statement\": [{ \"Sid\": \"id-1\",\"Effect\": \"Allow\",\"Principal\": {\"AWS\": \"arn:aws:iam::123456789012:root\"}, \"Action\": [ \"s3:PutObject\",\"s3:PutObjectAcl\"], \"Resource\": [\"arn:aws:s3:::acl3/*\" ] } ]}"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example sets a permission policy on a bucket.",
+ "id": "set-bucket-policy-1482448903302",
+ "title": "Set bucket policy"
+ }
+ ],
+ "PutBucketReplication": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "ReplicationConfiguration": {
+ "Role": "arn:aws:iam::123456789012:role/examplerole",
+ "Rules": [
+ {
+ "Destination": {
+ "Bucket": "arn:aws:s3:::destinationbucket",
+ "StorageClass": "STANDARD"
+ },
+ "Prefix": "",
+ "Status": "Enabled"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example sets replication configuration on a bucket.",
+ "id": "id-1",
+ "title": "Set replication configuration on a bucket"
+ }
+ ],
+ "PutBucketRequestPayment": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "RequestPaymentConfiguration": {
+ "Payer": "Requester"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example sets request payment configuration on a bucket so that person requesting the download is charged.",
+ "id": "set-request-payment-configuration-on-a-bucket-1482343596680",
+ "title": "Set request payment configuration on a bucket."
+ }
+ ],
+ "PutBucketTagging": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "Tagging": {
+ "TagSet": [
+ {
+ "Key": "Key1",
+ "Value": "Value1"
+ },
+ {
+ "Key": "Key2",
+ "Value": "Value2"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example sets tags on a bucket. Any existing tags are replaced.",
+ "id": "set-tags-on-a-bucket-1482346269066",
+ "title": "Set tags on a bucket"
+ }
+ ],
+ "PutBucketVersioning": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "VersioningConfiguration": {
+ "MFADelete": "Disabled",
+ "Status": "Enabled"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example sets versioning configuration on bucket. The configuration enables versioning on the bucket.",
+ "id": "set-versioning-configuration-on-a-bucket-1482344186279",
+ "title": "Set versioning configuration on a bucket"
+ }
+ ],
+ "PutBucketWebsite": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "ContentMD5": "",
+ "WebsiteConfiguration": {
+ "ErrorDocument": {
+ "Key": "error.html"
+ },
+ "IndexDocument": {
+ "Suffix": "index.html"
+ }
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example adds website configuration to a bucket.",
+ "id": "set-website-configuration-on-a-bucket-1482346836261",
+ "title": "Set website configuration on a bucket"
+ }
+ ],
+ "PutObject": [
+ {
+ "input": {
+ "Body": "filetoupload",
+ "Bucket": "examplebucket",
+ "Key": "objectkey"
+ },
+ "output": {
+ "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"",
+ "VersionId": "Bvq0EDKxOcXLJXNo_Lkz37eM3R4pfzyQ"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates an object. If the bucket is versioning enabled, S3 returns version ID in response.",
+ "id": "to-create-an-object-1483147613675",
+ "title": "To create an object."
+ },
+ {
+ "input": {
+ "Body": "HappyFace.jpg",
+ "Bucket": "examplebucket",
+ "Key": "HappyFace.jpg",
+ "ServerSideEncryption": "AES256",
+ "StorageClass": "STANDARD_IA"
+ },
+ "output": {
+ "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"",
+ "ServerSideEncryption": "AES256",
+ "VersionId": "CG612hodqujkf8FaaNfp8U..FIhLROcp"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example uploads an object. The request specifies optional request headers to directs S3 to use specific storage class and use server-side encryption.",
+ "id": "to-upload-an-object-(specify-optional-headers)",
+ "title": "To upload an object (specify optional headers)"
+ },
+ {
+ "input": {
+ "ACL": "authenticated-read",
+ "Body": "filetoupload",
+ "Bucket": "examplebucket",
+ "Key": "exampleobject"
+ },
+ "output": {
+ "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"",
+ "VersionId": "Kirh.unyZwjQ69YxcQLA8z4F5j3kJJKr"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example uploads and object. The request specifies optional canned ACL (access control list) to all READ access to authenticated users. If the bucket is versioning enabled, S3 returns version ID in response.",
+ "id": "to-upload-an-object-and-specify-canned-acl-1483397779571",
+ "title": "To upload an object and specify canned ACL."
+ },
+ {
+ "input": {
+ "Body": "HappyFace.jpg",
+ "Bucket": "examplebucket",
+ "Key": "HappyFace.jpg"
+ },
+ "output": {
+ "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"",
+ "VersionId": "tpf3zF08nBplQK1XLOefGskR7mGDwcDk"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example uploads an object to a versioning-enabled bucket. The source file is specified using Windows file syntax. S3 returns VersionId of the newly created object.",
+ "id": "to-upload-an-object-1481760101010",
+ "title": "To upload an object"
+ },
+ {
+ "input": {
+ "Body": "filetoupload",
+ "Bucket": "examplebucket",
+ "Key": "exampleobject",
+ "Metadata": {
+ "metadata1": "value1",
+ "metadata2": "value2"
+ }
+ },
+ "output": {
+ "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"",
+ "VersionId": "pSKidl4pHBiNwukdbcPXAIs.sshFFOc0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates an object. The request also specifies optional metadata. If the bucket is versioning enabled, S3 returns version ID in response.",
+ "id": "to-upload-object-and-specify-user-defined-metadata-1483396974757",
+ "title": "To upload object and specify user-defined metadata"
+ },
+ {
+ "input": {
+ "Body": "c:\\HappyFace.jpg",
+ "Bucket": "examplebucket",
+ "Key": "HappyFace.jpg",
+ "Tagging": "key1=value1&key2=value2"
+ },
+ "output": {
+ "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"",
+ "VersionId": "psM2sYY4.o1501dSx8wMvnkOzSBB.V4a"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example uploads an object. The request specifies optional object tags. The bucket is versioned, therefore S3 returns version ID of the newly created object.",
+ "id": "to-upload-an-object-and-specify-optional-tags-1481762310955",
+ "title": "To upload an object and specify optional tags"
+ },
+ {
+ "input": {
+ "Body": "filetoupload",
+ "Bucket": "examplebucket",
+ "Key": "exampleobject",
+ "ServerSideEncryption": "AES256",
+ "Tagging": "key1=value1&key2=value2"
+ },
+ "output": {
+ "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"",
+ "ServerSideEncryption": "AES256",
+ "VersionId": "Ri.vC6qVlA4dEnjgRV4ZHsHoFIjqEMNt"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example uploads and object. The request specifies the optional server-side encryption option. The request also specifies optional object tags. If the bucket is versioning enabled, S3 returns version ID in response.",
+ "id": "to-upload-an-object-and-specify-server-side-encryption-and-object-tags-1483398331831",
+ "title": "To upload an object and specify server-side encryption and object tags"
+ }
+ ],
+ "PutObjectAcl": [
+ {
+ "input": {
+ "AccessControlPolicy": {
+ },
+ "Bucket": "examplebucket",
+ "GrantFullControl": "emailaddress=user1@example.com,emailaddress=user2@example.com",
+ "GrantRead": "uri=http://acs.amazonaws.com/groups/global/AllUsers",
+ "Key": "HappyFace.jpg"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example adds grants to an object ACL. The first permission grants user1 and user2 FULL_CONTROL and the AllUsers group READ permission.",
+ "id": "to-grant-permissions-using-object-acl-1481835549285",
+ "title": "To grant permissions using object ACL"
+ }
+ ],
+ "PutObjectTagging": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "Key": "HappyFace.jpg",
+ "Tagging": {
+ "TagSet": [
+ {
+ "Key": "Key3",
+ "Value": "Value3"
+ },
+ {
+ "Key": "Key4",
+ "Value": "Value4"
+ }
+ ]
+ }
+ },
+ "output": {
+ "VersionId": "null"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example adds tags to an existing object.",
+ "id": "to-add-tags-to-an-existing-object-1481764668793",
+ "title": "To add tags to an existing object"
+ }
+ ],
+ "RestoreObject": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "Key": "archivedobjectkey",
+ "RestoreRequest": {
+ "Days": 1,
+ "GlacierJobParameters": {
+ "Tier": "Expedited"
+ }
+ }
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example restores for one day an archived copy of an object back into Amazon S3 bucket.",
+ "id": "to-restore-an-archived-object-1483049329953",
+ "title": "To restore an archived object"
+ }
+ ],
+ "UploadPart": [
+ {
+ "input": {
+ "Body": "fileToUpload",
+ "Bucket": "examplebucket",
+ "Key": "examplelargeobject",
+ "PartNumber": "1",
+ "UploadId": "xadcOB_7YPBOJuoFiQ9cz4P3Pe6FIZwO4f7wN93uHsNBEw97pl5eNwzExg0LAT2dUN91cOmrEQHDsP3WA60CEg--"
+ },
+ "output": {
+ "ETag": "\"d8c2eafd90c266e19ab9dcacc479f8af\""
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example uploads part 1 of a multipart upload. The example specifies a file name for the part data. The Upload ID is same that is returned by the initiate multipart upload.",
+ "id": "to-upload-a-part-1481847914943",
+ "title": "To upload a part"
+ }
+ ],
+ "UploadPartCopy": [
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "CopySource": "/bucketname/sourceobjectkey",
+ "Key": "examplelargeobject",
+ "PartNumber": "1",
+ "UploadId": "exampleuoh_10OhKhT7YukE9bjzTPRiuaCotmZM_pFngJFir9OZNrSr5cWa3cq3LZSUsfjI4FI7PkP91We7Nrw--"
+ },
+ "output": {
+ "CopyPartResult": {
+ "ETag": "\"b0c6f0e7e054ab8fa2536a2677f8734d\"",
+ "LastModified": "2016-12-29T21:24:43.000Z"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example uploads a part of a multipart upload by copying data from an existing object as data source.",
+ "id": "to-upload-a-part-by-copying-data-from-an-existing-object-as-data-source-1483046746348",
+ "title": "To upload a part by copying data from an existing object as data source"
+ },
+ {
+ "input": {
+ "Bucket": "examplebucket",
+ "CopySource": "/bucketname/sourceobjectkey",
+ "CopySourceRange": "bytes=1-100000",
+ "Key": "examplelargeobject",
+ "PartNumber": "2",
+ "UploadId": "exampleuoh_10OhKhT7YukE9bjzTPRiuaCotmZM_pFngJFir9OZNrSr5cWa3cq3LZSUsfjI4FI7PkP91We7Nrw--"
+ },
+ "output": {
+ "CopyPartResult": {
+ "ETag": "\"65d16d19e65a7508a51f043180edcc36\"",
+ "LastModified": "2016-12-29T21:44:28.000Z"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example uploads a part of a multipart upload by copying a specified byte range from an existing object as data source.",
+ "id": "to-upload-a-part-by-copying-byte-range-from-an-existing-object-as-data-source-1483048068594",
+ "title": "To upload a part by copying byte range from an existing object as data source"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/paginators-1.json
new file mode 100644
index 00000000..b1b43207
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/paginators-1.json
@@ -0,0 +1,76 @@
+{
+ "pagination": {
+ "ListMultipartUploads": {
+ "limit_key": "MaxUploads",
+ "more_results": "IsTruncated",
+ "output_token": [
+ "NextKeyMarker",
+ "NextUploadIdMarker"
+ ],
+ "input_token": [
+ "KeyMarker",
+ "UploadIdMarker"
+ ],
+ "result_key": [
+ "Uploads",
+ "CommonPrefixes"
+ ]
+ },
+ "ListObjectVersions": {
+ "more_results": "IsTruncated",
+ "limit_key": "MaxKeys",
+ "output_token": [
+ "NextKeyMarker",
+ "NextVersionIdMarker"
+ ],
+ "input_token": [
+ "KeyMarker",
+ "VersionIdMarker"
+ ],
+ "result_key": [
+ "Versions",
+ "DeleteMarkers",
+ "CommonPrefixes"
+ ]
+ },
+ "ListObjects": {
+ "more_results": "IsTruncated",
+ "limit_key": "MaxKeys",
+ "output_token": "NextMarker || Contents[-1].Key",
+ "input_token": "Marker",
+ "result_key": [
+ "Contents",
+ "CommonPrefixes"
+ ]
+ },
+ "ListObjectsV2": {
+ "more_results": "IsTruncated",
+ "limit_key": "MaxKeys",
+ "output_token": "NextContinuationToken",
+ "input_token": "ContinuationToken",
+ "result_key": [
+ "Contents",
+ "CommonPrefixes"
+ ]
+ },
+ "ListParts": {
+ "more_results": "IsTruncated",
+ "limit_key": "MaxParts",
+ "output_token": "NextPartNumberMarker",
+ "input_token": "PartNumberMarker",
+ "result_key": "Parts"
+ },
+ "ListDirectoryBuckets": {
+ "input_token": "ContinuationToken",
+ "limit_key": "MaxDirectoryBuckets",
+ "output_token": "ContinuationToken",
+ "result_key": "Buckets"
+ },
+ "ListBuckets": {
+ "input_token": "ContinuationToken",
+ "limit_key": "MaxBuckets",
+ "output_token": "ContinuationToken",
+ "result_key": "Buckets"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..39e13606
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/paginators-1.sdk-extras.json
@@ -0,0 +1,46 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "ListBuckets": {
+ "non_aggregate_keys": [
+ "Owner",
+ "Prefix"
+ ]
+ },
+ "ListMultipartUploads": {
+ "non_aggregate_keys": [
+ "RequestCharged",
+ "Prefix"
+ ]
+ },
+ "ListObjectVersions": {
+ "non_aggregate_keys": [
+ "RequestCharged",
+ "Prefix"
+ ]
+ },
+ "ListObjects": {
+ "non_aggregate_keys": [
+ "RequestCharged",
+ "Prefix"
+ ]
+ },
+ "ListObjectsV2": {
+ "non_aggregate_keys": [
+ "RequestCharged",
+ "Prefix"
+ ]
+ },
+ "ListParts": {
+ "non_aggregate_keys": [
+ "ChecksumAlgorithm",
+ "Initiator",
+ "Owner",
+ "StorageClass",
+ "ChecksumType"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/service-2.json.gz
new file mode 100644
index 00000000..991c3251
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/service-2.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/service-2.sdk-extras.json
new file mode 100644
index 00000000..d04e9d0b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/service-2.sdk-extras.json
@@ -0,0 +1,8 @@
+{
+ "version": 1.0,
+ "merge": {
+ "shapes": {
+ "Expires":{"type":"timestamp"}
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/waiters-2.json
new file mode 100644
index 00000000..b508a8f5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/s3/2006-03-01/waiters-2.json
@@ -0,0 +1,73 @@
+{
+ "version": 2,
+ "waiters": {
+ "BucketExists": {
+ "delay": 5,
+ "operation": "HeadBucket",
+ "maxAttempts": 20,
+ "acceptors": [
+ {
+ "expected": 200,
+ "matcher": "status",
+ "state": "success"
+ },
+ {
+ "expected": 301,
+ "matcher": "status",
+ "state": "success"
+ },
+ {
+ "expected": 403,
+ "matcher": "status",
+ "state": "success"
+ },
+ {
+ "expected": 404,
+ "matcher": "status",
+ "state": "retry"
+ }
+ ]
+ },
+ "BucketNotExists": {
+ "delay": 5,
+ "operation": "HeadBucket",
+ "maxAttempts": 20,
+ "acceptors": [
+ {
+ "expected": 404,
+ "matcher": "status",
+ "state": "success"
+ }
+ ]
+ },
+ "ObjectExists": {
+ "delay": 5,
+ "operation": "HeadObject",
+ "maxAttempts": 20,
+ "acceptors": [
+ {
+ "expected": 200,
+ "matcher": "status",
+ "state": "success"
+ },
+ {
+ "expected": 404,
+ "matcher": "status",
+ "state": "retry"
+ }
+ ]
+ },
+ "ObjectNotExists": {
+ "delay": 5,
+ "operation": "HeadObject",
+ "maxAttempts": 20,
+ "acceptors": [
+ {
+ "expected": 404,
+ "matcher": "status",
+ "state": "success"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/s3control/2018-08-20/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/s3control/2018-08-20/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..6a579f8a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/s3control/2018-08-20/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/s3control/2018-08-20/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/s3control/2018-08-20/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/s3control/2018-08-20/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/s3control/2018-08-20/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/s3control/2018-08-20/paginators-1.json
new file mode 100644
index 00000000..b2138742
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/s3control/2018-08-20/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "ListAccessPointsForObjectLambda": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ObjectLambdaAccessPointList"
+ },
+ "ListCallerAccessGrants": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "CallerAccessGrantsList"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/s3control/2018-08-20/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/s3control/2018-08-20/service-2.json.gz
new file mode 100644
index 00000000..05c9b63b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/s3control/2018-08-20/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/s3outposts/2017-07-25/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/s3outposts/2017-07-25/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..77c6f9ac
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/s3outposts/2017-07-25/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/s3outposts/2017-07-25/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/s3outposts/2017-07-25/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/s3outposts/2017-07-25/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/s3outposts/2017-07-25/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/s3outposts/2017-07-25/paginators-1.json
new file mode 100644
index 00000000..5a8fa86c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/s3outposts/2017-07-25/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListEndpoints": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Endpoints"
+ },
+ "ListSharedEndpoints": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Endpoints"
+ },
+ "ListOutpostsWithS3": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Outposts"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/s3outposts/2017-07-25/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/s3outposts/2017-07-25/service-2.json.gz
new file mode 100644
index 00000000..0b25b47d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/s3outposts/2017-07-25/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/s3tables/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/s3tables/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..442c578f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/s3tables/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/s3tables/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/s3tables/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..2215b7b6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/s3tables/2018-05-10/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListNamespaces": {
+ "input_token": "continuationToken",
+ "output_token": "continuationToken",
+ "limit_key": "maxNamespaces",
+ "result_key": "namespaces"
+ },
+ "ListTableBuckets": {
+ "input_token": "continuationToken",
+ "output_token": "continuationToken",
+ "limit_key": "maxBuckets",
+ "result_key": "tableBuckets"
+ },
+ "ListTables": {
+ "input_token": "continuationToken",
+ "output_token": "continuationToken",
+ "limit_key": "maxTables",
+ "result_key": "tables"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/s3tables/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/s3tables/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..c8415b6e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/s3tables/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/s3tables/2018-05-10/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/s3tables/2018-05-10/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/s3tables/2018-05-10/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-a2i-runtime/2019-11-07/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-a2i-runtime/2019-11-07/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..0d42ce70
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-a2i-runtime/2019-11-07/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-a2i-runtime/2019-11-07/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-a2i-runtime/2019-11-07/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-a2i-runtime/2019-11-07/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-a2i-runtime/2019-11-07/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-a2i-runtime/2019-11-07/paginators-1.json
new file mode 100644
index 00000000..b19128c2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-a2i-runtime/2019-11-07/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListHumanLoops": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "HumanLoopSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-a2i-runtime/2019-11-07/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-a2i-runtime/2019-11-07/service-2.json.gz
new file mode 100644
index 00000000..0855fb55
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-a2i-runtime/2019-11-07/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-edge/2020-09-23/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-edge/2020-09-23/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..f7ae5515
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-edge/2020-09-23/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-edge/2020-09-23/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-edge/2020-09-23/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-edge/2020-09-23/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-edge/2020-09-23/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-edge/2020-09-23/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-edge/2020-09-23/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-edge/2020-09-23/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-edge/2020-09-23/service-2.json.gz
new file mode 100644
index 00000000..8a26f6f5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-edge/2020-09-23/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-featurestore-runtime/2020-07-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-featurestore-runtime/2020-07-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..08de68a2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-featurestore-runtime/2020-07-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-featurestore-runtime/2020-07-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-featurestore-runtime/2020-07-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-featurestore-runtime/2020-07-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-featurestore-runtime/2020-07-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-featurestore-runtime/2020-07-01/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-featurestore-runtime/2020-07-01/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-featurestore-runtime/2020-07-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-featurestore-runtime/2020-07-01/service-2.json.gz
new file mode 100644
index 00000000..b940000d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-featurestore-runtime/2020-07-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-geospatial/2020-05-27/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-geospatial/2020-05-27/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..50ec16ce
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-geospatial/2020-05-27/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-geospatial/2020-05-27/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-geospatial/2020-05-27/paginators-1.json
new file mode 100644
index 00000000..8802d943
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-geospatial/2020-05-27/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListEarthObservationJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "EarthObservationJobSummaries"
+ },
+ "ListRasterDataCollections": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "RasterDataCollectionSummaries"
+ },
+ "ListVectorEnrichmentJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "VectorEnrichmentJobSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-geospatial/2020-05-27/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-geospatial/2020-05-27/service-2.json.gz
new file mode 100644
index 00000000..a312ebaa
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-geospatial/2020-05-27/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-metrics/2022-09-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-metrics/2022-09-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..a17e8a79
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-metrics/2022-09-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-metrics/2022-09-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-metrics/2022-09-30/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-metrics/2022-09-30/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-metrics/2022-09-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-metrics/2022-09-30/service-2.json.gz
new file mode 100644
index 00000000..6162843f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-metrics/2022-09-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-runtime/2017-05-13/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-runtime/2017-05-13/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..e6ab7ecb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-runtime/2017-05-13/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-runtime/2017-05-13/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-runtime/2017-05-13/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-runtime/2017-05-13/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-runtime/2017-05-13/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-runtime/2017-05-13/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-runtime/2017-05-13/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-runtime/2017-05-13/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-runtime/2017-05-13/service-2.json.gz
new file mode 100644
index 00000000..eb61e40e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker-runtime/2017-05-13/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker/2017-07-24/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker/2017-07-24/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..19b9249c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker/2017-07-24/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker/2017-07-24/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker/2017-07-24/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker/2017-07-24/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker/2017-07-24/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker/2017-07-24/paginators-1.json
new file mode 100644
index 00000000..03e461a8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker/2017-07-24/paginators-1.json
@@ -0,0 +1,472 @@
+{
+ "pagination": {
+ "ListTrainingJobs": {
+ "result_key": "TrainingJobSummaries",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListEndpoints": {
+ "result_key": "Endpoints",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListEndpointConfigs": {
+ "result_key": "EndpointConfigs",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListNotebookInstances": {
+ "result_key": "NotebookInstances",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListTags": {
+ "result_key": "Tags",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListModels": {
+ "result_key": "Models",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListAlgorithms": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AlgorithmSummaryList"
+ },
+ "ListCodeRepositories": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "CodeRepositorySummaryList"
+ },
+ "ListCompilationJobs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "CompilationJobSummaries"
+ },
+ "ListHyperParameterTuningJobs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "HyperParameterTuningJobSummaries"
+ },
+ "ListLabelingJobs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LabelingJobSummaryList"
+ },
+ "ListLabelingJobsForWorkteam": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LabelingJobSummaryList"
+ },
+ "ListModelPackages": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ModelPackageSummaryList"
+ },
+ "ListNotebookInstanceLifecycleConfigs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "NotebookInstanceLifecycleConfigs"
+ },
+ "ListSubscribedWorkteams": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "SubscribedWorkteams"
+ },
+ "ListTrainingJobsForHyperParameterTuningJob": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TrainingJobSummaries"
+ },
+ "ListTransformJobs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TransformJobSummaries"
+ },
+ "ListWorkteams": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Workteams"
+ },
+ "Search": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Results"
+ },
+ "ListApps": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Apps"
+ },
+ "ListAutoMLJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AutoMLJobSummaries"
+ },
+ "ListCandidatesForAutoMLJob": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Candidates"
+ },
+ "ListDomains": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Domains"
+ },
+ "ListExperiments": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ExperimentSummaries"
+ },
+ "ListFlowDefinitions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "FlowDefinitionSummaries"
+ },
+ "ListHumanTaskUis": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "HumanTaskUiSummaries"
+ },
+ "ListMonitoringExecutions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "MonitoringExecutionSummaries"
+ },
+ "ListMonitoringSchedules": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "MonitoringScheduleSummaries"
+ },
+ "ListProcessingJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ProcessingJobSummaries"
+ },
+ "ListTrialComponents": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "TrialComponentSummaries"
+ },
+ "ListTrials": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "TrialSummaries"
+ },
+ "ListUserProfiles": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "UserProfiles"
+ },
+ "ListWorkforces": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Workforces"
+ },
+ "ListImageVersions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ImageVersions"
+ },
+ "ListImages": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Images"
+ },
+ "ListActions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ActionSummaries"
+ },
+ "ListAppImageConfigs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AppImageConfigs"
+ },
+ "ListArtifacts": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ArtifactSummaries"
+ },
+ "ListAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AssociationSummaries"
+ },
+ "ListContexts": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ContextSummaries"
+ },
+ "ListFeatureGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "FeatureGroupSummaries"
+ },
+ "ListModelPackageGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ModelPackageGroupSummaryList"
+ },
+ "ListPipelineExecutionSteps": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "PipelineExecutionSteps"
+ },
+ "ListPipelineExecutions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "PipelineExecutionSummaries"
+ },
+ "ListPipelineParametersForExecution": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "PipelineParameters"
+ },
+ "ListPipelines": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "PipelineSummaries"
+ },
+ "ListDataQualityJobDefinitions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "JobDefinitionSummaries"
+ },
+ "ListDeviceFleets": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "DeviceFleetSummaries"
+ },
+ "ListDevices": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "DeviceSummaries"
+ },
+ "ListEdgePackagingJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "EdgePackagingJobSummaries"
+ },
+ "ListModelBiasJobDefinitions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "JobDefinitionSummaries"
+ },
+ "ListModelExplainabilityJobDefinitions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "JobDefinitionSummaries"
+ },
+ "ListModelQualityJobDefinitions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "JobDefinitionSummaries"
+ },
+ "ListStudioLifecycleConfigs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "StudioLifecycleConfigs"
+ },
+ "ListInferenceRecommendationsJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "InferenceRecommendationsJobs"
+ },
+ "ListLineageGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "LineageGroupSummaries"
+ },
+ "ListModelMetadata": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ModelMetadataSummaries"
+ },
+ "ListEdgeDeploymentPlans": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "EdgeDeploymentPlanSummaries"
+ },
+ "ListStageDevices": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "DeviceDeploymentSummaries"
+ },
+ "ListInferenceRecommendationsJobSteps": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Steps"
+ },
+ "ListInferenceExperiments": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "InferenceExperiments"
+ },
+ "ListModelCardExportJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ModelCardExportJobSummaries"
+ },
+ "ListModelCardVersions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ModelCardVersionSummaryList"
+ },
+ "ListModelCards": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ModelCardSummaries"
+ },
+ "ListMonitoringAlertHistory": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "MonitoringAlertHistory"
+ },
+ "ListMonitoringAlerts": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "MonitoringAlertSummaries"
+ },
+ "ListSpaces": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Spaces"
+ },
+ "ListAliases": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SageMakerImageVersionAliases"
+ },
+ "ListResourceCatalogs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ResourceCatalogs"
+ },
+ "ListClusterNodes": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ClusterNodeSummaries"
+ },
+ "ListClusters": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ClusterSummaries"
+ },
+ "ListInferenceComponents": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "InferenceComponents"
+ },
+ "ListMlflowTrackingServers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "TrackingServerSummaries"
+ },
+ "ListOptimizationJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "OptimizationJobSummaries"
+ },
+ "ListClusterSchedulerConfigs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ClusterSchedulerConfigSummaries"
+ },
+ "ListComputeQuotas": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ComputeQuotaSummaries"
+ },
+ "ListPartnerApps": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Summaries"
+ },
+ "ListTrainingPlans": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "TrainingPlanSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker/2017-07-24/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker/2017-07-24/service-2.json.gz
new file mode 100644
index 00000000..55d2f022
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker/2017-07-24/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sagemaker/2017-07-24/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker/2017-07-24/waiters-2.json
new file mode 100644
index 00000000..8677924d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sagemaker/2017-07-24/waiters-2.json
@@ -0,0 +1,311 @@
+{
+ "version": 2,
+ "waiters": {
+ "NotebookInstanceInService": {
+ "delay": 30,
+ "maxAttempts": 60,
+ "operation": "DescribeNotebookInstance",
+ "acceptors": [
+ {
+ "expected": "InService",
+ "matcher": "path",
+ "state": "success",
+ "argument": "NotebookInstanceStatus"
+ },
+ {
+ "expected": "Failed",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "NotebookInstanceStatus"
+ }
+ ]
+ },
+ "NotebookInstanceStopped": {
+ "delay": 30,
+ "operation": "DescribeNotebookInstance",
+ "maxAttempts": 60,
+ "acceptors": [
+ {
+ "expected": "Stopped",
+ "matcher": "path",
+ "state": "success",
+ "argument": "NotebookInstanceStatus"
+ },
+ {
+ "expected": "Failed",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "NotebookInstanceStatus"
+ }
+ ]
+ },
+ "NotebookInstanceDeleted": {
+ "delay": 30,
+ "maxAttempts": 60,
+ "operation": "DescribeNotebookInstance",
+ "acceptors": [
+ {
+ "expected": "ValidationException",
+ "matcher": "error",
+ "state": "success"
+ },
+ {
+ "expected": "Failed",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "NotebookInstanceStatus"
+ }
+ ]
+ },
+ "TrainingJobCompletedOrStopped": {
+ "delay": 120,
+ "maxAttempts": 180,
+ "operation": "DescribeTrainingJob",
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "TrainingJobStatus"
+ },
+ {
+ "expected": "Stopped",
+ "matcher": "path",
+ "state": "success",
+ "argument": "TrainingJobStatus"
+ },
+ {
+ "expected": "Failed",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "TrainingJobStatus"
+ },
+ {
+ "expected": "ValidationException",
+ "matcher": "error",
+ "state": "failure"
+ }
+ ]
+ },
+ "EndpointInService": {
+ "delay": 30,
+ "maxAttempts": 120,
+ "operation": "DescribeEndpoint",
+ "acceptors": [
+ {
+ "expected": "InService",
+ "matcher": "path",
+ "state": "success",
+ "argument": "EndpointStatus"
+ },
+ {
+ "expected": "Failed",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "EndpointStatus"
+ },
+ {
+ "expected": "ValidationException",
+ "matcher": "error",
+ "state": "failure"
+ }
+ ]
+ },
+ "EndpointDeleted": {
+ "delay": 30,
+ "maxAttempts": 60,
+ "operation": "DescribeEndpoint",
+ "acceptors": [
+ {
+ "expected": "ValidationException",
+ "matcher": "error",
+ "state": "success"
+ },
+ {
+ "expected": "Failed",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "EndpointStatus"
+ }
+ ]
+ },
+ "TransformJobCompletedOrStopped": {
+ "delay": 60,
+ "maxAttempts": 60,
+ "operation": "DescribeTransformJob",
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "TransformJobStatus"
+ },
+ {
+ "expected": "Stopped",
+ "matcher": "path",
+ "state": "success",
+ "argument": "TransformJobStatus"
+ },
+ {
+ "expected": "Failed",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "TransformJobStatus"
+ },
+ {
+ "expected": "ValidationException",
+ "matcher": "error",
+ "state": "failure"
+ }
+ ]
+ },
+ "ProcessingJobCompletedOrStopped": {
+ "delay": 60,
+ "maxAttempts": 60,
+ "operation": "DescribeProcessingJob",
+ "acceptors": [
+ {
+ "expected": "Completed",
+ "matcher": "path",
+ "state": "success",
+ "argument": "ProcessingJobStatus"
+ },
+ {
+ "expected": "Stopped",
+ "matcher": "path",
+ "state": "success",
+ "argument": "ProcessingJobStatus"
+ },
+ {
+ "expected": "Failed",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "ProcessingJobStatus"
+ },
+ {
+ "expected": "ValidationException",
+ "matcher": "error",
+ "state": "failure"
+ }
+ ]
+ },
+ "ImageCreated": {
+ "delay": 60,
+ "maxAttempts": 60,
+ "operation": "DescribeImage",
+ "acceptors": [
+ {
+ "expected": "CREATED",
+ "matcher": "path",
+ "state": "success",
+ "argument": "ImageStatus"
+ },
+ {
+ "expected": "CREATE_FAILED",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "ImageStatus"
+ },
+ {
+ "expected": "ValidationException",
+ "matcher": "error",
+ "state": "failure"
+ }
+ ]
+ },
+ "ImageUpdated": {
+ "delay": 60,
+ "maxAttempts": 60,
+ "operation": "DescribeImage",
+ "acceptors": [
+ {
+ "expected": "CREATED",
+ "matcher": "path",
+ "state": "success",
+ "argument": "ImageStatus"
+ },
+ {
+ "expected": "UPDATE_FAILED",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "ImageStatus"
+ },
+ {
+ "expected": "ValidationException",
+ "matcher": "error",
+ "state": "failure"
+ }
+ ]
+ },
+ "ImageDeleted": {
+ "delay": 60,
+ "maxAttempts": 60,
+ "operation": "DescribeImage",
+ "acceptors": [
+ {
+ "expected": "ResourceNotFoundException",
+ "matcher": "error",
+ "state": "success"
+ },
+ {
+ "expected": "DELETE_FAILED",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "ImageStatus"
+ },
+ {
+ "expected": "ValidationException",
+ "matcher": "error",
+ "state": "failure"
+ }
+ ]
+ },
+ "ImageVersionCreated": {
+ "delay": 60,
+ "maxAttempts": 60,
+ "operation": "DescribeImageVersion",
+ "acceptors": [
+ {
+ "expected": "CREATED",
+ "matcher": "path",
+ "state": "success",
+ "argument": "ImageVersionStatus"
+ },
+ {
+ "expected": "CREATE_FAILED",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "ImageVersionStatus"
+ },
+ {
+ "expected": "ValidationException",
+ "matcher": "error",
+ "state": "failure"
+ }
+ ]
+ },
+ "ImageVersionDeleted": {
+ "delay": 60,
+ "maxAttempts": 60,
+ "operation": "DescribeImageVersion",
+ "acceptors": [
+ {
+ "expected": "ResourceNotFoundException",
+ "matcher": "error",
+ "state": "success"
+ },
+ {
+ "expected": "DELETE_FAILED",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "ImageVersionStatus"
+ },
+ {
+ "expected": "ValidationException",
+ "matcher": "error",
+ "state": "failure"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/savingsplans/2019-06-28/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/savingsplans/2019-06-28/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b010af59
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/savingsplans/2019-06-28/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/savingsplans/2019-06-28/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/savingsplans/2019-06-28/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/savingsplans/2019-06-28/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/savingsplans/2019-06-28/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/savingsplans/2019-06-28/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/savingsplans/2019-06-28/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/savingsplans/2019-06-28/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/savingsplans/2019-06-28/service-2.json.gz
new file mode 100644
index 00000000..893dee1b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/savingsplans/2019-06-28/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/scheduler/2021-06-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/scheduler/2021-06-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..0f336119
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/scheduler/2021-06-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/scheduler/2021-06-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/scheduler/2021-06-30/paginators-1.json
new file mode 100644
index 00000000..93b98ee2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/scheduler/2021-06-30/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "ListScheduleGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ScheduleGroups"
+ },
+ "ListSchedules": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Schedules"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/scheduler/2021-06-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/scheduler/2021-06-30/service-2.json.gz
new file mode 100644
index 00000000..422d618e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/scheduler/2021-06-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/schemas/2019-12-02/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/schemas/2019-12-02/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..43a722d2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/schemas/2019-12-02/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/schemas/2019-12-02/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/schemas/2019-12-02/paginators-1.json
new file mode 100644
index 00000000..ef2fe19d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/schemas/2019-12-02/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "ListDiscoverers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "Discoverers"
+ },
+ "ListRegistries": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "Registries"
+ },
+ "ListSchemaVersions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "SchemaVersions"
+ },
+ "ListSchemas": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "Schemas"
+ },
+ "SearchSchemas": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "Limit",
+ "result_key": "Schemas"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/schemas/2019-12-02/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/schemas/2019-12-02/service-2.json.gz
new file mode 100644
index 00000000..d3b220c5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/schemas/2019-12-02/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/schemas/2019-12-02/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/schemas/2019-12-02/waiters-2.json
new file mode 100644
index 00000000..4f642f61
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/schemas/2019-12-02/waiters-2.json
@@ -0,0 +1,36 @@
+{
+ "version": 2,
+ "waiters": {
+ "CodeBindingExists": {
+ "description": "Wait until code binding is generated",
+ "delay": 2,
+ "operation": "DescribeCodeBinding",
+ "maxAttempts": 30,
+ "acceptors": [
+ {
+ "expected": "CREATE_COMPLETE",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Status"
+ },
+ {
+ "expected": "CREATE_IN_PROGRESS",
+ "matcher": "path",
+ "state": "retry",
+ "argument": "Status"
+ },
+ {
+ "expected": "CREATE_FAILED",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "Status"
+ },
+ {
+ "matcher": "error",
+ "expected": "NotFoundException",
+ "state": "failure"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sdb/2009-04-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sdb/2009-04-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..19f57973
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sdb/2009-04-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sdb/2009-04-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sdb/2009-04-15/paginators-1.json
new file mode 100644
index 00000000..23620988
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sdb/2009-04-15/paginators-1.json
@@ -0,0 +1,15 @@
+{
+ "pagination": {
+ "ListDomains": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxNumberOfDomains",
+ "result_key": "DomainNames"
+ },
+ "Select": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sdb/2009-04-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sdb/2009-04-15/service-2.json.gz
new file mode 100644
index 00000000..ae08bd8f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sdb/2009-04-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sdk-default-configuration.json b/.venv/lib/python3.12/site-packages/botocore/data/sdk-default-configuration.json
new file mode 100644
index 00000000..3db13b26
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sdk-default-configuration.json
@@ -0,0 +1,55 @@
+{
+ "version": 1,
+ "base": {
+ "retryMode": "standard",
+ "stsRegionalEndpoints": "regional",
+ "s3UsEast1RegionalEndpoints": "regional",
+ "connectTimeoutInMillis": 1100,
+ "tlsNegotiationTimeoutInMillis": 1100
+ },
+ "modes": {
+ "standard": {
+ "connectTimeoutInMillis": {
+ "override": 3100
+ },
+ "tlsNegotiationTimeoutInMillis": {
+ "override": 3100
+ }
+ },
+ "in-region": {
+ },
+ "cross-region": {
+ "connectTimeoutInMillis": {
+ "override": 3100
+ },
+ "tlsNegotiationTimeoutInMillis": {
+ "override": 3100
+ }
+ },
+ "mobile": {
+ "connectTimeoutInMillis": {
+ "override": 30000
+ },
+ "tlsNegotiationTimeoutInMillis": {
+ "override": 30000
+ }
+ }
+ },
+ "documentation": {
+ "modes": {
+ "standard": "<p>The STANDARD mode provides the latest recommended default values that should be safe to run in most scenarios</p><p>Note that the default values vended from this mode might change as best practices may evolve. As a result, it is encouraged to perform tests when upgrading the SDK</p>",
+ "in-region": "<p>The IN_REGION mode builds on the standard mode and includes optimization tailored for applications which call AWS services from within the same AWS region</p><p>Note that the default values vended from this mode might change as best practices may evolve. As a result, it is encouraged to perform tests when upgrading the SDK</p>",
+ "cross-region": "<p>The CROSS_REGION mode builds on the standard mode and includes optimization tailored for applications which call AWS services in a different region</p><p>Note that the default values vended from this mode might change as best practices may evolve. As a result, it is encouraged to perform tests when upgrading the SDK</p>",
+ "mobile": "<p>The MOBILE mode builds on the standard mode and includes optimization tailored for mobile applications</p><p>Note that the default values vended from this mode might change as best practices may evolve. As a result, it is encouraged to perform tests when upgrading the SDK</p>",
+ "auto": "<p>The AUTO mode is an experimental mode that builds on the standard mode. The SDK will attempt to discover the execution environment to determine the appropriate settings automatically.</p><p>Note that the auto detection is heuristics-based and does not guarantee 100% accuracy. STANDARD mode will be used if the execution environment cannot be determined. The auto detection might query <a href=\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html\">EC2 Instance Metadata service</a>, which might introduce latency. Therefore we recommend choosing an explicit defaults_mode instead if startup latency is critical to your application</p>",
+ "legacy": "<p>The LEGACY mode provides default settings that vary per SDK and were used prior to establishment of defaults_mode</p>"
+ },
+ "configuration": {
+ "retryMode": "<p>A retry mode specifies how the SDK attempts retries. See <a href=\"https://docs.aws.amazon.com/sdkref/latest/guide/setting-global-retry_mode.html\">Retry Mode</a></p>",
+ "stsRegionalEndpoints": "<p>Specifies how the SDK determines the AWS service endpoint that it uses to talk to the AWS Security Token Service (AWS STS). See <a href=\"https://docs.aws.amazon.com/sdkref/latest/guide/setting-global-sts_regional_endpoints.html\">Setting STS Regional endpoints</a></p>",
+ "s3UsEast1RegionalEndpoints": "<p>Specifies how the SDK determines the AWS service endpoint that it uses to talk to the Amazon S3 for the us-east-1 region</p>",
+ "connectTimeoutInMillis": "<p>The amount of time after making an initial connection attempt on a socket, where if the client does not receive a completion of the connect handshake, the client gives up and fails the operation</p>",
+ "tlsNegotiationTimeoutInMillis": "<p>The maximum amount of time that a TLS handshake is allowed to take from the time the CLIENT HELLO message is sent to ethe time the client and server have fully negotiated ciphers and exchanged keys</p>"
+ }
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/secretsmanager/2017-10-17/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/secretsmanager/2017-10-17/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..898f3bac
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/secretsmanager/2017-10-17/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/secretsmanager/2017-10-17/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/secretsmanager/2017-10-17/examples-1.json
new file mode 100644
index 00000000..43a3ec4f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/secretsmanager/2017-10-17/examples-1.json
@@ -0,0 +1,596 @@
+{
+ "version": "1.0",
+ "examples": {
+ "CancelRotateSecret": [
+ {
+ "input": {
+ "SecretId": "MyTestDatabaseSecret"
+ },
+ "output": {
+ "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
+ "Name": "Name"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to cancel rotation for a secret. The operation sets the RotationEnabled field to false and cancels all scheduled rotations. To resume scheduled rotations, you must re-enable rotation by calling the rotate-secret operation.",
+ "id": "to-cancel-scheduled-rotation-for-a-secret-1523996016032",
+ "title": "To cancel scheduled rotation for a secret"
+ }
+ ],
+ "CreateSecret": [
+ {
+ "input": {
+ "ClientRequestToken": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1",
+ "Description": "My test database secret created with the CLI",
+ "Name": "MyTestDatabaseSecret",
+ "SecretString": "{\"username\":\"david\",\"password\":\"EXAMPLE-PASSWORD\"}"
+ },
+ "output": {
+ "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
+ "Name": "MyTestDatabaseSecret",
+ "VersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to create a secret. The credentials stored in the encrypted secret value are retrieved from a file on disk named mycreds.json.",
+ "id": "to-create-a-basic-secret-1523996473658",
+ "title": "To create a basic secret"
+ }
+ ],
+ "DeleteResourcePolicy": [
+ {
+ "input": {
+ "SecretId": "MyTestDatabaseSecret"
+ },
+ "output": {
+ "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseMasterSecret-a1b2c3",
+ "Name": "MyTestDatabaseSecret"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to delete the resource-based policy that is attached to a secret.",
+ "id": "to-delete-the-resource-based-policy-attached-to-a-secret-1530209419204",
+ "title": "To delete the resource-based policy attached to a secret"
+ }
+ ],
+ "DeleteSecret": [
+ {
+ "input": {
+ "RecoveryWindowInDays": 7,
+ "SecretId": "MyTestDatabaseSecret1"
+ },
+ "output": {
+ "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
+ "DeletionDate": "1524085349.095",
+ "Name": "MyTestDatabaseSecret"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to delete a secret. The secret stays in your account in a deprecated and inaccessible state until the recovery window ends. After the date and time in the DeletionDate response field has passed, you can no longer recover this secret with restore-secret.",
+ "id": "to-delete-a-secret-1523996905092",
+ "title": "To delete a secret"
+ }
+ ],
+ "DescribeSecret": [
+ {
+ "input": {
+ "SecretId": "MyTestDatabaseSecret"
+ },
+ "output": {
+ "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
+ "Description": "My test database secret",
+ "KmsKeyId": "arn:aws:kms:us-west-2:123456789012:key/EXAMPLE1-90ab-cdef-fedc-ba987KMSKEY1",
+ "LastAccessedDate": "1523923200",
+ "LastChangedDate": 1523477145.729,
+ "LastRotatedDate": 1525747253.72,
+ "Name": "MyTestDatabaseSecret",
+ "RotationEnabled": true,
+ "RotationLambdaARN": "arn:aws:lambda:us-west-2:123456789012:function:MyTestRotationLambda",
+ "RotationRules": {
+ "AutomaticallyAfterDays": 14,
+ "Duration": "2h",
+ "ScheduleExpression": "cron(0 16 1,15 * ? *)"
+ },
+ "Tags": [
+ {
+ "Key": "SecondTag",
+ "Value": "AnotherValue"
+ },
+ {
+ "Key": "FirstTag",
+ "Value": "SomeValue"
+ }
+ ],
+ "VersionIdsToStages": {
+ "EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE": [
+ "AWSPREVIOUS"
+ ],
+ "EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE": [
+ "AWSCURRENT"
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to get the details about a secret.",
+ "id": "to-retrieve-the-details-of-a-secret-1524000138629",
+ "title": "To retrieve the details of a secret"
+ }
+ ],
+ "GetRandomPassword": [
+ {
+ "input": {
+ "IncludeSpace": true,
+ "PasswordLength": 20,
+ "RequireEachIncludedType": true
+ },
+ "output": {
+ "RandomPassword": "EXAMPLE-PASSWORD"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to request a randomly generated password. This example includes the optional flags to require spaces and at least one character of each included type. It specifies a length of 20 characters.",
+ "id": "to-generate-a-random-password-1524000546092",
+ "title": "To generate a random password"
+ }
+ ],
+ "GetResourcePolicy": [
+ {
+ "input": {
+ "SecretId": "MyTestDatabaseSecret"
+ },
+ "output": {
+ "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
+ "Name": "MyTestDatabaseSecret",
+ "ResourcePolicy": "{\n\"Version\":\"2012-10-17\",\n\"Statement\":[{\n\"Effect\":\"Allow\",\n\"Principal\":{\n\"AWS\":\"arn:aws:iam::123456789012:root\"\n},\n\"Action\":\"secretsmanager:GetSecretValue\",\n\"Resource\":\"*\"\n}]\n}"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to retrieve the resource-based policy that is attached to a secret.",
+ "id": "to-retrieve-the-resource-based-policy-attached-to-a-secret-1530209677536",
+ "title": "To retrieve the resource-based policy attached to a secret"
+ }
+ ],
+ "GetSecretValue": [
+ {
+ "input": {
+ "SecretId": "MyTestDatabaseSecret"
+ },
+ "output": {
+ "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
+ "CreatedDate": 1523477145.713,
+ "Name": "MyTestDatabaseSecret",
+ "SecretString": "{\n \"username\":\"david\",\n \"password\":\"EXAMPLE-PASSWORD\"\n}\n",
+ "VersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1",
+ "VersionStages": [
+ "AWSPREVIOUS"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to retrieve a secret string value.",
+ "id": "to-retrieve-the-encrypted-secret-value-of-a-secret-1524000702484",
+ "title": "To retrieve the encrypted secret value of a secret"
+ }
+ ],
+ "ListSecretVersionIds": [
+ {
+ "input": {
+ "IncludeDeprecated": true,
+ "SecretId": "MyTestDatabaseSecret"
+ },
+ "output": {
+ "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
+ "Name": "MyTestDatabaseSecret",
+ "Versions": [
+ {
+ "CreatedDate": 1523477145.713,
+ "VersionId": "EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE",
+ "VersionStages": [
+ "AWSPREVIOUS"
+ ]
+ },
+ {
+ "CreatedDate": 1523486221.391,
+ "VersionId": "EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE",
+ "VersionStages": [
+ "AWSCURRENT"
+ ]
+ },
+ {
+ "CreatedDate": 1511974462.36,
+ "VersionId": "EXAMPLE3-90ab-cdef-fedc-ba987EXAMPLE;"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to retrieve a list of all of the versions of a secret, including those without any staging labels.",
+ "id": "to-list-all-of-the-secret-versions-associated-with-a-secret-1524000999164",
+ "title": "To list all of the secret versions associated with a secret"
+ }
+ ],
+ "ListSecrets": [
+ {
+ "input": {
+ },
+ "output": {
+ "SecretList": [
+ {
+ "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
+ "Description": "My test database secret",
+ "LastChangedDate": 1523477145.729,
+ "Name": "MyTestDatabaseSecret",
+ "SecretVersionsToStages": {
+ "EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE": [
+ "AWSCURRENT"
+ ]
+ }
+ },
+ {
+ "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret1-d4e5f6",
+ "Description": "Another secret created for a different database",
+ "LastChangedDate": 1523482025.685,
+ "Name": "MyTestDatabaseSecret1",
+ "SecretVersionsToStages": {
+ "EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE": [
+ "AWSCURRENT"
+ ]
+ }
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to list all of the secrets in your account.",
+ "id": "to-list-the-secrets-in-your-account-1524001246087",
+ "title": "To list the secrets in your account"
+ }
+ ],
+ "PutResourcePolicy": [
+ {
+ "input": {
+ "ResourcePolicy": "{\n\"Version\":\"2012-10-17\",\n\"Statement\":[{\n\"Effect\":\"Allow\",\n\"Principal\":{\n\"AWS\":\"arn:aws:iam::123456789012:root\"\n},\n\"Action\":\"secretsmanager:GetSecretValue\",\n\"Resource\":\"*\"\n}]\n}",
+ "SecretId": "MyTestDatabaseSecret"
+ },
+ "output": {
+ "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
+ "Name": "MyTestDatabaseSecret"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to add a resource-based policy to a secret.",
+ "id": "to-add-a-resource-based-policy-to-a-secret-1530209881839",
+ "title": "To add a resource-based policy to a secret"
+ }
+ ],
+ "PutSecretValue": [
+ {
+ "input": {
+ "ClientRequestToken": "EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE",
+ "SecretId": "MyTestDatabaseSecret",
+ "SecretString": "{\"username\":\"david\",\"password\":\"EXAMPLE-PASSWORD\"}"
+ },
+ "output": {
+ "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
+ "Name": "MyTestDatabaseSecret",
+ "VersionId": "EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE",
+ "VersionStages": [
+ "AWSCURRENT"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to create a new version of the secret. Alternatively, you can use the update-secret command.",
+ "id": "to-store-a-secret-value-in-a-new-version-of-a-secret-1524001393971",
+ "title": "To store a secret value in a new version of a secret"
+ }
+ ],
+ "RestoreSecret": [
+ {
+ "input": {
+ "SecretId": "MyTestDatabaseSecret"
+ },
+ "output": {
+ "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
+ "Name": "MyTestDatabaseSecret"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to restore a secret that you previously scheduled for deletion.",
+ "id": "to-restore-a-previously-deleted-secret-1524001513930",
+ "title": "To restore a previously deleted secret"
+ }
+ ],
+ "RotateSecret": [
+ {
+ "input": {
+ "RotationLambdaARN": "arn:aws:lambda:us-west-2:123456789012:function:MyTestDatabaseRotationLambda",
+ "RotationRules": {
+ "Duration": "2h",
+ "ScheduleExpression": "cron(0 16 1,15 * ? *)"
+ },
+ "SecretId": "MyTestDatabaseSecret"
+ },
+ "output": {
+ "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
+ "Name": "MyTestDatabaseSecret",
+ "VersionId": "EXAMPLE2-90ab-cdef-fedc-ba987SECRET2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example configures rotation for a secret using a cron expression. The first rotation happens immediately after the changes are stored in the secret. The rotation schedule is the first and 15th day of every month. The rotation window begins at 4:00 PM UTC and ends at 6:00 PM.",
+ "id": "to-configure-rotation-for-a-secret-1524001629475",
+ "title": "To configure rotation for a secret"
+ },
+ {
+ "input": {
+ "SecretId": "MyTestDatabaseSecret"
+ },
+ "output": {
+ "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
+ "Name": "MyTestDatabaseSecret",
+ "VersionId": "EXAMPLE2-90ab-cdef-fedc-ba987SECRET2"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example requests an immediate invocation of the secret's Lambda rotation function. It assumes that the specified secret already has rotation configured. The rotation function runs asynchronously in the background.",
+ "id": "to-request-an-immediate-rotation-for-a-secret-1524001949004",
+ "title": "To request an immediate rotation for a secret"
+ }
+ ],
+ "TagResource": [
+ {
+ "input": {
+ "SecretId": "MyExampleSecret",
+ "Tags": [
+ {
+ "Key": "FirstTag",
+ "Value": "SomeValue"
+ },
+ {
+ "Key": "SecondTag",
+ "Value": "AnotherValue"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to attach two tags each with a Key and Value to a secret. There is no output from this API. To see the result, use the DescribeSecret operation.",
+ "id": "to-add-tags-to-a-secret-1524002106718",
+ "title": "To add tags to a secret"
+ }
+ ],
+ "UntagResource": [
+ {
+ "input": {
+ "SecretId": "MyTestDatabaseSecret",
+ "TagKeys": [
+ "FirstTag",
+ "SecondTag"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to remove two tags from a secret's metadata. For each, both the tag and the associated value are removed. There is no output from this API. To see the result, use the DescribeSecret operation.",
+ "id": "to-remove-tags-from-a-secret-1524002239065",
+ "title": "To remove tags from a secret"
+ }
+ ],
+ "UpdateSecret": [
+ {
+ "input": {
+ "ClientRequestToken": "EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE",
+ "Description": "This is a new description for the secret.",
+ "SecretId": "MyTestDatabaseSecret"
+ },
+ "output": {
+ "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
+ "Name": "MyTestDatabaseSecret"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to modify the description of a secret.",
+ "id": "to-update-the-description-of-a-secret-1524002349094",
+ "title": "To update the description of a secret"
+ },
+ {
+ "input": {
+ "KmsKeyId": "arn:aws:kms:us-west-2:123456789012:key/EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE",
+ "SecretId": "MyTestDatabaseSecret"
+ },
+ "output": {
+ "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
+ "Name": "MyTestDatabaseSecret"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example shows how to update the KMS customer managed key (CMK) used to encrypt the secret value. The KMS CMK must be in the same region as the secret.",
+ "id": "to-update-the-kms-key-associated-with-a-secret-1524002421563",
+ "title": "To update the KMS key associated with a secret"
+ },
+ {
+ "input": {
+ "SecretId": "MyTestDatabaseSecret",
+ "SecretString": "{JSON STRING WITH CREDENTIALS}"
+ },
+ "output": {
+ "ARN": "aws:arn:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
+ "Name": "MyTestDatabaseSecret",
+ "VersionId": "EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to create a new version of the secret by updating the SecretString field. Alternatively, you can use the put-secret-value operation.",
+ "id": "to-create-a-new-version-of-the-encrypted-secret-value-1524004651836",
+ "title": "To create a new version of the encrypted secret value"
+ }
+ ],
+ "UpdateSecretVersionStage": [
+ {
+ "input": {
+ "MoveToVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1",
+ "SecretId": "MyTestDatabaseSecret",
+ "VersionStage": "STAGINGLABEL1"
+ },
+ "output": {
+ "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
+ "Name": "MyTestDatabaseSecret"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows you how to add a staging label to a version of a secret. You can review the results by running the operation ListSecretVersionIds and viewing the VersionStages response field for the affected version.",
+ "id": "to-add-a-staging-label-attached-to-a-version-of-a-secret-1524004783841",
+ "title": "To add a staging label attached to a version of a secret"
+ },
+ {
+ "input": {
+ "RemoveFromVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1",
+ "SecretId": "MyTestDatabaseSecret",
+ "VersionStage": "STAGINGLABEL1"
+ },
+ "output": {
+ "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
+ "Name": "MyTestDatabaseSecret"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows you how to delete a staging label that is attached to a version of a secret. You can review the results by running the operation ListSecretVersionIds and viewing the VersionStages response field for the affected version.",
+ "id": "to-delete-a-staging-label-attached-to-a-version-of-a-secret-1524004862181",
+ "title": "To delete a staging label attached to a version of a secret"
+ },
+ {
+ "input": {
+ "MoveToVersionId": "EXAMPLE2-90ab-cdef-fedc-ba987SECRET2",
+ "RemoveFromVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1",
+ "SecretId": "MyTestDatabaseSecret",
+ "VersionStage": "AWSCURRENT"
+ },
+ "output": {
+ "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
+ "Name": "MyTestDatabaseSecret"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows you how to move a staging label that is attached to one version of a secret to a different version. You can review the results by running the operation ListSecretVersionIds and viewing the VersionStages response field for the affected version.",
+ "id": "to-move-a-staging-label-from-one-version-of-a-secret-to-another-1524004963841",
+ "title": "To move a staging label from one version of a secret to another"
+ }
+ ],
+ "ValidateResourcePolicy": [
+ {
+ "input": {
+ "ResourcePolicy": "{\n\"Version\":\"2012-10-17\",\n\"Statement\":[{\n\"Effect\":\"Allow\",\n\"Principal\":{\n\"AWS\":\"arn:aws:iam::123456789012:root\"\n},\n\"Action\":\"secretsmanager:GetSecretValue\",\n\"Resource\":\"*\"\n}]\n}",
+ "SecretId": "MyTestDatabaseSecret"
+ },
+ "output": {
+ "PolicyValidationPassed": true,
+ "ValidationErrors": [
+
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows how to validate a resource-based policy to a secret.",
+ "id": "to-validate-the-resource-policy-of-a-secret-1524000138629",
+ "title": "To validate a resource-based policy to a secret"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/secretsmanager/2017-10-17/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/secretsmanager/2017-10-17/paginators-1.json
new file mode 100644
index 00000000..0f62e8e1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/secretsmanager/2017-10-17/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListSecrets": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "SecretList"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/secretsmanager/2017-10-17/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/secretsmanager/2017-10-17/service-2.json.gz
new file mode 100644
index 00000000..f2d8c308
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/secretsmanager/2017-10-17/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/secretsmanager/2017-10-17/service-2.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/secretsmanager/2017-10-17/service-2.sdk-extras.json
new file mode 100644
index 00000000..dc78f892
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/secretsmanager/2017-10-17/service-2.sdk-extras.json
@@ -0,0 +1,8 @@
+{
+ "version": 1.0,
+ "merge": {
+ "metadata": {
+ "serviceId": "Secrets Manager"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/security-ir/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/security-ir/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b76ca880
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/security-ir/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/security-ir/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/security-ir/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..2927d386
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/security-ir/2018-05-10/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListCaseEdits": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListCases": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListComments": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListMemberships": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/security-ir/2018-05-10/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/security-ir/2018-05-10/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..74820d54
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/security-ir/2018-05-10/paginators-1.sdk-extras.json
@@ -0,0 +1,22 @@
+{
+ "version": 1,
+ "merge": {
+ "pagination": {
+ "ListCaseEdits": {
+ "non_aggregate_keys": [
+ "total"
+ ]
+ },
+ "ListCases": {
+ "non_aggregate_keys": [
+ "total"
+ ]
+ },
+ "ListComments": {
+ "non_aggregate_keys": [
+ "total"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/security-ir/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/security-ir/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..06f12254
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/security-ir/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/security-ir/2018-05-10/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/security-ir/2018-05-10/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/security-ir/2018-05-10/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/securityhub/2018-10-26/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/securityhub/2018-10-26/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b52a4d66
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/securityhub/2018-10-26/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/securityhub/2018-10-26/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/securityhub/2018-10-26/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/securityhub/2018-10-26/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/securityhub/2018-10-26/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/securityhub/2018-10-26/paginators-1.json
new file mode 100644
index 00000000..7fae041f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/securityhub/2018-10-26/paginators-1.json
@@ -0,0 +1,106 @@
+{
+ "pagination": {
+ "GetEnabledStandards": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "StandardsSubscriptions"
+ },
+ "GetFindings": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Findings"
+ },
+ "GetInsights": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Insights"
+ },
+ "ListEnabledProductsForImport": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ProductSubscriptions"
+ },
+ "ListInvitations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Invitations"
+ },
+ "ListMembers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Members"
+ },
+ "DescribeActionTargets": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ActionTargets"
+ },
+ "DescribeProducts": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Products"
+ },
+ "DescribeStandards": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Standards"
+ },
+ "DescribeStandardsControls": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Controls"
+ },
+ "ListOrganizationAdminAccounts": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AdminAccounts"
+ },
+ "ListFindingAggregators": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "FindingAggregators"
+ },
+ "ListSecurityControlDefinitions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SecurityControlDefinitions"
+ },
+ "ListStandardsControlAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "StandardsControlAssociationSummaries"
+ },
+ "GetFindingHistory": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Records"
+ },
+ "ListConfigurationPolicies": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ConfigurationPolicySummaries"
+ },
+ "ListConfigurationPolicyAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ConfigurationPolicyAssociationSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/securityhub/2018-10-26/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/securityhub/2018-10-26/service-2.json.gz
new file mode 100644
index 00000000..5fa056d5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/securityhub/2018-10-26/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/securitylake/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/securitylake/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..fe0c62ff
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/securitylake/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/securitylake/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/securitylake/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..19e482b2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/securitylake/2018-05-10/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "GetDataLakeSources": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "dataLakeSources"
+ },
+ "ListDataLakeExceptions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "exceptions"
+ },
+ "ListLogSources": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "sources"
+ },
+ "ListSubscribers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "subscribers"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/securitylake/2018-05-10/paginators-1.sdk-extras.json b/.venv/lib/python3.12/site-packages/botocore/data/securitylake/2018-05-10/paginators-1.sdk-extras.json
new file mode 100644
index 00000000..41ae7fe6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/securitylake/2018-05-10/paginators-1.sdk-extras.json
@@ -0,0 +1,12 @@
+{
+ "version": 1.0,
+ "merge": {
+ "pagination": {
+ "GetDataLakeSources": {
+ "non_aggregate_keys": [
+ "dataLakeArn"
+ ]
+ }
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/securitylake/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/securitylake/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..568b60a9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/securitylake/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/serverlessrepo/2017-09-08/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/serverlessrepo/2017-09-08/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..7ad5582f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/serverlessrepo/2017-09-08/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/serverlessrepo/2017-09-08/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/serverlessrepo/2017-09-08/paginators-1.json
new file mode 100644
index 00000000..a39e5477
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/serverlessrepo/2017-09-08/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListApplicationDependencies": {
+ "input_token": "NextToken",
+ "limit_key": "MaxItems",
+ "output_token": "NextToken",
+ "result_key": "Dependencies"
+ },
+ "ListApplicationVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxItems",
+ "output_token": "NextToken",
+ "result_key": "Versions"
+ },
+ "ListApplications": {
+ "input_token": "NextToken",
+ "limit_key": "MaxItems",
+ "output_token": "NextToken",
+ "result_key": "Applications"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/serverlessrepo/2017-09-08/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/serverlessrepo/2017-09-08/service-2.json.gz
new file mode 100644
index 00000000..c86a6e67
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/serverlessrepo/2017-09-08/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/service-quotas/2019-06-24/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/service-quotas/2019-06-24/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..41e09ee7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/service-quotas/2019-06-24/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/service-quotas/2019-06-24/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/service-quotas/2019-06-24/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/service-quotas/2019-06-24/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/service-quotas/2019-06-24/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/service-quotas/2019-06-24/paginators-1.json
new file mode 100644
index 00000000..e0d45476
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/service-quotas/2019-06-24/paginators-1.json
@@ -0,0 +1,40 @@
+{
+ "pagination": {
+ "ListAWSDefaultServiceQuotas": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Quotas"
+ },
+ "ListRequestedServiceQuotaChangeHistory": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "RequestedQuotas"
+ },
+ "ListRequestedServiceQuotaChangeHistoryByQuota": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "RequestedQuotas"
+ },
+ "ListServiceQuotaIncreaseRequestsInTemplate": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ServiceQuotaIncreaseRequestInTemplateList"
+ },
+ "ListServiceQuotas": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Quotas"
+ },
+ "ListServices": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Services"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/service-quotas/2019-06-24/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/service-quotas/2019-06-24/service-2.json.gz
new file mode 100644
index 00000000..9d5d8e7f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/service-quotas/2019-06-24/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog-appregistry/2020-06-24/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog-appregistry/2020-06-24/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..75079a60
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog-appregistry/2020-06-24/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog-appregistry/2020-06-24/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog-appregistry/2020-06-24/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog-appregistry/2020-06-24/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog-appregistry/2020-06-24/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog-appregistry/2020-06-24/paginators-1.json
new file mode 100644
index 00000000..55281fb7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog-appregistry/2020-06-24/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "ListApplications": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "applications"
+ },
+ "ListAssociatedAttributeGroups": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "attributeGroups"
+ },
+ "ListAssociatedResources": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "resources"
+ },
+ "ListAttributeGroups": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "attributeGroups"
+ },
+ "ListAttributeGroupsForApplication": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "attributeGroupsDetails"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog-appregistry/2020-06-24/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog-appregistry/2020-06-24/service-2.json.gz
new file mode 100644
index 00000000..56e854a4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog-appregistry/2020-06-24/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog/2015-12-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog/2015-12-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..935bfe30
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog/2015-12-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog/2015-12-10/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog/2015-12-10/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog/2015-12-10/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog/2015-12-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog/2015-12-10/paginators-1.json
new file mode 100644
index 00000000..5770fefa
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog/2015-12-10/paginators-1.json
@@ -0,0 +1,100 @@
+{
+ "pagination": {
+ "SearchProductsAsAdmin": {
+ "result_key": "ProductViewDetails",
+ "output_token": "NextPageToken",
+ "input_token": "PageToken",
+ "limit_key": "PageSize"
+ },
+ "ListAcceptedPortfolioShares": {
+ "result_key": "PortfolioDetails",
+ "output_token": "NextPageToken",
+ "input_token": "PageToken",
+ "limit_key": "PageSize"
+ },
+ "ListPortfolios": {
+ "result_key": "PortfolioDetails",
+ "output_token": "NextPageToken",
+ "input_token": "PageToken",
+ "limit_key": "PageSize"
+ },
+ "ListConstraintsForPortfolio": {
+ "result_key": "ConstraintDetails",
+ "output_token": "NextPageToken",
+ "input_token": "PageToken",
+ "limit_key": "PageSize"
+ },
+ "ListLaunchPaths": {
+ "result_key": "LaunchPathSummaries",
+ "output_token": "NextPageToken",
+ "input_token": "PageToken",
+ "limit_key": "PageSize"
+ },
+ "ListTagOptions": {
+ "result_key": "TagOptionDetails",
+ "output_token": "PageToken",
+ "input_token": "PageToken",
+ "limit_key": "PageSize"
+ },
+ "ListPortfoliosForProduct": {
+ "result_key": "PortfolioDetails",
+ "output_token": "NextPageToken",
+ "input_token": "PageToken",
+ "limit_key": "PageSize"
+ },
+ "ListPrincipalsForPortfolio": {
+ "result_key": "Principals",
+ "output_token": "NextPageToken",
+ "input_token": "PageToken",
+ "limit_key": "PageSize"
+ },
+ "ListResourcesForTagOption": {
+ "result_key": "ResourceDetails",
+ "output_token": "PageToken",
+ "input_token": "PageToken",
+ "limit_key": "PageSize"
+ },
+ "ListOrganizationPortfolioAccess": {
+ "input_token": "PageToken",
+ "limit_key": "PageSize",
+ "output_token": "NextPageToken",
+ "result_key": "OrganizationNodes"
+ },
+ "ListProvisionedProductPlans": {
+ "input_token": "PageToken",
+ "limit_key": "PageSize",
+ "output_token": "NextPageToken",
+ "result_key": "ProvisionedProductPlans"
+ },
+ "ListProvisioningArtifactsForServiceAction": {
+ "input_token": "PageToken",
+ "limit_key": "PageSize",
+ "output_token": "NextPageToken",
+ "result_key": "ProvisioningArtifactViews"
+ },
+ "ListRecordHistory": {
+ "input_token": "PageToken",
+ "limit_key": "PageSize",
+ "output_token": "NextPageToken",
+ "result_key": "RecordDetails"
+ },
+ "ListServiceActions": {
+ "input_token": "PageToken",
+ "limit_key": "PageSize",
+ "output_token": "NextPageToken",
+ "result_key": "ServiceActionSummaries"
+ },
+ "ListServiceActionsForProvisioningArtifact": {
+ "input_token": "PageToken",
+ "limit_key": "PageSize",
+ "output_token": "NextPageToken",
+ "result_key": "ServiceActionSummaries"
+ },
+ "ScanProvisionedProducts": {
+ "input_token": "PageToken",
+ "limit_key": "PageSize",
+ "output_token": "NextPageToken",
+ "result_key": "ProvisionedProducts"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog/2015-12-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog/2015-12-10/service-2.json.gz
new file mode 100644
index 00000000..87b245eb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/servicecatalog/2015-12-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/servicediscovery/2017-03-14/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/servicediscovery/2017-03-14/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..a04a9e1d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/servicediscovery/2017-03-14/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/servicediscovery/2017-03-14/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/servicediscovery/2017-03-14/examples-1.json
new file mode 100644
index 00000000..cc99fe4c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/servicediscovery/2017-03-14/examples-1.json
@@ -0,0 +1,672 @@
+{
+ "version": "1.0",
+ "examples": {
+ "CreateHttpNamespace": [
+ {
+ "input": {
+ "CreatorRequestId": "example-creator-request-id-0001",
+ "Description": "Example.com AWS Cloud Map HTTP Namespace",
+ "Name": "example-http.com"
+ },
+ "output": {
+ "OperationId": "httpvoqozuhfet5kzxoxg-a-response-example"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates an HTTP namespace.",
+ "id": "createhttpnamespace-example-1590114811304",
+ "title": "CreateHttpNamespace example"
+ }
+ ],
+ "CreatePrivateDnsNamespace": [
+ {
+ "input": {
+ "CreatorRequestId": "eedd6892-50f3-41b2-8af9-611d6e1d1a8c",
+ "Name": "example.com",
+ "Vpc": "vpc-1c56417b"
+ },
+ "output": {
+ "OperationId": "gv4g5meo7ndmeh4fqskygvk23d2fijwa-k9302yzd"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Example: Create private DNS namespace",
+ "id": "example-create-private-dns-namespace-1587058592930",
+ "title": "Example: Create private DNS namespace"
+ }
+ ],
+ "CreatePublicDnsNamespace": [
+ {
+ "input": {
+ "CreatorRequestId": "example-creator-request-id-0003",
+ "Description": "Example.com AWS Cloud Map Public DNS Namespace",
+ "Name": "example-public-dns.com"
+ },
+ "output": {
+ "OperationId": "dns2voqozuhfet5kzxoxg-a-response-example"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example creates a public namespace based on DNS.",
+ "id": "createpublicdnsnamespace-example-1590114940910",
+ "title": "CreatePublicDnsNamespace example"
+ }
+ ],
+ "CreateService": [
+ {
+ "input": {
+ "CreatorRequestId": "567c1193-6b00-4308-bd57-ad38a8822d25",
+ "DnsConfig": {
+ "DnsRecords": [
+ {
+ "TTL": 60,
+ "Type": "A"
+ }
+ ],
+ "NamespaceId": "ns-ylexjili4cdxy3xm",
+ "RoutingPolicy": "MULTIVALUE"
+ },
+ "Name": "myservice",
+ "NamespaceId": "ns-ylexjili4cdxy3xm"
+ },
+ "output": {
+ "Service": {
+ "Arn": "arn:aws:servicediscovery:us-west-2:123456789012:service/srv-p5zdwlg5uvvzjita",
+ "CreateDate": 1587081768.334,
+ "CreatorRequestId": "567c1193-6b00-4308-bd57-ad38a8822d25",
+ "DnsConfig": {
+ "DnsRecords": [
+ {
+ "TTL": 60,
+ "Type": "A"
+ }
+ ],
+ "NamespaceId": "ns-ylexjili4cdxy3xm",
+ "RoutingPolicy": "MULTIVALUE"
+ },
+ "Id": "srv-p5zdwlg5uvvzjita",
+ "Name": "myservice",
+ "NamespaceId": "ns-ylexjili4cdxy3xm"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Example: Create service",
+ "id": "example-create-service-1587235913584",
+ "title": "Example: Create service"
+ }
+ ],
+ "DeleteNamespace": [
+ {
+ "input": {
+ "Id": "ns-ylexjili4cdxy3xm"
+ },
+ "output": {
+ "OperationId": "gv4g5meo7ndmeh4fqskygvk23d2fijwa-k98y6drk"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Example: Delete namespace",
+ "id": "example-delete-namespace-1587416093508",
+ "title": "Example: Delete namespace"
+ }
+ ],
+ "DeleteService": [
+ {
+ "input": {
+ "Id": "srv-p5zdwlg5uvvzjita"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Example: Delete service",
+ "id": "example-delete-service-1587416462902",
+ "title": "Example: Delete service"
+ }
+ ],
+ "DeregisterInstance": [
+ {
+ "input": {
+ "InstanceId": "myservice-53",
+ "ServiceId": "srv-p5zdwlg5uvvzjita"
+ },
+ "output": {
+ "OperationId": "4yejorelbukcjzpnr6tlmrghsjwpngf4-k98rnaiq"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Example: Deregister a service instance",
+ "id": "example-deregister-a-service-instance-1587416305738",
+ "title": "Example: Deregister a service instance"
+ }
+ ],
+ "DiscoverInstances": [
+ {
+ "input": {
+ "HealthStatus": "ALL",
+ "MaxResults": 10,
+ "NamespaceName": "example.com",
+ "ServiceName": "myservice"
+ },
+ "output": {
+ "Instances": [
+ {
+ "Attributes": {
+ "AWS_INSTANCE_IPV4": "172.2.1.3",
+ "AWS_INSTANCE_PORT": "808"
+ },
+ "HealthStatus": "UNKNOWN",
+ "InstanceId": "myservice-53",
+ "NamespaceName": "example.com",
+ "ServiceName": "myservice"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Example: Discover registered instances",
+ "id": "example-discover-registered-instances-1587236343568",
+ "title": "Example: Discover registered instances"
+ }
+ ],
+ "GetInstance": [
+ {
+ "input": {
+ "InstanceId": "i-abcd1234",
+ "ServiceId": "srv-e4anhexample0004"
+ },
+ "output": {
+ "Instance": {
+ "Attributes": {
+ "AWS_INSTANCE_IPV4": "192.0.2.44",
+ "AWS_INSTANCE_PORT": "80",
+ "color": "green",
+ "region": "us-west-2",
+ "stage": "beta"
+ },
+ "Id": "i-abcd1234"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example gets information about a specified instance.",
+ "id": "getinstance-example-1590115065598",
+ "title": "GetInstance example"
+ }
+ ],
+ "GetInstancesHealthStatus": [
+ {
+ "input": {
+ "ServiceId": "srv-e4anhexample0004"
+ },
+ "output": {
+ "Status": {
+ "i-abcd1234": "HEALTHY",
+ "i-abcd1235": "UNHEALTHY"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example gets the current health status of one or more instances that are associate with a specified service.",
+ "id": "getinstanceshealthstatus-example-1590115176146",
+ "title": "GetInstancesHealthStatus example"
+ }
+ ],
+ "GetNamespace": [
+ {
+ "input": {
+ "Id": "ns-e4anhexample0004"
+ },
+ "output": {
+ "Namespace": {
+ "Arn": "arn:aws:servicediscovery:us-west-2: 123456789120:namespace/ns-e1tpmexample0001",
+ "CreateDate": "20181118T211712Z",
+ "CreatorRequestId": "example-creator-request-id-0001",
+ "Description": "Example.com AWS Cloud Map HTTP Namespace",
+ "Id": "ns-e1tpmexample0001",
+ "Name": "example-http.com",
+ "Properties": {
+ "DnsProperties": {
+ },
+ "HttpProperties": {
+ "HttpName": "example-http.com"
+ }
+ },
+ "Type": "HTTP"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example gets information about a specified namespace.",
+ "id": "getnamespace-example-1590115383708",
+ "title": "GetNamespace example"
+ }
+ ],
+ "GetOperation": [
+ {
+ "input": {
+ "OperationId": "gv4g5meo7ndmeh4fqskygvk23d2fijwa-k9302yzd"
+ },
+ "output": {
+ "Operation": {
+ "CreateDate": 1587055860.121,
+ "Id": "gv4g5meo7ndmeh4fqskygvk23d2fijwa-k9302yzd",
+ "Status": "SUCCESS",
+ "Targets": {
+ "NAMESPACE": "ns-ylexjili4cdxy3xm"
+ },
+ "Type": "CREATE_NAMESPACE",
+ "UpdateDate": 1587055900.469
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Example: Get operation result",
+ "id": "example-get-operation-result-1587073807124",
+ "title": "Example: Get operation result"
+ }
+ ],
+ "GetService": [
+ {
+ "input": {
+ "Id": "srv-e4anhexample0004"
+ },
+ "output": {
+ "Service": {
+ "Arn": "arn:aws:servicediscovery:us-west-2:123456789120:service/srv-e4anhexample0004",
+ "CreateDate": "20181118T211707Z",
+ "CreatorRequestId": "example-creator-request-id-0004",
+ "Description": "Example.com AWS Cloud Map HTTP Service",
+ "HealthCheckConfig": {
+ "FailureThreshold": 3,
+ "ResourcePath": "/",
+ "Type": "HTTPS"
+ },
+ "Id": "srv-e4anhexample0004",
+ "Name": "example-http-service",
+ "NamespaceId": "ns-e4anhexample0004"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example gets the settings for a specified service.",
+ "id": "getservice-example-1590117234294",
+ "title": "GetService Example"
+ }
+ ],
+ "ListInstances": [
+ {
+ "input": {
+ "ServiceId": "srv-qzpwvt2tfqcegapy"
+ },
+ "output": {
+ "Instances": [
+ {
+ "Attributes": {
+ "AWS_INSTANCE_IPV4": "172.2.1.3",
+ "AWS_INSTANCE_PORT": "808"
+ },
+ "Id": "i-06bdabbae60f65a4e"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Example: List service instances",
+ "id": "example-list-service-instances-1587236237008",
+ "title": "Example: List service instances"
+ }
+ ],
+ "ListNamespaces": [
+ {
+ "input": {
+ },
+ "output": {
+ "Namespaces": [
+ {
+ "Arn": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-a3ccy2e7e3a7rile",
+ "CreateDate": 1585354387.357,
+ "Id": "ns-a3ccy2e7e3a7rile",
+ "Name": "local",
+ "Properties": {
+ "DnsProperties": {
+ "HostedZoneId": "Z06752353VBUDTC32S84S"
+ },
+ "HttpProperties": {
+ "HttpName": "local"
+ }
+ },
+ "Type": "DNS_PRIVATE"
+ },
+ {
+ "Arn": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-pocfyjtrsmwtvcxx",
+ "CreateDate": 1586468974.698,
+ "Description": "My second namespace",
+ "Id": "ns-pocfyjtrsmwtvcxx",
+ "Name": "My-second-namespace",
+ "Properties": {
+ "DnsProperties": {
+ },
+ "HttpProperties": {
+ "HttpName": "My-second-namespace"
+ }
+ },
+ "Type": "HTTP"
+ },
+ {
+ "Arn": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-ylexjili4cdxy3xm",
+ "CreateDate": 1587055896.798,
+ "Id": "ns-ylexjili4cdxy3xm",
+ "Name": "example.com",
+ "Properties": {
+ "DnsProperties": {
+ "HostedZoneId": "Z09983722P0QME1B3KC8I"
+ },
+ "HttpProperties": {
+ "HttpName": "example.com"
+ }
+ },
+ "Type": "DNS_PRIVATE"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Example: List namespaces",
+ "id": "example-list-namespaces-1587401553154",
+ "title": "Example: List namespaces"
+ }
+ ],
+ "ListOperations": [
+ {
+ "input": {
+ "Filters": [
+ {
+ "Condition": "IN",
+ "Name": "STATUS",
+ "Values": [
+ "PENDING",
+ "SUCCESS"
+ ]
+ }
+ ]
+ },
+ "output": {
+ "Operations": [
+ {
+ "Id": "76yy8ovhpdz0plmjzbsnqgnrqvpv2qdt-kexample",
+ "Status": "SUCCESS"
+ },
+ {
+ "Id": "prysnyzpji3u2ciy45nke83x2zanl7yk-dexample",
+ "Status": "SUCCESS"
+ },
+ {
+ "Id": "ko4ekftir7kzlbechsh7xvcdgcpk66gh-7example",
+ "Status": "PENDING"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example gets the operations that have a STATUS of either PENDING or SUCCESS.",
+ "id": "listoperations-example-1590117354396",
+ "title": "ListOperations Example"
+ }
+ ],
+ "ListServices": [
+ {
+ "input": {
+ },
+ "output": {
+ "Services": [
+ {
+ "Arn": "arn:aws:servicediscovery:us-west-2:123456789012:service/srv-p5zdwlg5uvvzjita",
+ "CreateDate": 1587081768.334,
+ "DnsConfig": {
+ "DnsRecords": [
+ {
+ "TTL": 60,
+ "Type": "A"
+ }
+ ],
+ "RoutingPolicy": "MULTIVALUE"
+ },
+ "Id": "srv-p5zdwlg5uvvzjita",
+ "Name": "myservice"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Example: List services",
+ "id": "example-list-services-1587236889840",
+ "title": "Example: List services"
+ }
+ ],
+ "ListTagsForResource": [
+ {
+ "input": {
+ "ResourceARN": "arn:aws:servicediscovery:us-east-1:123456789012:namespace/ns-ylexjili4cdxy3xm"
+ },
+ "output": {
+ "Tags": [
+ {
+ "Key": "Project",
+ "Value": "Zeta"
+ },
+ {
+ "Key": "Department",
+ "Value": "Engineering"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example lists the tags of a resource.",
+ "id": "listtagsforresource-example-1590093928416",
+ "title": "ListTagsForResource example"
+ }
+ ],
+ "RegisterInstance": [
+ {
+ "input": {
+ "Attributes": {
+ "AWS_INSTANCE_IPV4": "172.2.1.3",
+ "AWS_INSTANCE_PORT": "808"
+ },
+ "CreatorRequestId": "7a48a98a-72e6-4849-bfa7-1a458e030d7b",
+ "InstanceId": "myservice-53",
+ "ServiceId": "srv-p5zdwlg5uvvzjita"
+ },
+ "output": {
+ "OperationId": "4yejorelbukcjzpnr6tlmrghsjwpngf4-k95yg2u7"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Example: Register Instance",
+ "id": "example-register-instance-1587236116314",
+ "title": "Example: Register Instance"
+ }
+ ],
+ "TagResource": [
+ {
+ "input": {
+ "ResourceARN": "arn:aws:servicediscovery:us-east-1:123456789012:namespace/ns-ylexjili4cdxy3xm",
+ "Tags": [
+ {
+ "Key": "Department",
+ "Value": "Engineering"
+ },
+ {
+ "Key": "Project",
+ "Value": "Zeta"
+ }
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example adds \"Department\" and \"Project\" tags to a resource.",
+ "id": "tagresource-example-1590093532240",
+ "title": "TagResource example"
+ }
+ ],
+ "UntagResource": [
+ {
+ "input": {
+ "ResourceARN": "arn:aws:servicediscovery:us-east-1:123456789012:namespace/ns-ylexjili4cdxy3xm",
+ "TagKeys": [
+ "Project",
+ "Department"
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example removes the \"Department\" and \"Project\" tags from a resource.",
+ "id": "untagresource-example-1590094024672",
+ "title": "UntagResource example"
+ }
+ ],
+ "UpdateInstanceCustomHealthStatus": [
+ {
+ "input": {
+ "InstanceId": "i-abcd1234",
+ "ServiceId": "srv-e4anhexample0004",
+ "Status": "HEALTHY"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example submits a request to change the health status of an instance associated with a service with a custom health check to HEALTHY.",
+ "id": "updateinstancecustomhealthstatus-example-1590118408574",
+ "title": "UpdateInstanceCustomHealthStatus Example"
+ }
+ ],
+ "UpdateService": [
+ {
+ "input": {
+ "Id": "srv-e4anhexample0004",
+ "Service": {
+ "DnsConfig": {
+ "DnsRecords": [
+ {
+ "TTL": 60,
+ "Type": "A"
+ }
+ ]
+ },
+ "HealthCheckConfig": {
+ "FailureThreshold": 2,
+ "ResourcePath": "/",
+ "Type": "HTTP"
+ }
+ }
+ },
+ "output": {
+ "OperationId": "m35hsdrkxwjffm3xef4bxyy6vc3ewakx-jdn3y5g5"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example submits a request to replace the DnsConfig and HealthCheckConfig settings of a specified service.",
+ "id": "updateservice-example-1590117830880",
+ "title": "UpdateService Example"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/servicediscovery/2017-03-14/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/servicediscovery/2017-03-14/paginators-1.json
new file mode 100644
index 00000000..f58df70e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/servicediscovery/2017-03-14/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListServices": {
+ "result_key": "Services",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListInstances": {
+ "result_key": "Instances",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListNamespaces": {
+ "result_key": "Namespaces",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListOperations": {
+ "result_key": "Operations",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/servicediscovery/2017-03-14/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/servicediscovery/2017-03-14/service-2.json.gz
new file mode 100644
index 00000000..e4f44ef4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/servicediscovery/2017-03-14/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ses/2010-12-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ses/2010-12-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..195d7f47
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ses/2010-12-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ses/2010-12-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ses/2010-12-01/examples-1.json
new file mode 100644
index 00000000..e5690330
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ses/2010-12-01/examples-1.json
@@ -0,0 +1,1021 @@
+{
+ "version": "1.0",
+ "examples": {
+ "CloneReceiptRuleSet": [
+ {
+ "input": {
+ "OriginalRuleSetName": "RuleSetToClone",
+ "RuleSetName": "RuleSetToCreate"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates a receipt rule set by cloning an existing one:",
+ "id": "clonereceiptruleset-1469055039770",
+ "title": "CloneReceiptRuleSet"
+ }
+ ],
+ "CreateReceiptFilter": [
+ {
+ "input": {
+ "Filter": {
+ "IpFilter": {
+ "Cidr": "1.2.3.4/24",
+ "Policy": "Allow"
+ },
+ "Name": "MyFilter"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates a new IP address filter:",
+ "id": "createreceiptfilter-1469122681253",
+ "title": "CreateReceiptFilter"
+ }
+ ],
+ "CreateReceiptRule": [
+ {
+ "input": {
+ "After": "",
+ "Rule": {
+ "Actions": [
+ {
+ "S3Action": {
+ "BucketName": "MyBucket",
+ "ObjectKeyPrefix": "email"
+ }
+ }
+ ],
+ "Enabled": true,
+ "Name": "MyRule",
+ "ScanEnabled": true,
+ "TlsPolicy": "Optional"
+ },
+ "RuleSetName": "MyRuleSet"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates a new receipt rule:",
+ "id": "createreceiptrule-1469122946515",
+ "title": "CreateReceiptRule"
+ }
+ ],
+ "CreateReceiptRuleSet": [
+ {
+ "input": {
+ "RuleSetName": "MyRuleSet"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates an empty receipt rule set:",
+ "id": "createreceiptruleset-1469058761646",
+ "title": "CreateReceiptRuleSet"
+ }
+ ],
+ "DeleteIdentity": [
+ {
+ "input": {
+ "Identity": "user@example.com"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes an identity from the list of identities that have been submitted for verification with Amazon SES:",
+ "id": "deleteidentity-1469047858906",
+ "title": "DeleteIdentity"
+ }
+ ],
+ "DeleteIdentityPolicy": [
+ {
+ "input": {
+ "Identity": "user@example.com",
+ "PolicyName": "MyPolicy"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a sending authorization policy for an identity:",
+ "id": "deleteidentitypolicy-1469055282499",
+ "title": "DeleteIdentityPolicy"
+ }
+ ],
+ "DeleteReceiptFilter": [
+ {
+ "input": {
+ "FilterName": "MyFilter"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes an IP address filter:",
+ "id": "deletereceiptfilter-1469055456835",
+ "title": "DeleteReceiptFilter"
+ }
+ ],
+ "DeleteReceiptRule": [
+ {
+ "input": {
+ "RuleName": "MyRule",
+ "RuleSetName": "MyRuleSet"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a receipt rule:",
+ "id": "deletereceiptrule-1469055563599",
+ "title": "DeleteReceiptRule"
+ }
+ ],
+ "DeleteReceiptRuleSet": [
+ {
+ "input": {
+ "RuleSetName": "MyRuleSet"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a receipt rule set:",
+ "id": "deletereceiptruleset-1469055713690",
+ "title": "DeleteReceiptRuleSet"
+ }
+ ],
+ "DeleteVerifiedEmailAddress": [
+ {
+ "input": {
+ "EmailAddress": "user@example.com"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes an email address from the list of identities that have been submitted for verification with Amazon SES:",
+ "id": "deleteverifiedemailaddress-1469051086444",
+ "title": "DeleteVerifiedEmailAddress"
+ }
+ ],
+ "DescribeActiveReceiptRuleSet": [
+ {
+ "input": {
+ },
+ "output": {
+ "Metadata": {
+ "CreatedTimestamp": "2016-07-15T16:25:59.607Z",
+ "Name": "default-rule-set"
+ },
+ "Rules": [
+ {
+ "Actions": [
+ {
+ "S3Action": {
+ "BucketName": "MyBucket",
+ "ObjectKeyPrefix": "email"
+ }
+ }
+ ],
+ "Enabled": true,
+ "Name": "MyRule",
+ "ScanEnabled": true,
+ "TlsPolicy": "Optional"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the metadata and receipt rules for the receipt rule set that is currently active:",
+ "id": "describeactivereceiptruleset-1469121611502",
+ "title": "DescribeActiveReceiptRuleSet"
+ }
+ ],
+ "DescribeReceiptRule": [
+ {
+ "input": {
+ "RuleName": "MyRule",
+ "RuleSetName": "MyRuleSet"
+ },
+ "output": {
+ "Rule": {
+ "Actions": [
+ {
+ "S3Action": {
+ "BucketName": "MyBucket",
+ "ObjectKeyPrefix": "email"
+ }
+ }
+ ],
+ "Enabled": true,
+ "Name": "MyRule",
+ "ScanEnabled": true,
+ "TlsPolicy": "Optional"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the details of a receipt rule:",
+ "id": "describereceiptrule-1469055813118",
+ "title": "DescribeReceiptRule"
+ }
+ ],
+ "DescribeReceiptRuleSet": [
+ {
+ "input": {
+ "RuleSetName": "MyRuleSet"
+ },
+ "output": {
+ "Metadata": {
+ "CreatedTimestamp": "2016-07-15T16:25:59.607Z",
+ "Name": "MyRuleSet"
+ },
+ "Rules": [
+ {
+ "Actions": [
+ {
+ "S3Action": {
+ "BucketName": "MyBucket",
+ "ObjectKeyPrefix": "email"
+ }
+ }
+ ],
+ "Enabled": true,
+ "Name": "MyRule",
+ "ScanEnabled": true,
+ "TlsPolicy": "Optional"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the metadata and receipt rules of a receipt rule set:",
+ "id": "describereceiptruleset-1469121240385",
+ "title": "DescribeReceiptRuleSet"
+ }
+ ],
+ "GetAccountSendingEnabled": [
+ {
+ "output": {
+ "Enabled": true
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns if sending status for an account is enabled. (true / false):",
+ "id": "getaccountsendingenabled-1469047741333",
+ "title": "GetAccountSendingEnabled"
+ }
+ ],
+ "GetIdentityDkimAttributes": [
+ {
+ "input": {
+ "Identities": [
+ "example.com",
+ "user@example.com"
+ ]
+ },
+ "output": {
+ "DkimAttributes": {
+ "example.com": {
+ "DkimEnabled": true,
+ "DkimTokens": [
+ "EXAMPLEjcs5xoyqytjsotsijas7236gr",
+ "EXAMPLEjr76cvoc6mysspnioorxsn6ep",
+ "EXAMPLEkbmkqkhlm2lyz77ppkulerm4k"
+ ],
+ "DkimVerificationStatus": "Success"
+ },
+ "user@example.com": {
+ "DkimEnabled": false,
+ "DkimVerificationStatus": "NotStarted"
+ }
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example retrieves the Amazon SES Easy DKIM attributes for a list of identities:",
+ "id": "getidentitydkimattributes-1469050695628",
+ "title": "GetIdentityDkimAttributes"
+ }
+ ],
+ "GetIdentityMailFromDomainAttributes": [
+ {
+ "input": {
+ "Identities": [
+ "example.com"
+ ]
+ },
+ "output": {
+ "MailFromDomainAttributes": {
+ "example.com": {
+ "BehaviorOnMXFailure": "UseDefaultValue",
+ "MailFromDomain": "bounces.example.com",
+ "MailFromDomainStatus": "Success"
+ }
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the custom MAIL FROM attributes for an identity:",
+ "id": "getidentitymailfromdomainattributes-1469123114860",
+ "title": "GetIdentityMailFromDomainAttributes"
+ }
+ ],
+ "GetIdentityNotificationAttributes": [
+ {
+ "input": {
+ "Identities": [
+ "example.com"
+ ]
+ },
+ "output": {
+ "NotificationAttributes": {
+ "example.com": {
+ "BounceTopic": "arn:aws:sns:us-east-1:EXAMPLE65304:ExampleTopic",
+ "ComplaintTopic": "arn:aws:sns:us-east-1:EXAMPLE65304:ExampleTopic",
+ "DeliveryTopic": "arn:aws:sns:us-east-1:EXAMPLE65304:ExampleTopic",
+ "ForwardingEnabled": true,
+ "HeadersInBounceNotificationsEnabled": false,
+ "HeadersInComplaintNotificationsEnabled": false,
+ "HeadersInDeliveryNotificationsEnabled": false
+ }
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the notification attributes for an identity:",
+ "id": "getidentitynotificationattributes-1469123466947",
+ "title": "GetIdentityNotificationAttributes"
+ }
+ ],
+ "GetIdentityPolicies": [
+ {
+ "input": {
+ "Identity": "example.com",
+ "PolicyNames": [
+ "MyPolicy"
+ ]
+ },
+ "output": {
+ "Policies": {
+ "MyPolicy": "{\"Version\":\"2008-10-17\",\"Statement\":[{\"Sid\":\"stmt1469123904194\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::123456789012:root\"},\"Action\":[\"ses:SendEmail\",\"ses:SendRawEmail\"],\"Resource\":\"arn:aws:ses:us-east-1:EXAMPLE65304:identity/example.com\"}]}"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns a sending authorization policy for an identity:",
+ "id": "getidentitypolicies-1469123949351",
+ "title": "GetIdentityPolicies"
+ }
+ ],
+ "GetIdentityVerificationAttributes": [
+ {
+ "input": {
+ "Identities": [
+ "example.com"
+ ]
+ },
+ "output": {
+ "VerificationAttributes": {
+ "example.com": {
+ "VerificationStatus": "Success",
+ "VerificationToken": "EXAMPLE3VYb9EDI2nTOQRi/Tf6MI/6bD6THIGiP1MVY="
+ }
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the verification status and the verification token for a domain identity:",
+ "id": "getidentityverificationattributes-1469124205897",
+ "title": "GetIdentityVerificationAttributes"
+ }
+ ],
+ "GetSendQuota": [
+ {
+ "output": {
+ "Max24HourSend": 200,
+ "MaxSendRate": 1,
+ "SentLast24Hours": 1
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the Amazon SES sending limits for an AWS account:",
+ "id": "getsendquota-1469047324508",
+ "title": "GetSendQuota"
+ }
+ ],
+ "GetSendStatistics": [
+ {
+ "output": {
+ "SendDataPoints": [
+ {
+ "Bounces": 0,
+ "Complaints": 0,
+ "DeliveryAttempts": 5,
+ "Rejects": 0,
+ "Timestamp": "2016-07-13T22:43:00Z"
+ },
+ {
+ "Bounces": 0,
+ "Complaints": 0,
+ "DeliveryAttempts": 3,
+ "Rejects": 0,
+ "Timestamp": "2016-07-13T23:13:00Z"
+ },
+ {
+ "Bounces": 0,
+ "Complaints": 0,
+ "DeliveryAttempts": 1,
+ "Rejects": 0,
+ "Timestamp": "2016-07-13T21:13:00Z"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns Amazon SES sending statistics:",
+ "id": "getsendstatistics-1469047741329",
+ "title": "GetSendStatistics"
+ }
+ ],
+ "ListIdentities": [
+ {
+ "input": {
+ "IdentityType": "EmailAddress",
+ "MaxItems": 123,
+ "NextToken": ""
+ },
+ "output": {
+ "Identities": [
+ "user@example.com"
+ ],
+ "NextToken": ""
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example lists the email address identities that have been submitted for verification with Amazon SES:",
+ "id": "listidentities-1469048638493",
+ "title": "ListIdentities"
+ }
+ ],
+ "ListIdentityPolicies": [
+ {
+ "input": {
+ "Identity": "example.com"
+ },
+ "output": {
+ "PolicyNames": [
+ "MyPolicy"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns a list of sending authorization policies that are attached to an identity:",
+ "id": "listidentitypolicies-1469124417674",
+ "title": "ListIdentityPolicies"
+ }
+ ],
+ "ListReceiptFilters": [
+ {
+ "output": {
+ "Filters": [
+ {
+ "IpFilter": {
+ "Cidr": "1.2.3.4/24",
+ "Policy": "Block"
+ },
+ "Name": "MyFilter"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example lists the IP address filters that are associated with an AWS account:",
+ "id": "listreceiptfilters-1469120786789",
+ "title": "ListReceiptFilters"
+ }
+ ],
+ "ListReceiptRuleSets": [
+ {
+ "input": {
+ "NextToken": ""
+ },
+ "output": {
+ "NextToken": "",
+ "RuleSets": [
+ {
+ "CreatedTimestamp": "2016-07-15T16:25:59.607Z",
+ "Name": "MyRuleSet"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example lists the receipt rule sets that exist under an AWS account:",
+ "id": "listreceiptrulesets-1469121037235",
+ "title": "ListReceiptRuleSets"
+ }
+ ],
+ "ListVerifiedEmailAddresses": [
+ {
+ "output": {
+ "VerifiedEmailAddresses": [
+ "user1@example.com",
+ "user2@example.com"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example lists all email addresses that have been submitted for verification with Amazon SES:",
+ "id": "listverifiedemailaddresses-1469051402570",
+ "title": "ListVerifiedEmailAddresses"
+ }
+ ],
+ "PutIdentityPolicy": [
+ {
+ "input": {
+ "Identity": "example.com",
+ "Policy": "{\"Version\":\"2008-10-17\",\"Statement\":[{\"Sid\":\"stmt1469123904194\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::123456789012:root\"},\"Action\":[\"ses:SendEmail\",\"ses:SendRawEmail\"],\"Resource\":\"arn:aws:ses:us-east-1:EXAMPLE65304:identity/example.com\"}]}",
+ "PolicyName": "MyPolicy"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example adds a sending authorization policy to an identity:",
+ "id": "putidentitypolicy-1469124560016",
+ "title": "PutIdentityPolicy"
+ }
+ ],
+ "ReorderReceiptRuleSet": [
+ {
+ "input": {
+ "RuleNames": [
+ "MyRule",
+ "MyOtherRule"
+ ],
+ "RuleSetName": "MyRuleSet"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example reorders the receipt rules within a receipt rule set:",
+ "id": "reorderreceiptruleset-1469058156806",
+ "title": "ReorderReceiptRuleSet"
+ }
+ ],
+ "SendEmail": [
+ {
+ "input": {
+ "Destination": {
+ "BccAddresses": [
+
+ ],
+ "CcAddresses": [
+ "recipient3@example.com"
+ ],
+ "ToAddresses": [
+ "recipient1@example.com",
+ "recipient2@example.com"
+ ]
+ },
+ "Message": {
+ "Body": {
+ "Html": {
+ "Charset": "UTF-8",
+ "Data": "This message body contains HTML formatting. It can, for example, contain links like this one: <a class=\"ulink\" href=\"http://docs.aws.amazon.com/ses/latest/DeveloperGuide\" target=\"_blank\">Amazon SES Developer Guide</a>."
+ },
+ "Text": {
+ "Charset": "UTF-8",
+ "Data": "This is the message body in text format."
+ }
+ },
+ "Subject": {
+ "Charset": "UTF-8",
+ "Data": "Test email"
+ }
+ },
+ "ReplyToAddresses": [
+
+ ],
+ "ReturnPath": "",
+ "ReturnPathArn": "",
+ "Source": "sender@example.com",
+ "SourceArn": ""
+ },
+ "output": {
+ "MessageId": "EXAMPLE78603177f-7a5433e7-8edb-42ae-af10-f0181f34d6ee-000000"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example sends a formatted email:",
+ "id": "sendemail-1469049656296",
+ "title": "SendEmail"
+ }
+ ],
+ "SendRawEmail": [
+ {
+ "input": {
+ "Destinations": [
+
+ ],
+ "FromArn": "",
+ "RawMessage": {
+ "Data": "From: sender@example.com\\nTo: recipient@example.com\\nSubject: Test email (contains an attachment)\\nMIME-Version: 1.0\\nContent-type: Multipart/Mixed; boundary=\"NextPart\"\\n\\n--NextPart\\nContent-Type: text/plain\\n\\nThis is the message body.\\n\\n--NextPart\\nContent-Type: text/plain;\\nContent-Disposition: attachment; filename=\"attachment.txt\"\\n\\nThis is the text in the attachment.\\n\\n--NextPart--"
+ },
+ "ReturnPathArn": "",
+ "Source": "",
+ "SourceArn": ""
+ },
+ "output": {
+ "MessageId": "EXAMPLEf3f73d99b-c63fb06f-d263-41f8-a0fb-d0dc67d56c07-000000"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example sends an email with an attachment:",
+ "id": "sendrawemail-1469118548649",
+ "title": "SendRawEmail"
+ }
+ ],
+ "SetActiveReceiptRuleSet": [
+ {
+ "input": {
+ "RuleSetName": "RuleSetToActivate"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example sets the active receipt rule set:",
+ "id": "setactivereceiptruleset-1469058391329",
+ "title": "SetActiveReceiptRuleSet"
+ }
+ ],
+ "SetIdentityDkimEnabled": [
+ {
+ "input": {
+ "DkimEnabled": true,
+ "Identity": "user@example.com"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example configures Amazon SES to Easy DKIM-sign the email sent from an identity:",
+ "id": "setidentitydkimenabled-1469057485202",
+ "title": "SetIdentityDkimEnabled"
+ }
+ ],
+ "SetIdentityFeedbackForwardingEnabled": [
+ {
+ "input": {
+ "ForwardingEnabled": true,
+ "Identity": "user@example.com"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example configures Amazon SES to forward an identity's bounces and complaints via email:",
+ "id": "setidentityfeedbackforwardingenabled-1469056811329",
+ "title": "SetIdentityFeedbackForwardingEnabled"
+ }
+ ],
+ "SetIdentityHeadersInNotificationsEnabled": [
+ {
+ "input": {
+ "Enabled": true,
+ "Identity": "user@example.com",
+ "NotificationType": "Bounce"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example configures Amazon SES to include the original email headers in the Amazon SNS bounce notifications for an identity:",
+ "id": "setidentityheadersinnotificationsenabled-1469057295001",
+ "title": "SetIdentityHeadersInNotificationsEnabled"
+ }
+ ],
+ "SetIdentityMailFromDomain": [
+ {
+ "input": {
+ "BehaviorOnMXFailure": "UseDefaultValue",
+ "Identity": "user@example.com",
+ "MailFromDomain": "bounces.example.com"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example configures Amazon SES to use a custom MAIL FROM domain for an identity:",
+ "id": "setidentitymailfromdomain-1469057693908",
+ "title": "SetIdentityMailFromDomain"
+ }
+ ],
+ "SetIdentityNotificationTopic": [
+ {
+ "input": {
+ "Identity": "user@example.com",
+ "NotificationType": "Bounce",
+ "SnsTopic": "arn:aws:sns:us-west-2:111122223333:MyTopic"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example sets the Amazon SNS topic to which Amazon SES will publish bounce, complaint, and/or delivery notifications for emails sent with the specified identity as the Source:",
+ "id": "setidentitynotificationtopic-1469057854966",
+ "title": "SetIdentityNotificationTopic"
+ }
+ ],
+ "SetReceiptRulePosition": [
+ {
+ "input": {
+ "After": "PutRuleAfterThisRule",
+ "RuleName": "RuleToReposition",
+ "RuleSetName": "MyRuleSet"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example sets the position of a receipt rule in a receipt rule set:",
+ "id": "setreceiptruleposition-1469058530550",
+ "title": "SetReceiptRulePosition"
+ }
+ ],
+ "UpdateAccountSendingEnabled": [
+ {
+ "input": {
+ "Enabled": true
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example updated the sending status for this account.",
+ "id": "updateaccountsendingenabled-1469047741333",
+ "title": "UpdateAccountSendingEnabled"
+ }
+ ],
+ "UpdateConfigurationSetReputationMetricsEnabled": [
+ {
+ "input": {
+ "ConfigurationSetName": "foo",
+ "Enabled": true
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Set the reputationMetricsEnabled flag for a specific configuration set.",
+ "id": "updateconfigurationsetreputationmetricsenabled-2362747741333",
+ "title": "UpdateConfigurationSetReputationMetricsEnabled"
+ }
+ ],
+ "UpdateConfigurationSetSendingEnabled": [
+ {
+ "input": {
+ "ConfigurationSetName": "foo",
+ "Enabled": true
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Set the sending enabled flag for a specific configuration set.",
+ "id": "updateconfigurationsetsendingenabled-2362747741333",
+ "title": "UpdateConfigurationSetReputationMetricsEnabled"
+ }
+ ],
+ "UpdateReceiptRule": [
+ {
+ "input": {
+ "Rule": {
+ "Actions": [
+ {
+ "S3Action": {
+ "BucketName": "MyBucket",
+ "ObjectKeyPrefix": "email"
+ }
+ }
+ ],
+ "Enabled": true,
+ "Name": "MyRule",
+ "ScanEnabled": true,
+ "TlsPolicy": "Optional"
+ },
+ "RuleSetName": "MyRuleSet"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example updates a receipt rule to use an Amazon S3 action:",
+ "id": "updatereceiptrule-1469051756940",
+ "title": "UpdateReceiptRule"
+ }
+ ],
+ "VerifyDomainDkim": [
+ {
+ "input": {
+ "Domain": "example.com"
+ },
+ "output": {
+ "DkimTokens": [
+ "EXAMPLEq76owjnks3lnluwg65scbemvw",
+ "EXAMPLEi3dnsj67hstzaj673klariwx2",
+ "EXAMPLEwfbtcukvimehexktmdtaz6naj"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example generates DKIM tokens for a domain that has been verified with Amazon SES:",
+ "id": "verifydomaindkim-1469049503083",
+ "title": "VerifyDomainDkim"
+ }
+ ],
+ "VerifyDomainIdentity": [
+ {
+ "input": {
+ "Domain": "example.com"
+ },
+ "output": {
+ "VerificationToken": "eoEmxw+YaYhb3h3iVJHuXMJXqeu1q1/wwmvjuEXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example starts the domain verification process with Amazon SES:",
+ "id": "verifydomainidentity-1469049165936",
+ "title": "VerifyDomainIdentity"
+ }
+ ],
+ "VerifyEmailAddress": [
+ {
+ "input": {
+ "EmailAddress": "user@example.com"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example starts the email address verification process with Amazon SES:",
+ "id": "verifyemailaddress-1469048849187",
+ "title": "VerifyEmailAddress"
+ }
+ ],
+ "VerifyEmailIdentity": [
+ {
+ "input": {
+ "EmailAddress": "user@example.com"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example starts the email address verification process with Amazon SES:",
+ "id": "verifyemailidentity-1469049068623",
+ "title": "VerifyEmailIdentity"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ses/2010-12-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ses/2010-12-01/paginators-1.json
new file mode 100644
index 00000000..1eb0054f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ses/2010-12-01/paginators-1.json
@@ -0,0 +1,33 @@
+{
+ "pagination": {
+ "ListIdentities": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxItems",
+ "result_key": "Identities"
+ },
+ "ListCustomVerificationEmailTemplates": {
+ "result_key": "CustomVerificationEmailTemplates",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListConfigurationSets": {
+ "input_token": "NextToken",
+ "limit_key": "MaxItems",
+ "output_token": "NextToken",
+ "result_key": "ConfigurationSets"
+ },
+ "ListReceiptRuleSets": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "RuleSets"
+ },
+ "ListTemplates": {
+ "input_token": "NextToken",
+ "limit_key": "MaxItems",
+ "output_token": "NextToken",
+ "result_key": "TemplatesMetadata"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ses/2010-12-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ses/2010-12-01/service-2.json.gz
new file mode 100644
index 00000000..de0d8d4e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ses/2010-12-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ses/2010-12-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/ses/2010-12-01/waiters-2.json
new file mode 100644
index 00000000..b585d309
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ses/2010-12-01/waiters-2.json
@@ -0,0 +1,18 @@
+{
+ "version": 2,
+ "waiters": {
+ "IdentityExists": {
+ "delay": 3,
+ "operation": "GetIdentityVerificationAttributes",
+ "maxAttempts": 20,
+ "acceptors": [
+ {
+ "expected": "Success",
+ "matcher": "pathAll",
+ "state": "success",
+ "argument": "VerificationAttributes.*.VerificationStatus"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sesv2/2019-09-27/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sesv2/2019-09-27/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..e78cfc4c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sesv2/2019-09-27/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sesv2/2019-09-27/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sesv2/2019-09-27/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sesv2/2019-09-27/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sesv2/2019-09-27/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sesv2/2019-09-27/paginators-1.json
new file mode 100644
index 00000000..66721166
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sesv2/2019-09-27/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListMultiRegionEndpoints": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "PageSize",
+ "result_key": "MultiRegionEndpoints"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sesv2/2019-09-27/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sesv2/2019-09-27/service-2.json.gz
new file mode 100644
index 00000000..74d5401e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sesv2/2019-09-27/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/shield/2016-06-02/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/shield/2016-06-02/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..90eb2f18
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/shield/2016-06-02/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/shield/2016-06-02/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/shield/2016-06-02/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/shield/2016-06-02/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/shield/2016-06-02/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/shield/2016-06-02/paginators-1.json
new file mode 100644
index 00000000..c5ded642
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/shield/2016-06-02/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "ListProtections": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Protections"
+ },
+ "ListAttacks": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AttackSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/shield/2016-06-02/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/shield/2016-06-02/service-2.json.gz
new file mode 100644
index 00000000..3032b529
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/shield/2016-06-02/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/signer/2017-08-25/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/signer/2017-08-25/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..c98c5d46
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/signer/2017-08-25/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/signer/2017-08-25/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/signer/2017-08-25/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/signer/2017-08-25/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/signer/2017-08-25/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/signer/2017-08-25/paginators-1.json
new file mode 100644
index 00000000..1e049e7d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/signer/2017-08-25/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListSigningJobs": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "jobs"
+ },
+ "ListSigningPlatforms": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "platforms"
+ },
+ "ListSigningProfiles": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "profiles"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/signer/2017-08-25/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/signer/2017-08-25/service-2.json.gz
new file mode 100644
index 00000000..a23af544
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/signer/2017-08-25/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/signer/2017-08-25/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/signer/2017-08-25/waiters-2.json
new file mode 100644
index 00000000..a0890ade
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/signer/2017-08-25/waiters-2.json
@@ -0,0 +1,29 @@
+{
+ "version": 2,
+ "waiters": {
+ "SuccessfulSigningJob": {
+ "delay": 20,
+ "operation": "DescribeSigningJob",
+ "maxAttempts": 25,
+ "acceptors": [
+ {
+ "expected": "Succeeded",
+ "matcher": "path",
+ "state": "success",
+ "argument": "status"
+ },
+ {
+ "expected": "Failed",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "status"
+ },
+ {
+ "expected": "ResourceNotFoundException",
+ "matcher": "error",
+ "state": "failure"
+ }
+ ]
+ }
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/simspaceweaver/2022-10-28/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/simspaceweaver/2022-10-28/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..16a7b2b2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/simspaceweaver/2022-10-28/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/simspaceweaver/2022-10-28/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/simspaceweaver/2022-10-28/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/simspaceweaver/2022-10-28/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/simspaceweaver/2022-10-28/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/simspaceweaver/2022-10-28/service-2.json.gz
new file mode 100644
index 00000000..cb429206
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/simspaceweaver/2022-10-28/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sms-voice/2018-09-05/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sms-voice/2018-09-05/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..27c14291
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sms-voice/2018-09-05/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sms-voice/2018-09-05/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sms-voice/2018-09-05/service-2.json.gz
new file mode 100644
index 00000000..b686ea3b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sms-voice/2018-09-05/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sms/2016-10-24/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sms/2016-10-24/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b830868c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sms/2016-10-24/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sms/2016-10-24/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sms/2016-10-24/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sms/2016-10-24/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sms/2016-10-24/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sms/2016-10-24/paginators-1.json
new file mode 100644
index 00000000..52a8d570
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sms/2016-10-24/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "GetReplicationJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "replicationJobList"
+ },
+ "GetReplicationRuns": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "replicationRunList"
+ },
+ "GetConnectors": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "connectorList"
+ },
+ "GetServers": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "serverList"
+ },
+ "ListApps": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "apps"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sms/2016-10-24/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sms/2016-10-24/service-2.json.gz
new file mode 100644
index 00000000..ee4f525d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sms/2016-10-24/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/snow-device-management/2021-08-04/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/snow-device-management/2021-08-04/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..cd024872
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/snow-device-management/2021-08-04/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/snow-device-management/2021-08-04/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/snow-device-management/2021-08-04/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/snow-device-management/2021-08-04/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/snow-device-management/2021-08-04/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/snow-device-management/2021-08-04/paginators-1.json
new file mode 100644
index 00000000..8b112099
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/snow-device-management/2021-08-04/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListDeviceResources": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "resources"
+ },
+ "ListDevices": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "devices"
+ },
+ "ListExecutions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "executions"
+ },
+ "ListTasks": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "tasks"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/snow-device-management/2021-08-04/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/snow-device-management/2021-08-04/service-2.json.gz
new file mode 100644
index 00000000..88eb216b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/snow-device-management/2021-08-04/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/snowball/2016-06-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/snowball/2016-06-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..e8149b1a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/snowball/2016-06-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/snowball/2016-06-30/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/snowball/2016-06-30/examples-1.json
new file mode 100644
index 00000000..2b13f7b4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/snowball/2016-06-30/examples-1.json
@@ -0,0 +1,442 @@
+{
+ "version": "1.0",
+ "examples": {
+ "CancelCluster": [
+ {
+ "input": {
+ "ClusterId": "CID123e4567-e89b-12d3-a456-426655440000"
+ },
+ "comments": {
+ },
+ "description": "This operation cancels a cluster job. You can only cancel a cluster job while it's in the AwaitingQuorum status.",
+ "id": "to-cancel-a-cluster-job-1482533760554",
+ "title": "To cancel a cluster job"
+ }
+ ],
+ "CancelJob": [
+ {
+ "input": {
+ "JobId": "JID123e4567-e89b-12d3-a456-426655440000"
+ },
+ "comments": {
+ },
+ "description": "This operation cancels a job. You can only cancel a job before its JobState value changes to PreparingAppliance.",
+ "id": "to-cancel-a-job-for-a-snowball-device-1482534699477",
+ "title": "To cancel a job for a Snowball device"
+ }
+ ],
+ "CreateAddress": [
+ {
+ "input": {
+ "Address": {
+ "City": "Seattle",
+ "Company": "My Company's Name",
+ "Country": "USA",
+ "Name": "My Name",
+ "PhoneNumber": "425-555-5555",
+ "PostalCode": "98101",
+ "StateOrProvince": "WA",
+ "Street1": "123 Main Street"
+ }
+ },
+ "output": {
+ "AddressId": "ADID1234ab12-3eec-4eb3-9be6-9374c10eb51b"
+ },
+ "comments": {
+ },
+ "description": "This operation creates an address for a job. Addresses are validated at the time of creation. The address you provide must be located within the serviceable area of your region. If the address is invalid or unsupported, then an exception is thrown.",
+ "id": "to-create-an-address-for-a-job-1482535416294",
+ "title": "To create an address for a job"
+ }
+ ],
+ "CreateCluster": [
+ {
+ "input": {
+ "AddressId": "ADID1234ab12-3eec-4eb3-9be6-9374c10eb51b",
+ "Description": "MyCluster",
+ "JobType": "LOCAL_USE",
+ "KmsKeyARN": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-12ab-34cd-56ef-123456123456",
+ "Notification": {
+ "JobStatesToNotify": [
+
+ ],
+ "NotifyAll": false
+ },
+ "Resources": {
+ "S3Resources": [
+ {
+ "BucketArn": "arn:aws:s3:::MyBucket",
+ "KeyRange": {
+ }
+ }
+ ]
+ },
+ "RoleARN": "arn:aws:iam::123456789012:role/snowball-import-S3-role",
+ "ShippingOption": "SECOND_DAY",
+ "SnowballType": "EDGE"
+ },
+ "output": {
+ "ClusterId": "CID123e4567-e89b-12d3-a456-426655440000"
+ },
+ "comments": {
+ },
+ "description": "Creates an empty cluster. Each cluster supports five nodes. You use the CreateJob action separately to create the jobs for each of these nodes. The cluster does not ship until these five node jobs have been created.",
+ "id": "to-create-a-cluster-1482864724077",
+ "title": "To create a cluster"
+ }
+ ],
+ "CreateJob": [
+ {
+ "input": {
+ "AddressId": "ADID1234ab12-3eec-4eb3-9be6-9374c10eb51b",
+ "Description": "My Job",
+ "JobType": "IMPORT",
+ "KmsKeyARN": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-12ab-34cd-56ef-123456123456",
+ "Notification": {
+ "JobStatesToNotify": [
+
+ ],
+ "NotifyAll": false
+ },
+ "Resources": {
+ "S3Resources": [
+ {
+ "BucketArn": "arn:aws:s3:::MyBucket",
+ "KeyRange": {
+ }
+ }
+ ]
+ },
+ "RoleARN": "arn:aws:iam::123456789012:role/snowball-import-S3-role",
+ "ShippingOption": "SECOND_DAY",
+ "SnowballCapacityPreference": "T80",
+ "SnowballType": "STANDARD"
+ },
+ "output": {
+ "JobId": "JID123e4567-e89b-12d3-a456-426655440000"
+ },
+ "comments": {
+ },
+ "description": "Creates a job to import or export data between Amazon S3 and your on-premises data center. Your AWS account must have the right trust policies and permissions in place to create a job for Snowball. If you're creating a job for a node in a cluster, you only need to provide the clusterId value; the other job attributes are inherited from the cluster.",
+ "id": "to-create-a-job-1482864834886",
+ "title": "To create a job"
+ }
+ ],
+ "DescribeAddress": [
+ {
+ "input": {
+ "AddressId": "ADID1234ab12-3eec-4eb3-9be6-9374c10eb51b"
+ },
+ "output": {
+ "Address": {
+ "AddressId": "ADID5643ec50-3eec-4eb3-9be6-9374c10eb51b",
+ "City": "Seattle",
+ "Company": "My Company",
+ "Country": "US",
+ "Name": "My Name",
+ "PhoneNumber": "425-555-5555",
+ "PostalCode": "98101",
+ "StateOrProvince": "WA",
+ "Street1": "123 Main Street"
+ }
+ },
+ "comments": {
+ },
+ "description": "This operation describes an address for a job.",
+ "id": "to-describe-an-address-for-a-job-1482538608745",
+ "title": "To describe an address for a job"
+ }
+ ],
+ "DescribeAddresses": [
+ {
+ "input": {
+ },
+ "output": {
+ "Addresses": [
+ {
+ "AddressId": "ADID1234ab12-3eec-4eb3-9be6-9374c10eb51b",
+ "City": "Seattle",
+ "Company": "My Company",
+ "Country": "US",
+ "Name": "My Name",
+ "PhoneNumber": "425-555-5555",
+ "PostalCode": "98101",
+ "StateOrProvince": "WA",
+ "Street1": "123 Main Street"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "This operation describes all the addresses that you've created for AWS Snowball. Calling this API in one of the US regions will return addresses from the list of all addresses associated with this account in all US regions.",
+ "id": "to-describe-all-the-addresses-youve-created-for-aws-snowball-1482538936603",
+ "title": "To describe all the addresses you've created for AWS Snowball"
+ }
+ ],
+ "DescribeCluster": [
+ {
+ "input": {
+ "ClusterId": "CID123e4567-e89b-12d3-a456-426655440000"
+ },
+ "output": {
+ "ClusterMetadata": {
+ "AddressId": "ADID1234ab12-3eec-4eb3-9be6-9374c10eb51b",
+ "ClusterId": "CID123e4567-e89b-12d3-a456-426655440000",
+ "ClusterState": "Pending",
+ "CreationDate": "1480475517.0",
+ "Description": "MyCluster",
+ "JobType": "LOCAL_USE",
+ "KmsKeyARN": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-12ab-34cd-56ef-123456123456",
+ "Notification": {
+ "JobStatesToNotify": [
+
+ ],
+ "NotifyAll": false
+ },
+ "Resources": {
+ "S3Resources": [
+ {
+ "BucketArn": "arn:aws:s3:::MyBucket",
+ "KeyRange": {
+ }
+ }
+ ]
+ },
+ "RoleARN": "arn:aws:iam::123456789012:role/snowball-import-S3-role",
+ "ShippingOption": "SECOND_DAY"
+ }
+ },
+ "comments": {
+ },
+ "description": "Returns information about a specific cluster including shipping information, cluster status, and other important metadata.",
+ "id": "to-describe-a-cluster-1482864218396",
+ "title": "To describe a cluster"
+ }
+ ],
+ "DescribeJob": [
+ {
+ "input": {
+ "JobId": "JID123e4567-e89b-12d3-a456-426655440000"
+ },
+ "output": {
+ "JobMetadata": {
+ "AddressId": "ADID1234ab12-3eec-4eb3-9be6-9374c10eb51b",
+ "CreationDate": "1475626164",
+ "Description": "My Job",
+ "JobId": "JID123e4567-e89b-12d3-a456-426655440000",
+ "JobState": "New",
+ "JobType": "IMPORT",
+ "KmsKeyARN": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-12ab-34cd-56ef-123456123456",
+ "Notification": {
+ "JobStatesToNotify": [
+
+ ],
+ "NotifyAll": false
+ },
+ "Resources": {
+ "S3Resources": [
+ {
+ "BucketArn": "arn:aws:s3:::MyBucket",
+ "KeyRange": {
+ }
+ }
+ ]
+ },
+ "RoleARN": "arn:aws:iam::123456789012:role/snowball-import-S3-role",
+ "ShippingDetails": {
+ "ShippingOption": "SECOND_DAY"
+ },
+ "SnowballCapacityPreference": "T80",
+ "SnowballType": "STANDARD"
+ }
+ },
+ "comments": {
+ },
+ "description": "This operation describes a job you've created for AWS Snowball.",
+ "id": "to-describe-a-job-youve-created-for-aws-snowball-1482539500180",
+ "title": "To describe a job you've created for AWS Snowball"
+ }
+ ],
+ "GetJobManifest": [
+ {
+ "input": {
+ "JobId": "JID123e4567-e89b-12d3-a456-426655440000"
+ },
+ "output": {
+ "ManifestURI": "https://awsie-frosty-manifests-prod.s3.amazonaws.com/JID123e4567-e89b-12d3-a456-426655440000_manifest.bin?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20161224T005115Z&X-Amz-SignedHeaders=..."
+ },
+ "comments": {
+ },
+ "description": "Returns a link to an Amazon S3 presigned URL for the manifest file associated with the specified JobId value. You can access the manifest file for up to 60 minutes after this request has been made. To access the manifest file after 60 minutes have passed, you'll have to make another call to the GetJobManifest action.\n\nThe manifest is an encrypted file that you can download after your job enters the WithCustomer status. The manifest is decrypted by using the UnlockCode code value, when you pass both values to the Snowball through the Snowball client when the client is started for the first time.\n\nAs a best practice, we recommend that you don't save a copy of an UnlockCode value in the same location as the manifest file for that job. Saving these separately helps prevent unauthorized parties from gaining access to the Snowball associated with that job.\n\nThe credentials of a given job, including its manifest file and unlock code, expire 90 days after the job is created.",
+ "id": "to-get-the-manifest-for-a-job-youve-created-for-aws-snowball-1482540389246",
+ "title": "To get the manifest for a job you've created for AWS Snowball"
+ }
+ ],
+ "GetJobUnlockCode": [
+ {
+ "input": {
+ "JobId": "JID123e4567-e89b-12d3-a456-426655440000"
+ },
+ "output": {
+ "UnlockCode": "12345-abcde-56789-fghij-01234"
+ },
+ "comments": {
+ },
+ "description": "Returns the UnlockCode code value for the specified job. A particular UnlockCode value can be accessed for up to 90 days after the associated job has been created.\n\nThe UnlockCode value is a 29-character code with 25 alphanumeric characters and 4 hyphens. This code is used to decrypt the manifest file when it is passed along with the manifest to the Snowball through the Snowball client when the client is started for the first time.\n\nAs a best practice, we recommend that you don't save a copy of the UnlockCode in the same location as the manifest file for that job. Saving these separately helps prevent unauthorized parties from gaining access to the Snowball associated with that job.",
+ "id": "to-get-the-unlock-code-for-a-job-youve-created-for-aws-snowball-1482541987286",
+ "title": "To get the unlock code for a job you've created for AWS Snowball"
+ }
+ ],
+ "GetSnowballUsage": [
+ {
+ "input": {
+ },
+ "output": {
+ "SnowballLimit": 1,
+ "SnowballsInUse": 0
+ },
+ "comments": {
+ },
+ "description": "Returns information about the Snowball service limit for your account, and also the number of Snowballs your account has in use.\n\nThe default service limit for the number of Snowballs that you can have at one time is 1. If you want to increase your service limit, contact AWS Support.",
+ "id": "to-see-your-snowball-service-limit-and-the-number-of-snowballs-you-have-in-use-1482863394588",
+ "title": "To see your Snowball service limit and the number of Snowballs you have in use"
+ }
+ ],
+ "ListClusterJobs": [
+ {
+ "input": {
+ "ClusterId": "CID123e4567-e89b-12d3-a456-426655440000"
+ },
+ "output": {
+ "JobListEntries": [
+ {
+ "CreationDate": "1480475524.0",
+ "Description": "MyClustrer-node-001",
+ "IsMaster": false,
+ "JobId": "JID123e4567-e89b-12d3-a456-426655440000",
+ "JobState": "New",
+ "JobType": "LOCAL_USE",
+ "SnowballType": "EDGE"
+ },
+ {
+ "CreationDate": "1480475525.0",
+ "Description": "MyClustrer-node-002",
+ "IsMaster": false,
+ "JobId": "JID123e4567-e89b-12d3-a456-426655440001",
+ "JobState": "New",
+ "JobType": "LOCAL_USE",
+ "SnowballType": "EDGE"
+ },
+ {
+ "CreationDate": "1480475525.0",
+ "Description": "MyClustrer-node-003",
+ "IsMaster": false,
+ "JobId": "JID123e4567-e89b-12d3-a456-426655440002",
+ "JobState": "New",
+ "JobType": "LOCAL_USE",
+ "SnowballType": "EDGE"
+ },
+ {
+ "CreationDate": "1480475525.0",
+ "Description": "MyClustrer-node-004",
+ "IsMaster": false,
+ "JobId": "JID123e4567-e89b-12d3-a456-426655440003",
+ "JobState": "New",
+ "JobType": "LOCAL_USE",
+ "SnowballType": "EDGE"
+ },
+ {
+ "CreationDate": "1480475525.0",
+ "Description": "MyClustrer-node-005",
+ "IsMaster": false,
+ "JobId": "JID123e4567-e89b-12d3-a456-426655440004",
+ "JobState": "New",
+ "JobType": "LOCAL_USE",
+ "SnowballType": "EDGE"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "Returns an array of JobListEntry objects of the specified length. Each JobListEntry object is for a job in the specified cluster and contains a job's state, a job's ID, and other information.",
+ "id": "to-get-a-list-of-jobs-in-a-cluster-that-youve-created-for-aws-snowball-1482863105773",
+ "title": "To get a list of jobs in a cluster that you've created for AWS Snowball"
+ }
+ ],
+ "ListClusters": [
+ {
+ "input": {
+ },
+ "output": {
+ "ClusterListEntries": [
+ {
+ "ClusterId": "CID123e4567-e89b-12d3-a456-426655440000",
+ "ClusterState": "Pending",
+ "CreationDate": "1480475517.0",
+ "Description": "MyCluster"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "Returns an array of ClusterListEntry objects of the specified length. Each ClusterListEntry object contains a cluster's state, a cluster's ID, and other important status information.",
+ "id": "to-get-a-list-of-clusters-that-youve-created-for-aws-snowball-1482862223003",
+ "title": "To get a list of clusters that you've created for AWS Snowball"
+ }
+ ],
+ "ListJobs": [
+ {
+ "input": {
+ },
+ "output": {
+ "JobListEntries": [
+ {
+ "CreationDate": "1460678186.0",
+ "Description": "MyJob",
+ "IsMaster": false,
+ "JobId": "JID123e4567-e89b-12d3-a456-426655440000",
+ "JobState": "New",
+ "JobType": "IMPORT",
+ "SnowballType": "STANDARD"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "Returns an array of JobListEntry objects of the specified length. Each JobListEntry object contains a job's state, a job's ID, and a value that indicates whether the job is a job part, in the case of export jobs. Calling this API action in one of the US regions will return jobs from the list of all jobs associated with this account in all US regions.",
+ "id": "to-get-a-list-of-jobs-that-youve-created-for-aws-snowball-1482542167627",
+ "title": "To get a list of jobs that you've created for AWS Snowball"
+ }
+ ],
+ "UpdateCluster": [
+ {
+ "input": {
+ "AddressId": "ADID1234ab12-3eec-4eb3-9be6-9374c10eb51b",
+ "ClusterId": "CID123e4567-e89b-12d3-a456-426655440000",
+ "Description": "updated-cluster-name"
+ },
+ "comments": {
+ },
+ "description": "This action allows you to update certain parameters for a cluster. Once the cluster changes to a different state, usually within 60 minutes of it being created, this action is no longer available.",
+ "id": "to-update-a-cluster-1482863900595",
+ "title": "To update a cluster"
+ }
+ ],
+ "UpdateJob": [
+ {
+ "input": {
+ "AddressId": "ADID1234ab12-3eec-4eb3-9be6-9374c10eb51b",
+ "Description": "updated-job-name",
+ "JobId": "JID123e4567-e89b-12d3-a456-426655440000",
+ "ShippingOption": "NEXT_DAY",
+ "SnowballCapacityPreference": "T100"
+ },
+ "comments": {
+ },
+ "description": "This action allows you to update certain parameters for a job. Once the job changes to a different job state, usually within 60 minutes of the job being created, this action is no longer available.",
+ "id": "to-update-a-job-1482863556886",
+ "title": "To update a job"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/snowball/2016-06-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/snowball/2016-06-30/paginators-1.json
new file mode 100644
index 00000000..05a7ea84
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/snowball/2016-06-30/paginators-1.json
@@ -0,0 +1,40 @@
+{
+ "pagination": {
+ "ListJobs": {
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "result_key": "JobListEntries"
+ },
+ "DescribeAddresses": {
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "result_key": "Addresses"
+ },
+ "ListClusterJobs": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "JobListEntries"
+ },
+ "ListClusters": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ClusterListEntries"
+ },
+ "ListCompatibleImages": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "CompatibleImages"
+ },
+ "ListLongTermPricing": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "LongTermPricingEntries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/snowball/2016-06-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/snowball/2016-06-30/service-2.json.gz
new file mode 100644
index 00000000..74f2e4c9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/snowball/2016-06-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sns/2010-03-31/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sns/2010-03-31/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..02d0c18b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sns/2010-03-31/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sns/2010-03-31/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sns/2010-03-31/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sns/2010-03-31/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sns/2010-03-31/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sns/2010-03-31/paginators-1.json
new file mode 100644
index 00000000..5be5250d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sns/2010-03-31/paginators-1.json
@@ -0,0 +1,46 @@
+{
+ "pagination": {
+ "ListEndpointsByPlatformApplication": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Endpoints"
+ },
+ "ListPlatformApplications": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "PlatformApplications"
+ },
+ "ListSubscriptions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Subscriptions"
+ },
+ "ListSubscriptionsByTopic": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Subscriptions"
+ },
+ "ListTopics": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Topics"
+ },
+ "ListPhoneNumbersOptedOut": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "result_key": "phoneNumbers"
+ },
+ "ListOriginationNumbers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "PhoneNumbers"
+ },
+ "ListSMSSandboxPhoneNumbers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "PhoneNumbers"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sns/2010-03-31/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sns/2010-03-31/service-2.json.gz
new file mode 100644
index 00000000..37a53a55
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sns/2010-03-31/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/socialmessaging/2024-01-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/socialmessaging/2024-01-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..d356b2d6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/socialmessaging/2024-01-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/socialmessaging/2024-01-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/socialmessaging/2024-01-01/paginators-1.json
new file mode 100644
index 00000000..4031a2aa
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/socialmessaging/2024-01-01/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListLinkedWhatsAppBusinessAccounts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "linkedAccounts"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/socialmessaging/2024-01-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/socialmessaging/2024-01-01/service-2.json.gz
new file mode 100644
index 00000000..f0c71e9e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/socialmessaging/2024-01-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sqs/2012-11-05/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sqs/2012-11-05/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..636fc9da
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sqs/2012-11-05/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sqs/2012-11-05/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sqs/2012-11-05/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sqs/2012-11-05/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sqs/2012-11-05/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sqs/2012-11-05/paginators-1.json
new file mode 100644
index 00000000..7c22d43a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sqs/2012-11-05/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "ListDeadLetterSourceQueues": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "queueUrls"
+ },
+ "ListQueues": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "QueueUrls"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sqs/2012-11-05/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sqs/2012-11-05/service-2.json.gz
new file mode 100644
index 00000000..03011901
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sqs/2012-11-05/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ssm-contacts/2021-05-03/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ssm-contacts/2021-05-03/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b3455222
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ssm-contacts/2021-05-03/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ssm-contacts/2021-05-03/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ssm-contacts/2021-05-03/examples-1.json
new file mode 100644
index 00000000..d7c714d8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ssm-contacts/2021-05-03/examples-1.json
@@ -0,0 +1,714 @@
+{
+ "version": "1.0",
+ "examples": {
+ "AcceptPage": [
+ {
+ "input": {
+ "AcceptCode": "425440",
+ "AcceptType": "READ",
+ "PageId": "arn:aws:ssm-contacts:us-east-2:682428703967:page/akuam/94ea0c7b-56d9-46c3-b84a-a37c8b067ad3"
+ },
+ "output": {
+ },
+ "comments": {
+ },
+ "description": "The following accept-page operation uses an accept code sent to the contact channel to accept a page.",
+ "id": "to-accept-a-page-during-and-engagement-1630357840187",
+ "title": "To accept a page during and engagement"
+ }
+ ],
+ "ActivateContactChannel": [
+ {
+ "input": {
+ "ActivationCode": "466136",
+ "ContactChannelId": "arn:aws:ssm-contacts:us-east-2:111122223333:contact-channel/akuam/fc7405c4-46b2-48b7-87b2-93e2f225b90d"
+ },
+ "output": {
+ },
+ "comments": {
+ },
+ "description": "The following activate-contact-channel example activates a contact channel and makes it usable as part of an incident.",
+ "id": "activate-a-contacts-contact-channel-1630359780075",
+ "title": "Activate a contact's contact channel"
+ }
+ ],
+ "CreateContact": [
+ {
+ "input": {
+ "Alias": "akuam",
+ "DisplayName": "Akua Mansa",
+ "Plan": {
+ "Stages": [
+
+ ]
+ },
+ "Type": "PERSONAL"
+ },
+ "output": {
+ "ContactArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/akuam"
+ },
+ "comments": {
+ },
+ "description": "The following create-contact example creates a contact in your environment with a blank plan. The plan can be updated after creating contact channels. Use the create-contact-channel operation with the output ARN of this command. After you have created contact channels for this contact use update-contact to update the plan.",
+ "id": "to-create-a-contact-1630360152750",
+ "title": "To create a contact"
+ }
+ ],
+ "CreateContactChannel": [
+ {
+ "input": {
+ "ContactId": "arn:aws:ssm-contacts:us-east-1:111122223333:contact/akuam",
+ "DeliveryAddress": {
+ "SimpleAddress": "+15005550199"
+ },
+ "Name": "akuas sms-test",
+ "Type": "SMS"
+ },
+ "output": {
+ "ContactChannelArn": "arn:aws:ssm-contacts:us-east-1:111122223333:contact-channel/akuam/02f506b9-ea5d-4764-af89-2daa793ff024"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Creates a contact channel of type SMS for the contact Akua Mansa. Contact channels can be created of type SMS, EMAIL, or VOICE.",
+ "id": "to-create-a-contact-channel-1630360447010",
+ "title": "To create a contact channel"
+ }
+ ],
+ "DeactivateContactChannel": [
+ {
+ "input": {
+ "ContactChannelId": "arn:aws:ssm-contacts:us-east-2:111122223333:contact-channel/akuam/fc7405c4-46b2-48b7-87b2-93e2f225b90d"
+ },
+ "output": {
+ },
+ "comments": {
+ },
+ "description": "The following ``deactivate-contact-channel`` example deactivates a contact channel. Deactivating a contact channel means the contact channel will no longer be paged during an incident. You can also reactivate a contact channel at any time using the activate-contact-channel operation.",
+ "id": "to-deactivate-a-contact-channel-1630360853894",
+ "title": "To deactivate a contact channel"
+ }
+ ],
+ "DeleteContact": [
+ {
+ "input": {
+ "ContactId": "arn:aws:ssm-contacts:us-east-1:111122223333:contact/alejr"
+ },
+ "output": {
+ },
+ "comments": {
+ },
+ "description": "The following delete-contact example deletes a contact. The contact will no longer be reachable from any escalation plan that refers to them.",
+ "id": "to-delete-a-contact-1630361093863",
+ "title": "To delete a contact"
+ }
+ ],
+ "DeleteContactChannel": [
+ {
+ "input": {
+ "ContactChannelId": "arn:aws:ssm-contacts:us-east-1:111122223333:contact-channel/akuam/13149bad-52ee-45ea-ae1e-45857f78f9b2"
+ },
+ "output": {
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following delete-contact-channel example deletes a contact channel. Deleting a contact channel ensures the contact channel will not be paged during an incident.",
+ "id": "to-delete-a-contact-channel-1630364616682",
+ "title": "To delete a contact channel"
+ }
+ ],
+ "DescribeEngagement": [
+ {
+ "input": {
+ "EngagementId": "arn:aws:ssm-contacts:us-east-2:111122223333:engagement/example_escalation/69e40ce1-8dbb-4d57-8962-5fbe7fc53356"
+ },
+ "output": {
+ "ContactArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/example_escalation",
+ "Content": "Testing engagements",
+ "EngagementArn": "arn:aws:ssm-contacts:us-east-2:111122223333:engagement/example_escalation/69e40ce1-8dbb-4d57-8962-5fbe7fc53356",
+ "PublicContent": "Testing engagements",
+ "PublicSubject": "test",
+ "Sender": "tester",
+ "StartTime": "2021-05-18T18:25:41.151000+00:00",
+ "Subject": "test"
+ },
+ "comments": {
+ },
+ "description": "The following describe-engagement example lists the details of an engagement to a contact or escalation plan. The subject and content are sent to the contact channels.",
+ "id": "to-describe-the-details-of-an-engagement-1630364719475",
+ "title": "To describe the details of an engagement"
+ }
+ ],
+ "DescribePage": [
+ {
+ "input": {
+ "PageId": "arn:aws:ssm-contacts:us-east-2:111122223333:page/akuam/ad0052bd-e606-498a-861b-25726292eb93"
+ },
+ "output": {
+ "ContactArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/akuam",
+ "Content": "Testing engagements",
+ "DeliveryTime": "2021-05-18T18:43:55.265000+00:00",
+ "EngagementArn": "arn:aws:ssm-contacts:us-east-2:111122223333:engagement/akuam/78a29753-3674-4ac5-9f83-0468563567f0",
+ "PageArn": "arn:aws:ssm-contacts:us-east-2:111122223333:page/akuam/ad0052bd-e606-498a-861b-25726292eb93",
+ "PublicContent": "Testing engagements",
+ "PublicSubject": "test",
+ "ReadTime": "2021-05-18T18:43:55.708000+00:00",
+ "Sender": "tester",
+ "SentTime": "2021-05-18T18:43:29.301000+00:00",
+ "Subject": "test"
+ },
+ "comments": {
+ },
+ "description": "The following describe-page example lists details of a page to a contact channel. The page will include the subject and content provided.",
+ "id": "to-list-the-details-of-a-page-to-a-contact-channel-1630364907282",
+ "title": "To list the details of a page to a contact channel"
+ }
+ ],
+ "GetContact": [
+ {
+ "input": {
+ "ContactId": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/akuam"
+ },
+ "output": {
+ "Alias": "akuam",
+ "ContactArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/akuam",
+ "DisplayName": "Akua Mansa",
+ "Plan": {
+ "Stages": [
+ {
+ "DurationInMinutes": 5,
+ "Targets": [
+ {
+ "ChannelTargetInfo": {
+ "ContactChannelId": "arn:aws:ssm-contacts:us-east-2:111122223333:contact-channel/akuam/beb25840-5ac8-4644-95cc-7a8de390fa65",
+ "RetryIntervalInMinutes": 1
+ }
+ }
+ ]
+ },
+ {
+ "DurationInMinutes": 5,
+ "Targets": [
+ {
+ "ChannelTargetInfo": {
+ "ContactChannelId": "arn:aws:ssm-contacts:us-east-2:111122223333:contact-channel/akuam/49f3c24d-5f9f-4638-ae25-3f49e04229ad",
+ "RetryIntervalInMinutes": 1
+ }
+ }
+ ]
+ },
+ {
+ "DurationInMinutes": 5,
+ "Targets": [
+ {
+ "ChannelTargetInfo": {
+ "ContactChannelId": "arn:aws:ssm-contacts:us-east-2:111122223333:contact-channel/akuam/77d4f447-f619-4954-afff-85551e369c2a",
+ "RetryIntervalInMinutes": 1
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "Type": "PERSONAL"
+ },
+ "comments": {
+ },
+ "description": "The following get-contact example describes a contact.",
+ "id": "example-1-to-describe-a-contact-plan-1630365360005",
+ "title": "Example 1: To describe a contact plan"
+ },
+ {
+ "input": {
+ "ContactId": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/example_escalation"
+ },
+ "output": {
+ "Alias": "example_escalation",
+ "ContactArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/example_escalation",
+ "DisplayName": "Example Escalation Plan",
+ "Plan": {
+ "Stages": [
+ {
+ "DurationInMinutes": 5,
+ "Targets": [
+ {
+ "ContactTargetInfo": {
+ "ContactId": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/akuam",
+ "IsEssential": true
+ }
+ }
+ ]
+ },
+ {
+ "DurationInMinutes": 5,
+ "Targets": [
+ {
+ "ContactTargetInfo": {
+ "ContactId": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/alejr",
+ "IsEssential": false
+ }
+ }
+ ]
+ },
+ {
+ "DurationInMinutes": 0,
+ "Targets": [
+ {
+ "ContactTargetInfo": {
+ "ContactId": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/anasi",
+ "IsEssential": false
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "Type": "ESCALATION"
+ },
+ "comments": {
+ },
+ "description": "The following get-contact example describes an escalation plan.",
+ "id": "example-2-to-describe-an-escalation-plan-1630365515731",
+ "title": "Example 2: To describe an escalation plan"
+ }
+ ],
+ "GetContactChannel": [
+ {
+ "input": {
+ "ContactChannelId": "arn:aws:ssm-contacts:us-east-2:111122223333:contact-channel/akuam/fc7405c4-46b2-48b7-87b2-93e2f225b90d"
+ },
+ "output": {
+ "ActivationStatus": "ACTIVATED",
+ "ContactArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/akuam",
+ "ContactChannelArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact-channel/akuam/fc7405c4-46b2-48b7-87b2-93e2f225b90d",
+ "DeliveryAddress": {
+ "SimpleAddress": "+15005550199"
+ },
+ "Name": "akuas sms",
+ "Type": "SMS"
+ },
+ "comments": {
+ },
+ "description": "The following get-contact-channel example lists the details of a contact channel.",
+ "id": "to-list-the-details-of-a-contact-channel-1630365682730",
+ "title": "To list the details of a contact channel"
+ }
+ ],
+ "GetContactPolicy": [
+ {
+ "input": {
+ "ContactArn": "arn:aws:ssm-contacts:us-east-1:111122223333:contact/akuam"
+ },
+ "output": {
+ "ContactArn": "arn:aws:ssm-contacts:us-east-1:111122223333:contact/akuam",
+ "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"SharePolicyForDocumentationDralia\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"222233334444\"},\"Action\":[\"ssm-contacts:GetContact\",\"ssm-contacts:StartEngagement\",\"ssm-contacts:DescribeEngagement\",\"ssm-contacts:ListPagesByEngagement\",\"ssm-contacts:StopEngagement\"],\"Resource\":[\"arn:aws:ssm-contacts:*:111122223333:contact/akuam\",\"arn:aws:ssm-contacts:*:111122223333:engagement/akuam/*\"]}]}"
+ },
+ "comments": {
+ },
+ "description": "The following get-contact-policy example lists the resource policies associated with the specified contact.",
+ "id": "to-list-the-details-of-a-contact-channel-1630365682730",
+ "title": "To list the resource policies of a contact"
+ }
+ ],
+ "ListContactChannels": [
+ {
+ "input": {
+ "ContactId": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/akuam"
+ },
+ "output": {
+ "ContactChannels": [
+ {
+ "ActivationStatus": "ACTIVATED",
+ "ContactArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/akuam",
+ "ContactChannelArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact-channel/akuam/fc7405c4-46b2-48b7-87b2-93e2f225b90d",
+ "DeliveryAddress": {
+ "SimpleAddress": "+15005550100"
+ },
+ "Name": "akuas sms",
+ "Type": "SMS"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "The following list-contact-channels example lists the available contact channels of the specified contact.",
+ "id": "to-list-the-contact-channels-of-a-contact-1630366544252",
+ "title": "To list the contact channels of a contact"
+ }
+ ],
+ "ListContacts": [
+ {
+ "input": {
+ },
+ "output": {
+ "Contacts": [
+ {
+ "Alias": "akuam",
+ "ContactArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/akuam",
+ "DisplayName": "Akua Mansa",
+ "Type": "PERSONAL"
+ },
+ {
+ "Alias": "alejr",
+ "ContactArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/alejr",
+ "DisplayName": "Alejandro Rosalez",
+ "Type": "PERSONAL"
+ },
+ {
+ "Alias": "anasi",
+ "ContactArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/anasi",
+ "DisplayName": "Ana Carolina Silva",
+ "Type": "PERSONAL"
+ },
+ {
+ "Alias": "example_escalation",
+ "ContactArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/example_escalation",
+ "DisplayName": "Example Escalation",
+ "Type": "ESCALATION"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "The following list-contacts example lists the contacts and escalation plans in your account.",
+ "id": "to-list-all-escalation-plans-and-contacts-1630367103082",
+ "title": "To list all escalation plans and contacts"
+ }
+ ],
+ "ListEngagements": [
+ {
+ "input": {
+ },
+ "output": {
+ "Engagements": [
+ {
+ "ContactArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/akuam",
+ "EngagementArn": "arn:aws:ssm-contacts:us-east-2:111122223333:engagement/akuam/91792571-0b53-4821-9f73-d25d13d9e529",
+ "Sender": "cli",
+ "StartTime": "2021-05-18T20:37:50.300000+00:00"
+ },
+ {
+ "ContactArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/akuam",
+ "EngagementArn": "arn:aws:ssm-contacts:us-east-2:111122223333:engagement/akuam/78a29753-3674-4ac5-9f83-0468563567f0",
+ "Sender": "cli",
+ "StartTime": "2021-05-18T18:40:26.666000+00:00"
+ },
+ {
+ "ContactArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/example_escalation",
+ "EngagementArn": "arn:aws:ssm-contacts:us-east-2:111122223333:engagement/example_escalation/69e40ce1-8dbb-4d57-8962-5fbe7fc53356",
+ "Sender": "cli",
+ "StartTime": "2021-05-18T18:25:41.151000+00:00"
+ },
+ {
+ "ContactArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/akuam",
+ "EngagementArn": "arn:aws:ssm-contacts:us-east-2:111122223333:engagement/akuam/607ced0e-e8fa-4ea7-8958-a237b8803f8f",
+ "Sender": "cli",
+ "StartTime": "2021-05-18T18:20:58.093000+00:00"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "The following list-engagements example lists engagements to escalation plans and contacts. You can also list engagements for a single incident.",
+ "id": "to-list-all-engagements-1630367432635",
+ "title": "To list all engagements"
+ }
+ ],
+ "ListPageReceipts": [
+ {
+ "input": {
+ "PageId": "arn:aws:ssm-contacts:us-east-2:111122223333:page/akuam/94ea0c7b-56d9-46c3-b84a-a37c8b067ad3"
+ },
+ "output": {
+ "Receipts": [
+ {
+ "ContactChannelArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact-channel/akuam/fc7405c4-46b2-48b7-87b2-93e2f225b90d",
+ "ReceiptInfo": "425440",
+ "ReceiptTime": "2021-05-18T20:42:57.485000+00:00",
+ "ReceiptType": "DELIVERED"
+ },
+ {
+ "ContactChannelArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact-channel/akuam/fc7405c4-46b2-48b7-87b2-93e2f225b90d",
+ "ReceiptInfo": "425440",
+ "ReceiptTime": "2021-05-18T20:42:57.907000+00:00",
+ "ReceiptType": "READ"
+ },
+ {
+ "ContactChannelArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact-channel/akuam/fc7405c4-46b2-48b7-87b2-93e2f225b90d",
+ "ReceiptInfo": "SM6656c19132f1465f9c9c1123a5dde7c9",
+ "ReceiptTime": "2021-05-18T20:40:52.962000+00:00",
+ "ReceiptType": "SENT"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "The following command-name example lists whether a page was received or not by a contact.",
+ "id": "to-list-page-receipts-1630367706869",
+ "title": "To list page receipts"
+ }
+ ],
+ "ListPagesByContact": [
+ {
+ "input": {
+ "ContactId": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/akuam"
+ },
+ "output": {
+ "Pages": [
+ {
+ "ContactArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/akuam",
+ "DeliveryTime": "2021-05-18T18:43:55.265000+00:00",
+ "EngagementArn": "arn:aws:ssm-contacts:us-east-2:111122223333:engagement/akuam/78a29753-3674-4ac5-9f83-0468563567f0",
+ "PageArn": "arn:aws:ssm-contacts:us-east-2:111122223333:page/akuam/ad0052bd-e606-498a-861b-25726292eb93",
+ "ReadTime": "2021-05-18T18:43:55.708000+00:00",
+ "Sender": "cli",
+ "SentTime": "2021-05-18T18:43:29.301000+00:00"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "The following list-pages-by-contact example lists all pages to the specified contact.",
+ "id": "to-list-pages-by-contact-1630435789132",
+ "title": "To list pages by contact"
+ }
+ ],
+ "ListPagesByEngagement": [
+ {
+ "input": {
+ "EngagementId": "arn:aws:ssm-contacts:us-east-2:111122223333:engagement/akuam/78a29753-3674-4ac5-9f83-0468563567f0"
+ },
+ "output": {
+ "Pages": [
+ {
+ "ContactArn": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/akuam",
+ "EngagementArn": "arn:aws:ssm-contacts:us-east-2:111122223333:engagement/akuam/78a29753-3674-4ac5-9f83-0468563567f0",
+ "PageArn": "arn:aws:ssm-contacts:us-east-2:111122223333:page/akuam/ad0052bd-e606-498a-861b-25726292eb93",
+ "Sender": "cli",
+ "SentTime": "2021-05-18T18:40:27.245000+00:00"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "The following list-pages-by-engagement example lists the pages that occurred while engaging the defined engagement plan.",
+ "id": "to-list-pages-to-contact-channels-started-from-an-engagement-1630435864674",
+ "title": "To list pages to contact channels started from an engagement."
+ }
+ ],
+ "ListTagsForResource": [
+ {
+ "input": {
+ "ResourceARN": "arn:aws:ssm-contacts:us-east-1:111122223333:contact/akuam"
+ },
+ "output": {
+ "Tags": [
+ {
+ "Key": "group1",
+ "Value": "1"
+ }
+ ]
+ },
+ "comments": {
+ },
+ "description": "The following list-tags-for-resource example lists the tags of the specified contact.",
+ "id": "to-list-tags-for-a-contact-1630436051681",
+ "title": "To list tags for a contact"
+ }
+ ],
+ "PutContactPolicy": [
+ {
+ "input": {
+ "ContactArn": "arn:aws:ssm-contacts:us-east-1:111122223333:contact/akuam",
+ "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"ExampleResourcePolicy\",\"Action\":[\"ssm-contacts:GetContact\",\"ssm-contacts:StartEngagement\",\"ssm-contacts:DescribeEngagement\",\"ssm-contacts:ListPagesByEngagement\",\"ssm-contacts:StopEngagement\"],\"Principal\":{\"AWS\":\"222233334444\"},\"Effect\":\"Allow\",\"Resource\":[\"arn:aws:ssm-contacts:*:111122223333:contact/akuam\",\"arn:aws:ssm-contacts:*:111122223333:engagement/akuam/*\"]}]}"
+ },
+ "output": {
+ },
+ "comments": {
+ },
+ "description": "The following put-contact-policy example adds a resource policy to the contact Akua that shares the contact and related engagements with the principal.",
+ "id": "to-share-a-contact-and-engagements-1630436278898",
+ "title": "To share a contact and engagements"
+ }
+ ],
+ "SendActivationCode": [
+ {
+ "input": {
+ "ContactChannelId": "arn:aws:ssm-contacts:us-east-1:111122223333:contact-channel/akuam/8ddae2d1-12c8-4e45-b852-c8587266c400"
+ },
+ "output": {
+ },
+ "comments": {
+ },
+ "description": "The following send-activation-code example sends an activation code and message to the specified contact channel.",
+ "id": "to-send-an-activation-code-1630436453574",
+ "title": "To send an activation code"
+ }
+ ],
+ "StartEngagement": [
+ {
+ "input": {
+ "ContactId": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/akuam",
+ "Content": "Testing engagements",
+ "PublicContent": "Testing engagements",
+ "PublicSubject": "test",
+ "Sender": "tester",
+ "Subject": "test"
+ },
+ "output": {
+ "EngagementArn": "arn:aws:ssm-contacts:us-east-2:111122223333:engagement/akuam/607ced0e-e8fa-4ea7-8958-a237b8803f8f"
+ },
+ "comments": {
+ },
+ "description": "The following start-engagement pages contact's contact channels. Sender, subject, public-subject, and public-content are all free from fields. Incident Manager sends the subject and content to the provided VOICE or EMAIL contact channels. Incident Manager sends the public-subject and public-content to the provided SMS contact channels. Sender is used to track who started the engagement.",
+ "id": "example-1-to-page-a-contacts-contact-channels-1630436634872",
+ "title": "Example 1: To page a contact's contact channels"
+ },
+ {
+ "input": {
+ "ContactId": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/example_escalation",
+ "Content": "Testing engagements",
+ "PublicContent": "Testing engagements",
+ "PublicSubject": "test",
+ "Sender": "tester",
+ "Subject": "test"
+ },
+ "output": {
+ "EngagementArn": "arn:aws:ssm-contacts:us-east-2:111122223333:engagement/example_escalation/69e40ce1-8dbb-4d57-8962-5fbe7fc53356"
+ },
+ "comments": {
+ },
+ "description": "The following start-engagement engages contact's through an escalation plan. Each contact is paged according to their engagement plan.",
+ "id": "example-2-to-page-a-contact-in-the-provided-escalation-plan-1630436808480",
+ "title": "Example 2: To page a contact in the provided escalation plan."
+ }
+ ],
+ "StopEngagement": [
+ {
+ "input": {
+ "EngagementId": "arn:aws:ssm-contacts:us-east-2:111122223333:engagement/example_escalation/69e40ce1-8dbb-4d57-8962-5fbe7fc53356"
+ },
+ "output": {
+ },
+ "comments": {
+ },
+ "description": "The following stop-engagement example stops an engagement from paging further contacts and contact channels.",
+ "id": "to-stop-an-engagement-1630436882864",
+ "title": "To stop an engagement"
+ }
+ ],
+ "TagResource": [
+ {
+ "input": {
+ "ResourceARN": "arn:aws:ssm-contacts:us-east-1:111122223333:contact/akuam",
+ "Tags": [
+ {
+ "Key": "group1",
+ "Value": "1"
+ }
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ },
+ "description": "The following tag-resource example tags a specified contact with the provided tag key value pair.",
+ "id": "to-tag-a-contact-1630437124572",
+ "title": "To tag a contact"
+ }
+ ],
+ "UntagResource": [
+ {
+ "input": {
+ "ResourceARN": "arn:aws:ssm-contacts:us-east-1:111122223333:contact/akuam",
+ "TagKeys": [
+ "group1"
+ ]
+ },
+ "output": {
+ },
+ "comments": {
+ },
+ "description": "The following untag-resource example removes the group1 tag from the specified contact.",
+ "id": "to-remove-tags-from-a-contact-1630437251110",
+ "title": "To remove tags from a contact"
+ }
+ ],
+ "UpdateContact": [
+ {
+ "input": {
+ "ContactId": "arn:aws:ssm-contacts:us-east-2:111122223333:contact/akuam",
+ "Plan": {
+ "Stages": [
+ {
+ "DurationInMinutes": 5,
+ "Targets": [
+ {
+ "ChannelTargetInfo": {
+ "ContactChannelId": "arn:aws:ssm-contacts:us-east-2:111122223333:contact-channel/akuam/beb25840-5ac8-4644-95cc-7a8de390fa65",
+ "RetryIntervalInMinutes": 1
+ }
+ }
+ ]
+ },
+ {
+ "DurationInMinutes": 5,
+ "Targets": [
+ {
+ "ChannelTargetInfo": {
+ "ContactChannelId": "arn:aws:ssm-contacts:us-east-2:111122223333:contact-channel/akuam/49f3c24d-5f9f-4638-ae25-3f49e04229ad",
+ "RetryIntervalInMinutes": 1
+ }
+ }
+ ]
+ },
+ {
+ "DurationInMinutes": 5,
+ "Targets": [
+ {
+ "ChannelTargetInfo": {
+ "ContactChannelId": "arn:aws:ssm-contacts:us-east-2:111122223333:contact-channel/akuam/77d4f447-f619-4954-afff-85551e369c2a",
+ "RetryIntervalInMinutes": 1
+ }
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "output": {
+ },
+ "comments": {
+ },
+ "description": "The following update-contact example updates the engagement plan of the contact Akua to include the three types of contacts channels. This is done after creating contact channels for Akua.",
+ "id": "to-update-the-engagement-plan-of-contact-1630437436599",
+ "title": "To update the engagement plan of contact"
+ }
+ ],
+ "UpdateContactChannel": [
+ {
+ "input": {
+ "ContactChannelId": "arn:aws:ssm-contacts:us-east-2:111122223333:contact-channel/akuam/49f3c24d-5f9f-4638-ae25-3f49e04229ad",
+ "DeliveryAddress": {
+ "SimpleAddress": "+15005550198"
+ },
+ "Name": "akuas voice channel"
+ },
+ "output": {
+ },
+ "comments": {
+ },
+ "description": "The following update-contact-channel example updates the name and delivery address of a contact channel.",
+ "id": "to-update-a-contact-channel-1630437610256",
+ "title": "To update a contact channel"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ssm-contacts/2021-05-03/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ssm-contacts/2021-05-03/paginators-1.json
new file mode 100644
index 00000000..621bde80
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ssm-contacts/2021-05-03/paginators-1.json
@@ -0,0 +1,69 @@
+{
+ "pagination": {
+ "ListContactChannels": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ContactChannels"
+ },
+ "ListContacts": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Contacts"
+ },
+ "ListEngagements": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Engagements"
+ },
+ "ListPageReceipts": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Receipts"
+ },
+ "ListPagesByContact": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Pages"
+ },
+ "ListPagesByEngagement": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Pages"
+ },
+ "ListPageResolutions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "PageResolutions"
+ },
+ "ListPreviewRotationShifts": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "RotationShifts"
+ },
+ "ListRotationOverrides": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "RotationOverrides"
+ },
+ "ListRotationShifts": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "RotationShifts"
+ },
+ "ListRotations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Rotations"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ssm-contacts/2021-05-03/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ssm-contacts/2021-05-03/service-2.json.gz
new file mode 100644
index 00000000..77d909f1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ssm-contacts/2021-05-03/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ssm-incidents/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ssm-incidents/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..e937fcd1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ssm-incidents/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ssm-incidents/2018-05-10/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ssm-incidents/2018-05-10/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ssm-incidents/2018-05-10/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ssm-incidents/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ssm-incidents/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..662c714f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ssm-incidents/2018-05-10/paginators-1.json
@@ -0,0 +1,46 @@
+{
+ "pagination": {
+ "GetResourcePolicies": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "resourcePolicies"
+ },
+ "ListIncidentRecords": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "incidentRecordSummaries"
+ },
+ "ListRelatedItems": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "relatedItems"
+ },
+ "ListReplicationSets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "replicationSetArns"
+ },
+ "ListResponsePlans": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "responsePlanSummaries"
+ },
+ "ListTimelineEvents": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "eventSummaries"
+ },
+ "ListIncidentFindings": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "findings"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ssm-incidents/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ssm-incidents/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..05dfb2f0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ssm-incidents/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ssm-incidents/2018-05-10/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/ssm-incidents/2018-05-10/waiters-2.json
new file mode 100644
index 00000000..47c19b3a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ssm-incidents/2018-05-10/waiters-2.json
@@ -0,0 +1,53 @@
+{
+ "version" : 2,
+ "waiters" : {
+ "WaitForReplicationSetActive" : {
+ "description" : "Wait for a replication set to become ACTIVE",
+ "delay" : 30,
+ "maxAttempts" : 5,
+ "operation" : "GetReplicationSet",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "replicationSet.status",
+ "state" : "success",
+ "expected" : "ACTIVE"
+ }, {
+ "matcher" : "path",
+ "argument" : "replicationSet.status",
+ "state" : "retry",
+ "expected" : "CREATING"
+ }, {
+ "matcher" : "path",
+ "argument" : "replicationSet.status",
+ "state" : "retry",
+ "expected" : "UPDATING"
+ }, {
+ "matcher" : "path",
+ "argument" : "replicationSet.status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ } ]
+ },
+ "WaitForReplicationSetDeleted" : {
+ "description" : "Wait for a replication set to be deleted",
+ "delay" : 30,
+ "maxAttempts" : 5,
+ "operation" : "GetReplicationSet",
+ "acceptors" : [ {
+ "matcher" : "error",
+ "state" : "success",
+ "expected" : "ResourceNotFoundException"
+ }, {
+ "matcher" : "path",
+ "argument" : "replicationSet.status",
+ "state" : "retry",
+ "expected" : "DELETING"
+ }, {
+ "matcher" : "path",
+ "argument" : "replicationSet.status",
+ "state" : "failure",
+ "expected" : "FAILED"
+ } ]
+ }
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ssm-quicksetup/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ssm-quicksetup/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..58aa2adc
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ssm-quicksetup/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ssm-quicksetup/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ssm-quicksetup/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..fed0f281
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ssm-quicksetup/2018-05-10/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "ListConfigurationManagers": {
+ "input_token": "StartingToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxItems",
+ "result_key": "ConfigurationManagersList"
+ },
+ "ListConfigurations": {
+ "input_token": "StartingToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxItems",
+ "result_key": "ConfigurationsList"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ssm-quicksetup/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ssm-quicksetup/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..54b2a9c3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ssm-quicksetup/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ssm-sap/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ssm-sap/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..e6f7b1ab
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ssm-sap/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ssm-sap/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ssm-sap/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..6695d1f1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ssm-sap/2018-05-10/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "ListApplications": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Applications"
+ },
+ "ListComponents": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Components"
+ },
+ "ListDatabases": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Databases"
+ },
+ "ListOperations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Operations"
+ },
+ "ListOperationEvents": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "OperationEvents"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ssm-sap/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ssm-sap/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..35f9587d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ssm-sap/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ssm/2014-11-06/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ssm/2014-11-06/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..ef6910b3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ssm/2014-11-06/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ssm/2014-11-06/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ssm/2014-11-06/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ssm/2014-11-06/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ssm/2014-11-06/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/ssm/2014-11-06/paginators-1.json
new file mode 100644
index 00000000..3aafccc6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ssm/2014-11-06/paginators-1.json
@@ -0,0 +1,304 @@
+{
+ "pagination": {
+ "ListAssociations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Associations"
+ },
+ "ListCommandInvocations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "CommandInvocations"
+ },
+ "ListCommands": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Commands"
+ },
+ "ListDocuments": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "DocumentIdentifiers"
+ },
+ "DescribeInstanceInformation": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "InstanceInformationList"
+ },
+ "DescribeActivations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ActivationList"
+ },
+ "DescribeParameters": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Parameters"
+ },
+ "DescribeAssociationExecutions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AssociationExecutions"
+ },
+ "DescribeAssociationExecutionTargets": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AssociationExecutionTargets"
+ },
+ "GetInventory": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Entities"
+ },
+ "GetParametersByPath": {
+ "result_key": "Parameters",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "GetParameterHistory": {
+ "result_key": "Parameters",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "DescribeAutomationExecutions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AutomationExecutionMetadataList"
+ },
+ "DescribeAutomationStepExecutions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "StepExecutions"
+ },
+ "DescribeAvailablePatches": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Patches"
+ },
+ "DescribeEffectiveInstanceAssociations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Associations"
+ },
+ "DescribeEffectivePatchesForPatchBaseline": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "EffectivePatches"
+ },
+ "DescribeInstanceAssociationsStatus": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "InstanceAssociationStatusInfos"
+ },
+ "DescribeInstancePatchStates": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "InstancePatchStates"
+ },
+ "DescribeInstancePatchStatesForPatchGroup": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "InstancePatchStates"
+ },
+ "DescribeInstancePatches": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Patches"
+ },
+ "DescribeInventoryDeletions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "InventoryDeletions"
+ },
+ "DescribeMaintenanceWindowExecutionTaskInvocations": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "WindowExecutionTaskInvocationIdentities"
+ },
+ "DescribeMaintenanceWindowExecutionTasks": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "WindowExecutionTaskIdentities"
+ },
+ "DescribeMaintenanceWindowExecutions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "WindowExecutions"
+ },
+ "DescribeMaintenanceWindowSchedule": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ScheduledWindowExecutions"
+ },
+ "DescribeMaintenanceWindowTargets": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Targets"
+ },
+ "DescribeMaintenanceWindowTasks": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Tasks"
+ },
+ "DescribeMaintenanceWindows": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "WindowIdentities"
+ },
+ "DescribeMaintenanceWindowsForTarget": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "WindowIdentities"
+ },
+ "DescribePatchBaselines": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "BaselineIdentities"
+ },
+ "DescribePatchGroups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Mappings"
+ },
+ "DescribeSessions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Sessions"
+ },
+ "GetInventorySchema": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Schemas"
+ },
+ "ListAssociationVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AssociationVersions"
+ },
+ "ListComplianceItems": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ComplianceItems"
+ },
+ "ListComplianceSummaries": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ComplianceSummaryItems"
+ },
+ "ListDocumentVersions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "DocumentVersions"
+ },
+ "ListResourceComplianceSummaries": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ResourceComplianceSummaryItems"
+ },
+ "ListResourceDataSync": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ResourceDataSyncItems"
+ },
+ "DescribeOpsItems": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "OpsItemSummaries"
+ },
+ "DescribePatchProperties": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Properties"
+ },
+ "GetOpsSummary": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Entities"
+ },
+ "ListOpsItemEvents": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Summaries"
+ },
+ "ListOpsMetadata": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "OpsMetadataList"
+ },
+ "ListOpsItemRelatedItems": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Summaries"
+ },
+ "GetResourcePolicies": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Policies"
+ },
+ "DescribeInstanceProperties": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "InstanceProperties"
+ },
+ "ListNodes": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Nodes"
+ },
+ "ListNodesSummary": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Summary"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ssm/2014-11-06/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/ssm/2014-11-06/service-2.json.gz
new file mode 100644
index 00000000..03de1d76
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ssm/2014-11-06/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/ssm/2014-11-06/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/ssm/2014-11-06/waiters-2.json
new file mode 100644
index 00000000..43f5237f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/ssm/2014-11-06/waiters-2.json
@@ -0,0 +1,65 @@
+{
+ "version": 2,
+ "waiters": {
+ "CommandExecuted": {
+ "delay": 5,
+ "operation": "GetCommandInvocation",
+ "maxAttempts": 20,
+ "acceptors": [
+ {
+ "expected": "Pending",
+ "matcher": "path",
+ "state": "retry",
+ "argument": "Status"
+ },
+ {
+ "expected": "InProgress",
+ "matcher": "path",
+ "state": "retry",
+ "argument": "Status"
+ },
+ {
+ "expected": "Delayed",
+ "matcher": "path",
+ "state": "retry",
+ "argument": "Status"
+ },
+ {
+ "expected": "Success",
+ "matcher": "path",
+ "state": "success",
+ "argument": "Status"
+ },
+ {
+ "expected": "Cancelled",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "Status"
+ },
+ {
+ "expected": "TimedOut",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "Status"
+ },
+ {
+ "expected": "Failed",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "Status"
+ },
+ {
+ "expected": "Cancelling",
+ "matcher": "path",
+ "state": "failure",
+ "argument": "Status"
+ },
+ {
+ "state": "retry",
+ "matcher": "error",
+ "expected": "InvocationDoesNotExist"
+ }
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sso-admin/2020-07-20/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sso-admin/2020-07-20/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..173e8de5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sso-admin/2020-07-20/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sso-admin/2020-07-20/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sso-admin/2020-07-20/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sso-admin/2020-07-20/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sso-admin/2020-07-20/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sso-admin/2020-07-20/paginators-1.json
new file mode 100644
index 00000000..d2c8b687
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sso-admin/2020-07-20/paginators-1.json
@@ -0,0 +1,121 @@
+{
+ "pagination": {
+ "ListAccountAssignmentCreationStatus": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AccountAssignmentsCreationStatus"
+ },
+ "ListAccountAssignmentDeletionStatus": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AccountAssignmentsDeletionStatus"
+ },
+ "ListAccountAssignments": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AccountAssignments"
+ },
+ "ListAccountsForProvisionedPermissionSet": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AccountIds"
+ },
+ "ListInstances": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Instances"
+ },
+ "ListManagedPoliciesInPermissionSet": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AttachedManagedPolicies"
+ },
+ "ListPermissionSetProvisioningStatus": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "PermissionSetsProvisioningStatus"
+ },
+ "ListPermissionSets": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "PermissionSets"
+ },
+ "ListPermissionSetsProvisionedToAccount": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "PermissionSets"
+ },
+ "ListTagsForResource": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Tags"
+ },
+ "ListCustomerManagedPolicyReferencesInPermissionSet": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "CustomerManagedPolicyReferences"
+ },
+ "ListAccountAssignmentsForPrincipal": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AccountAssignments"
+ },
+ "ListApplicationAccessScopes": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Scopes"
+ },
+ "ListApplicationAssignments": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ApplicationAssignments"
+ },
+ "ListApplicationAssignmentsForPrincipal": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ApplicationAssignments"
+ },
+ "ListApplicationAuthenticationMethods": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "AuthenticationMethods"
+ },
+ "ListApplicationGrants": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Grants"
+ },
+ "ListApplicationProviders": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "ApplicationProviders"
+ },
+ "ListApplications": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Applications"
+ },
+ "ListTrustedTokenIssuers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "TrustedTokenIssuers"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sso-admin/2020-07-20/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sso-admin/2020-07-20/service-2.json.gz
new file mode 100644
index 00000000..29e16b1d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sso-admin/2020-07-20/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sso-oidc/2019-06-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sso-oidc/2019-06-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..0bbb4e5e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sso-oidc/2019-06-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sso-oidc/2019-06-10/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sso-oidc/2019-06-10/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sso-oidc/2019-06-10/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sso-oidc/2019-06-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sso-oidc/2019-06-10/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sso-oidc/2019-06-10/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sso-oidc/2019-06-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sso-oidc/2019-06-10/service-2.json.gz
new file mode 100644
index 00000000..afebb51d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sso-oidc/2019-06-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sso/2019-06-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sso/2019-06-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..ab35b45b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sso/2019-06-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sso/2019-06-10/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sso/2019-06-10/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sso/2019-06-10/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sso/2019-06-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sso/2019-06-10/paginators-1.json
new file mode 100644
index 00000000..daaed6fe
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sso/2019-06-10/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "ListAccountRoles": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "roleList"
+ },
+ "ListAccounts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "accountList"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sso/2019-06-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sso/2019-06-10/service-2.json.gz
new file mode 100644
index 00000000..4bc2b66f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sso/2019-06-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/stepfunctions/2016-11-23/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/stepfunctions/2016-11-23/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..bab52ed0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/stepfunctions/2016-11-23/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/stepfunctions/2016-11-23/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/stepfunctions/2016-11-23/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/stepfunctions/2016-11-23/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/stepfunctions/2016-11-23/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/stepfunctions/2016-11-23/paginators-1.json
new file mode 100644
index 00000000..fb8eb5e5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/stepfunctions/2016-11-23/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "GetExecutionHistory": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "events"
+ },
+ "ListActivities": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "activities"
+ },
+ "ListExecutions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "executions"
+ },
+ "ListStateMachines": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "stateMachines"
+ },
+ "ListMapRuns": {
+ "input_token": "nextToken",
+ "limit_key": "maxResults",
+ "output_token": "nextToken",
+ "result_key": "mapRuns"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/stepfunctions/2016-11-23/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/stepfunctions/2016-11-23/service-2.json.gz
new file mode 100644
index 00000000..7472b705
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/stepfunctions/2016-11-23/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/storagegateway/2013-06-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/storagegateway/2013-06-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..1f930d8d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/storagegateway/2013-06-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/storagegateway/2013-06-30/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/storagegateway/2013-06-30/examples-1.json
new file mode 100644
index 00000000..7cc0d7d4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/storagegateway/2013-06-30/examples-1.json
@@ -0,0 +1,1381 @@
+{
+ "version": "1.0",
+ "examples": {
+ "ActivateGateway": [
+ {
+ "input": {
+ "ActivationKey": "29AV1-3OFV9-VVIUB-NKT0I-LRO6V",
+ "GatewayName": "My_Gateway",
+ "GatewayRegion": "us-east-1",
+ "GatewayTimezone": "GMT-12:00",
+ "GatewayType": "STORED",
+ "MediumChangerType": "AWS-Gateway-VTL",
+ "TapeDriveType": "IBM-ULT3580-TD5"
+ },
+ "output": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-11A2222B"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Activates the gateway you previously deployed on your host.",
+ "id": "to-activate-the-gateway-1471281611207",
+ "title": "To activate the gateway"
+ }
+ ],
+ "AddCache": [
+ {
+ "input": {
+ "DiskIds": [
+ "pci-0000:03:00.0-scsi-0:0:0:0",
+ "pci-0000:03:00.0-scsi-0:0:1:0"
+ ],
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "output": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example shows a request that activates a gateway-stored volume.",
+ "id": "to-add-a-cache-1471043606854",
+ "title": "To add a cache"
+ }
+ ],
+ "AddTagsToResource": [
+ {
+ "input": {
+ "ResourceARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-11A2222B",
+ "Tags": [
+ {
+ "Key": "Dev Gatgeway Region",
+ "Value": "East Coast"
+ }
+ ]
+ },
+ "output": {
+ "ResourceARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-11A2222B"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Adds one or more tags to the specified resource.",
+ "id": "to-add-tags-to-resource-1471283689460",
+ "title": "To add tags to resource"
+ }
+ ],
+ "AddUploadBuffer": [
+ {
+ "input": {
+ "DiskIds": [
+ "pci-0000:03:00.0-scsi-0:0:0:0",
+ "pci-0000:03:00.0-scsi-0:0:1:0"
+ ],
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "output": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Configures one or more gateway local disks as upload buffer for a specified gateway.",
+ "id": "to-add-upload-buffer-on-local-disk-1471293902847",
+ "title": "To add upload buffer on local disk"
+ }
+ ],
+ "AddWorkingStorage": [
+ {
+ "input": {
+ "DiskIds": [
+ "pci-0000:03:00.0-scsi-0:0:0:0",
+ "pci-0000:03:00.0-scsi-0:0:1:0"
+ ],
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "output": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Configures one or more gateway local disks as working storage for a gateway. (Working storage is also referred to as upload buffer.)",
+ "id": "to-add-storage-on-local-disk-1471294305401",
+ "title": "To add storage on local disk"
+ }
+ ],
+ "CancelArchival": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B",
+ "TapeARN": "arn:aws:storagegateway:us-east-1:999999999999:tape/AMZN01A2A4"
+ },
+ "output": {
+ "TapeARN": "arn:aws:storagegateway:us-east-1:999999999999:tape/AMZN01A2A4"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Cancels archiving of a virtual tape to the virtual tape shelf (VTS) after the archiving process is initiated.",
+ "id": "to-cancel-virtual-tape-archiving-1471294865203",
+ "title": "To cancel virtual tape archiving"
+ }
+ ],
+ "CancelRetrieval": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B",
+ "TapeARN": "arn:aws:storagegateway:us-east-1:999999999999:tape/AMZN01A2A4"
+ },
+ "output": {
+ "TapeARN": "arn:aws:storagegateway:us-east-1:999999999999:tape/AMZN01A2A4"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Cancels retrieval of a virtual tape from the virtual tape shelf (VTS) to a gateway after the retrieval process is initiated.",
+ "id": "to-cancel-virtual-tape-retrieval-1471295704491",
+ "title": "To cancel virtual tape retrieval"
+ }
+ ],
+ "CreateCachediSCSIVolume": [
+ {
+ "input": {
+ "ClientToken": "cachedvol112233",
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B",
+ "NetworkInterfaceId": "10.1.1.1",
+ "SnapshotId": "snap-f47b7b94",
+ "TargetName": "my-volume",
+ "VolumeSizeInBytes": 536870912000
+ },
+ "output": {
+ "TargetARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/target/iqn.1997-05.com.amazon:myvolume",
+ "VolumeARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/volume/vol-1122AABB"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Creates a cached volume on a specified cached gateway.",
+ "id": "to-create-a-cached-iscsi-volume-1471296661787",
+ "title": "To create a cached iSCSI volume"
+ }
+ ],
+ "CreateSnapshot": [
+ {
+ "input": {
+ "SnapshotDescription": "My root volume snapshot as of 10/03/2017",
+ "VolumeARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/volume/vol-1122AABB"
+ },
+ "output": {
+ "SnapshotId": "snap-78e22663",
+ "VolumeARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/volume/vol-1122AABB"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Initiates an ad-hoc snapshot of a gateway volume.",
+ "id": "to-create-a-snapshot-of-a-gateway-volume-1471301469561",
+ "title": "To create a snapshot of a gateway volume"
+ }
+ ],
+ "CreateSnapshotFromVolumeRecoveryPoint": [
+ {
+ "input": {
+ "SnapshotDescription": "My root volume snapshot as of 2017-06-30T10:10:10.000Z",
+ "VolumeARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/volume/vol-1122AABB"
+ },
+ "output": {
+ "SnapshotId": "snap-78e22663",
+ "VolumeARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/volume/vol-1122AABB",
+ "VolumeRecoveryPointTime": "2017-06-30T10:10:10.000Z"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Initiates a snapshot of a gateway from a volume recovery point.",
+ "id": "to-create-a-snapshot-of-a-gateway-volume-1471301469561",
+ "title": "To create a snapshot of a gateway volume"
+ }
+ ],
+ "CreateStorediSCSIVolume": [
+ {
+ "input": {
+ "DiskId": "pci-0000:03:00.0-scsi-0:0:0:0",
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B",
+ "NetworkInterfaceId": "10.1.1.1",
+ "PreserveExistingData": true,
+ "SnapshotId": "snap-f47b7b94",
+ "TargetName": "my-volume"
+ },
+ "output": {
+ "TargetARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/target/iqn.1997-05.com.amazon:myvolume",
+ "VolumeARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/volume/vol-1122AABB",
+ "VolumeSizeInBytes": 1099511627776
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Creates a stored volume on a specified stored gateway.",
+ "id": "to-create-a-stored-iscsi-volume-1471367662813",
+ "title": "To create a stored iSCSI volume"
+ }
+ ],
+ "CreateTapeWithBarcode": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:999999999999:gateway/sgw-12A3456B",
+ "TapeBarcode": "TEST12345",
+ "TapeSizeInBytes": 107374182400
+ },
+ "output": {
+ "TapeARN": "arn:aws:storagegateway:us-east-1:999999999999:tape/TEST12345"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Creates a virtual tape by using your own barcode.",
+ "id": "to-create-a-virtual-tape-using-a-barcode-1471371842452",
+ "title": "To create a virtual tape using a barcode"
+ }
+ ],
+ "CreateTapes": [
+ {
+ "input": {
+ "ClientToken": "77777",
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:999999999999:gateway/sgw-12A3456B",
+ "NumTapesToCreate": 3,
+ "TapeBarcodePrefix": "TEST",
+ "TapeSizeInBytes": 107374182400
+ },
+ "output": {
+ "TapeARNs": [
+ "arn:aws:storagegateway:us-east-1:999999999999:tape/TEST38A29D",
+ "arn:aws:storagegateway:us-east-1:204469490176:tape/TEST3AA29F",
+ "arn:aws:storagegateway:us-east-1:204469490176:tape/TEST3BA29E"
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Creates one or more virtual tapes.",
+ "id": "to-create-a-virtual-tape-1471372061659",
+ "title": "To create a virtual tape"
+ }
+ ],
+ "DeleteBandwidthRateLimit": [
+ {
+ "input": {
+ "BandwidthType": "All",
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "output": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Deletes the bandwidth rate limits of a gateway; either the upload or download limit, or both.",
+ "id": "to-delete-bandwidth-rate-limits-of-gateway-1471373225520",
+ "title": "To delete bandwidth rate limits of gateway"
+ }
+ ],
+ "DeleteChapCredentials": [
+ {
+ "input": {
+ "InitiatorName": "iqn.1991-05.com.microsoft:computername.domain.example.com",
+ "TargetARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/target/iqn.1997-05.com.amazon:myvolume"
+ },
+ "output": {
+ "InitiatorName": "iqn.1991-05.com.microsoft:computername.domain.example.com",
+ "TargetARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/target/iqn.1997-05.com.amazon:myvolume"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Deletes Challenge-Handshake Authentication Protocol (CHAP) credentials for a specified iSCSI target and initiator pair.",
+ "id": "to-delete-chap-credentials-1471375025612",
+ "title": "To delete CHAP credentials"
+ }
+ ],
+ "DeleteGateway": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "output": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation deletes the gateway, but not the gateway's VM from the host computer.",
+ "id": "to-delete-a-gatgeway-1471381697333",
+ "title": "To delete a gatgeway"
+ }
+ ],
+ "DeleteSnapshotSchedule": [
+ {
+ "input": {
+ "VolumeARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/volume/vol-1122AABB"
+ },
+ "output": {
+ "VolumeARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/volume/vol-1122AABB"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This action enables you to delete a snapshot schedule for a volume.",
+ "id": "to-delete-a-snapshot-of-a-volume-1471382234377",
+ "title": "To delete a snapshot of a volume"
+ }
+ ],
+ "DeleteTape": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:204469490176:gateway/sgw-12A3456B",
+ "TapeARN": "arn:aws:storagegateway:us-east-1:204469490176:tape/TEST05A2A0"
+ },
+ "output": {
+ "TapeARN": "arn:aws:storagegateway:us-east-1:204469490176:tape/TEST05A2A0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example deletes the specified virtual tape.",
+ "id": "to-delete-a-virtual-tape-1471382444157",
+ "title": "To delete a virtual tape"
+ }
+ ],
+ "DeleteTapeArchive": [
+ {
+ "input": {
+ "TapeARN": "arn:aws:storagegateway:us-east-1:204469490176:tape/TEST05A2A0"
+ },
+ "output": {
+ "TapeARN": "arn:aws:storagegateway:us-east-1:204469490176:tape/TEST05A2A0"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Deletes the specified virtual tape from the virtual tape shelf (VTS).",
+ "id": "to-delete-a-virtual-tape-from-the-shelf-vts-1471383964329",
+ "title": "To delete a virtual tape from the shelf (VTS)"
+ }
+ ],
+ "DeleteVolume": [
+ {
+ "input": {
+ "VolumeARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/volume/vol-1122AABB"
+ },
+ "output": {
+ "VolumeARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/volume/vol-1122AABB"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Deletes the specified gateway volume that you previously created using the CreateCachediSCSIVolume or CreateStorediSCSIVolume API.",
+ "id": "to-delete-a-gateway-volume-1471384418416",
+ "title": "To delete a gateway volume"
+ }
+ ],
+ "DescribeBandwidthRateLimit": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "output": {
+ "AverageDownloadRateLimitInBitsPerSec": 204800,
+ "AverageUploadRateLimitInBitsPerSec": 102400,
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns a value for a bandwidth rate limit if set. If not set, then only the gateway ARN is returned.",
+ "id": "to-describe-the-bandwidth-rate-limits-of-a-gateway-1471384826404",
+ "title": "To describe the bandwidth rate limits of a gateway"
+ }
+ ],
+ "DescribeCache": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "output": {
+ "CacheAllocatedInBytes": 2199023255552,
+ "CacheDirtyPercentage": 0.07,
+ "CacheHitPercentage": 99.68,
+ "CacheMissPercentage": 0.32,
+ "CacheUsedPercentage": 0.07,
+ "DiskIds": [
+ "pci-0000:03:00.0-scsi-0:0:0:0",
+ "pci-0000:04:00.0-scsi-0:1:0:0"
+ ],
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns information about the cache of a gateway.",
+ "id": "to-describe-cache-information-1471385756036",
+ "title": "To describe cache information"
+ }
+ ],
+ "DescribeCachediSCSIVolumes": [
+ {
+ "input": {
+ "VolumeARNs": [
+ "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/volume/vol-1122AABB"
+ ]
+ },
+ "output": {
+ "CachediSCSIVolumes": [
+ {
+ "VolumeARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/volume/vol-1122AABB",
+ "VolumeId": "vol-1122AABB",
+ "VolumeSizeInBytes": 1099511627776,
+ "VolumeStatus": "AVAILABLE",
+ "VolumeType": "CACHED iSCSI",
+ "VolumeiSCSIAttributes": {
+ "ChapEnabled": true,
+ "LunNumber": 1,
+ "NetworkInterfaceId": "10.243.43.207",
+ "NetworkInterfacePort": 3260,
+ "TargetARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/target/iqn.1997-05.com.amazon:myvolume"
+ }
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns a description of the gateway cached iSCSI volumes specified in the request.",
+ "id": "to-describe-gateway-cached-iscsi-volumes-1471458094649",
+ "title": "To describe gateway cached iSCSI volumes"
+ }
+ ],
+ "DescribeChapCredentials": [
+ {
+ "input": {
+ "TargetARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/target/iqn.1997-05.com.amazon:myvolume"
+ },
+ "output": {
+ "ChapCredentials": [
+ {
+ "InitiatorName": "iqn.1991-05.com.microsoft:computername.domain.example.com",
+ "SecretToAuthenticateInitiator": "111111111111",
+ "SecretToAuthenticateTarget": "222222222222",
+ "TargetARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/target/iqn.1997-05.com.amazon:myvolume"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns an array of Challenge-Handshake Authentication Protocol (CHAP) credentials information for a specified iSCSI target, one for each target-initiator pair.",
+ "id": "to-describe-chap-credetnitals-for-an-iscsi-1471467462967",
+ "title": "To describe CHAP credetnitals for an iSCSI"
+ }
+ ],
+ "DescribeGatewayInformation": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "output": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B",
+ "GatewayId": "sgw-AABB1122",
+ "GatewayName": "My_Gateway",
+ "GatewayNetworkInterfaces": [
+ {
+ "Ipv4Address": "10.35.69.216"
+ }
+ ],
+ "GatewayState": "STATE_RUNNING",
+ "GatewayTimezone": "GMT-8:00",
+ "GatewayType": "STORED",
+ "LastSoftwareUpdate": "2016-01-02T16:00:00",
+ "NextUpdateAvailabilityDate": "2017-01-02T16:00:00"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns metadata about a gateway such as its name, network interfaces, configured time zone, and the state (whether the gateway is running or not).",
+ "id": "to-describe-metadata-about-the-gateway-1471467849079",
+ "title": "To describe metadata about the gateway"
+ }
+ ],
+ "DescribeMaintenanceStartTime": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "output": {
+ "DayOfWeek": 2,
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B",
+ "HourOfDay": 15,
+ "MinuteOfHour": 35,
+ "Timezone": "GMT+7:00"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns your gateway's weekly maintenance start time including the day and time of the week.",
+ "id": "to-describe-gateways-maintenance-start-time-1471470727387",
+ "title": "To describe gateway's maintenance start time"
+ }
+ ],
+ "DescribeSnapshotSchedule": [
+ {
+ "input": {
+ "VolumeARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/volume/vol-1122AABB"
+ },
+ "output": {
+ "Description": "sgw-AABB1122:vol-AABB1122:Schedule",
+ "RecurrenceInHours": 24,
+ "StartAt": 6,
+ "Timezone": "GMT+7:00",
+ "VolumeARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/volume/vol-1122AABB"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Describes the snapshot schedule for the specified gateway volume including intervals at which snapshots are automatically initiated.",
+ "id": "to-describe-snapshot-schedule-for-gateway-volume-1471471139538",
+ "title": "To describe snapshot schedule for gateway volume"
+ }
+ ],
+ "DescribeStorediSCSIVolumes": [
+ {
+ "input": {
+ "VolumeARNs": [
+ "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/volume/vol-1122AABB"
+ ]
+ },
+ "output": {
+ "StorediSCSIVolumes": [
+ {
+ "PreservedExistingData": false,
+ "VolumeARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/volume/vol-1122AABB",
+ "VolumeDiskId": "pci-0000:03:00.0-scsi-0:0:0:0",
+ "VolumeId": "vol-1122AABB",
+ "VolumeProgress": 23.7,
+ "VolumeSizeInBytes": 1099511627776,
+ "VolumeStatus": "BOOTSTRAPPING",
+ "VolumeiSCSIAttributes": {
+ "ChapEnabled": true,
+ "NetworkInterfaceId": "10.243.43.207",
+ "NetworkInterfacePort": 3260,
+ "TargetARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/target/iqn.1997-05.com.amazon:myvolume"
+ }
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns the description of the gateway volumes specified in the request belonging to the same gateway.",
+ "id": "to-describe-the-volumes-of-a-gateway-1471472640660",
+ "title": "To describe the volumes of a gateway"
+ }
+ ],
+ "DescribeTapeArchives": [
+ {
+ "input": {
+ "Limit": 123,
+ "Marker": "1",
+ "TapeARNs": [
+ "arn:aws:storagegateway:us-east-1:999999999999:tape/AM08A1AD",
+ "arn:aws:storagegateway:us-east-1:999999999999:tape/AMZN01A2A4"
+ ]
+ },
+ "output": {
+ "Marker": "1",
+ "TapeArchives": [
+ {
+ "CompletionTime": "2016-12-16T13:50Z",
+ "TapeARN": "arn:aws:storagegateway:us-east-1:999999999:tape/AM08A1AD",
+ "TapeBarcode": "AM08A1AD",
+ "TapeSizeInBytes": 107374182400,
+ "TapeStatus": "ARCHIVED"
+ },
+ {
+ "CompletionTime": "2016-12-16T13:59Z",
+ "TapeARN": "arn:aws:storagegateway:us-east-1:999999999:tape/AMZN01A2A4",
+ "TapeBarcode": "AMZN01A2A4",
+ "TapeSizeInBytes": 429496729600,
+ "TapeStatus": "ARCHIVED"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns a description of specified virtual tapes in the virtual tape shelf (VTS).",
+ "id": "to-describe-virtual-tapes-in-the-vts-1471473188198",
+ "title": "To describe virtual tapes in the VTS"
+ }
+ ],
+ "DescribeTapeRecoveryPoints": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B",
+ "Limit": 1,
+ "Marker": "1"
+ },
+ "output": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B",
+ "Marker": "1",
+ "TapeRecoveryPointInfos": [
+ {
+ "TapeARN": "arn:aws:storagegateway:us-east-1:999999999:tape/AMZN01A2A4",
+ "TapeRecoveryPointTime": "2016-12-16T13:50Z",
+ "TapeSizeInBytes": 1471550497,
+ "TapeStatus": "AVAILABLE"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns a list of virtual tape recovery points that are available for the specified gateway-VTL.",
+ "id": "to-describe-virtual-tape-recovery-points-1471542042026",
+ "title": "To describe virtual tape recovery points"
+ }
+ ],
+ "DescribeTapes": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:999999999999:gateway/sgw-12A3456B",
+ "Limit": 2,
+ "Marker": "1",
+ "TapeARNs": [
+ "arn:aws:storagegateway:us-east-1:999999999999:tape/TEST04A2A1",
+ "arn:aws:storagegateway:us-east-1:999999999999:tape/TEST05A2A0"
+ ]
+ },
+ "output": {
+ "Marker": "1",
+ "Tapes": [
+ {
+ "TapeARN": "arn:aws:storagegateway:us-east-1:999999999999:tape/TEST04A2A1",
+ "TapeBarcode": "TEST04A2A1",
+ "TapeSizeInBytes": 107374182400,
+ "TapeStatus": "AVAILABLE"
+ },
+ {
+ "TapeARN": "arn:aws:storagegateway:us-east-1:999999999999:tape/TEST05A2A0",
+ "TapeBarcode": "TEST05A2A0",
+ "TapeSizeInBytes": 107374182400,
+ "TapeStatus": "AVAILABLE"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns a description of the specified Amazon Resource Name (ARN) of virtual tapes. If a TapeARN is not specified, returns a description of all virtual tapes.",
+ "id": "to-describe-virtual-tapes-associated-with-gateway-1471629287727",
+ "title": "To describe virtual tape(s) associated with gateway"
+ }
+ ],
+ "DescribeUploadBuffer": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "output": {
+ "DiskIds": [
+ "pci-0000:03:00.0-scsi-0:0:0:0",
+ "pci-0000:04:00.0-scsi-0:1:0:0"
+ ],
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B",
+ "UploadBufferAllocatedInBytes": 0,
+ "UploadBufferUsedInBytes": 161061273600
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns information about the upload buffer of a gateway including disk IDs and the amount of upload buffer space allocated/used.",
+ "id": "to-describe-upload-buffer-of-gateway-1471631099003",
+ "title": "To describe upload buffer of gateway"
+ },
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "output": {
+ "DiskIds": [
+ "pci-0000:03:00.0-scsi-0:0:0:0",
+ "pci-0000:04:00.0-scsi-0:1:0:0"
+ ],
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B",
+ "UploadBufferAllocatedInBytes": 161061273600,
+ "UploadBufferUsedInBytes": 0
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns information about the upload buffer of a gateway including disk IDs and the amount of upload buffer space allocated and used.",
+ "id": "to-describe-upload-buffer-of-a-gateway--1471904566370",
+ "title": "To describe upload buffer of a gateway"
+ }
+ ],
+ "DescribeVTLDevices": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:999999999999:gateway/sgw-12A3456B",
+ "Limit": 123,
+ "Marker": "1",
+ "VTLDeviceARNs": [
+
+ ]
+ },
+ "output": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:999999999999:gateway/sgw-12A3456B",
+ "Marker": "1",
+ "VTLDevices": [
+ {
+ "DeviceiSCSIAttributes": {
+ "ChapEnabled": false,
+ "NetworkInterfaceId": "10.243.43.207",
+ "NetworkInterfacePort": 3260,
+ "TargetARN": "arn:aws:storagegateway:us-east-1:999999999999:gateway/sgw-12A3456B/target/iqn.1997-05.com.amazon:sgw-1fad4876-mediachanger"
+ },
+ "VTLDeviceARN": "arn:aws:storagegateway:us-east-1:999999999999:gateway/sgw-12A3456B/device/AMZN_SGW-1FAD4876_MEDIACHANGER_00001",
+ "VTLDeviceProductIdentifier": "L700",
+ "VTLDeviceType": "Medium Changer",
+ "VTLDeviceVendor": "STK"
+ },
+ {
+ "DeviceiSCSIAttributes": {
+ "ChapEnabled": false,
+ "NetworkInterfaceId": "10.243.43.209",
+ "NetworkInterfacePort": 3260,
+ "TargetARN": "arn:aws:storagegateway:us-east-1:999999999999:gateway/sgw-12A3456B/target/iqn.1997-05.com.amazon:sgw-1fad4876-tapedrive-01"
+ },
+ "VTLDeviceARN": "arn:aws:storagegateway:us-east-1:999999999999:gateway/sgw-12A3456B/device/AMZN_SGW-1FAD4876_TAPEDRIVE_00001",
+ "VTLDeviceProductIdentifier": "ULT3580-TD5",
+ "VTLDeviceType": "Tape Drive",
+ "VTLDeviceVendor": "IBM"
+ },
+ {
+ "DeviceiSCSIAttributes": {
+ "ChapEnabled": false,
+ "NetworkInterfaceId": "10.243.43.209",
+ "NetworkInterfacePort": 3260,
+ "TargetARN": "arn:aws:storagegateway:us-east-1:999999999999:gateway/sgw-12A3456B/target/iqn.1997-05.com.amazon:sgw-1fad4876-tapedrive-02"
+ },
+ "VTLDeviceARN": "arn:aws:storagegateway:us-east-1:999999999999:gateway/sgw-12A3456B/device/AMZN_SGW-1FAD4876_TAPEDRIVE_00002",
+ "VTLDeviceProductIdentifier": "ULT3580-TD5",
+ "VTLDeviceType": "Tape Drive",
+ "VTLDeviceVendor": "IBM"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Returns a description of virtual tape library (VTL) devices for the specified gateway.",
+ "id": "to-describe-virtual-tape-library-vtl-devices-of-a-single-gateway-1471906071410",
+ "title": "To describe virtual tape library (VTL) devices of a single gateway"
+ }
+ ],
+ "DescribeWorkingStorage": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "output": {
+ "DiskIds": [
+ "pci-0000:03:00.0-scsi-0:0:0:0",
+ "pci-0000:03:00.0-scsi-0:0:1:0"
+ ],
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B",
+ "WorkingStorageAllocatedInBytes": 2199023255552,
+ "WorkingStorageUsedInBytes": 789207040
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation is supported only for the gateway-stored volume architecture. This operation is deprecated in cached-volumes API version (20120630). Use DescribeUploadBuffer instead.",
+ "id": "to-describe-the-working-storage-of-a-gateway-depreciated-1472070842332",
+ "title": "To describe the working storage of a gateway [Depreciated]"
+ }
+ ],
+ "DisableGateway": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "output": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Disables a gateway when the gateway is no longer functioning. Use this operation for a gateway-VTL that is not reachable or not functioning.",
+ "id": "to-disable-a-gateway-when-it-is-no-longer-functioning-1472076046936",
+ "title": "To disable a gateway when it is no longer functioning"
+ }
+ ],
+ "ListGateways": [
+ {
+ "input": {
+ "Limit": 2,
+ "Marker": "1"
+ },
+ "output": {
+ "Gateways": [
+ {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-23A4567C"
+ }
+ ],
+ "Marker": "1"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists gateways owned by an AWS account in a specified region as requested. Results are sorted by gateway ARN up to a maximum of 100 gateways.",
+ "id": "to-lists-region-specific-gateways-per-aws-account-1472077860657",
+ "title": "To lists region specific gateways per AWS account"
+ }
+ ],
+ "ListLocalDisks": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "output": {
+ "Disks": [
+ {
+ "DiskAllocationType": "CACHE_STORAGE",
+ "DiskId": "pci-0000:03:00.0-scsi-0:0:0:0",
+ "DiskNode": "SCSI(0:0)",
+ "DiskPath": "/dev/sda",
+ "DiskSizeInBytes": 1099511627776,
+ "DiskStatus": "missing"
+ },
+ {
+ "DiskAllocationResource": "",
+ "DiskAllocationType": "UPLOAD_BUFFER",
+ "DiskId": "pci-0000:03:00.0-scsi-0:0:1:0",
+ "DiskNode": "SCSI(0:1)",
+ "DiskPath": "/dev/sdb",
+ "DiskSizeInBytes": 1099511627776,
+ "DiskStatus": "present"
+ }
+ ],
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The request returns a list of all disks, specifying which are configured as working storage, cache storage, or stored volume or not configured at all.",
+ "id": "to-list-the-gateways-local-disks-1472079564618",
+ "title": "To list the gateway's local disks"
+ }
+ ],
+ "ListTagsForResource": [
+ {
+ "input": {
+ "Limit": 1,
+ "Marker": "1",
+ "ResourceARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-11A2222B"
+ },
+ "output": {
+ "Marker": "1",
+ "ResourceARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-11A2222B",
+ "Tags": [
+ {
+ "Key": "Dev Gatgeway Region",
+ "Value": "East Coast"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists the tags that have been added to the specified resource.",
+ "id": "to-list-tags-that-have-been-added-to-a-resource-1472080268972",
+ "title": "To list tags that have been added to a resource"
+ }
+ ],
+ "ListVolumeRecoveryPoints": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "output": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B",
+ "VolumeRecoveryPointInfos": [
+ {
+ "VolumeARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/volume/vol-1122AABB",
+ "VolumeRecoveryPointTime": "2012-09-04T21:08:44.627Z",
+ "VolumeSizeInBytes": 536870912000
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists the recovery points for a specified gateway in which all data of the volume is consistent and can be used to create a snapshot.",
+ "id": "to-list-recovery-points-for-a-gateway-1472143015088",
+ "title": "To list recovery points for a gateway"
+ }
+ ],
+ "ListVolumes": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B",
+ "Limit": 2,
+ "Marker": "1"
+ },
+ "output": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B",
+ "Marker": "1",
+ "VolumeInfos": [
+ {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B",
+ "GatewayId": "sgw-12A3456B",
+ "VolumeARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/volume/vol-1122AABB",
+ "VolumeId": "vol-1122AABB",
+ "VolumeSizeInBytes": 107374182400,
+ "VolumeType": "STORED"
+ },
+ {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-13B4567C",
+ "GatewayId": "sgw-gw-13B4567C",
+ "VolumeARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-13B4567C/volume/vol-3344CCDD",
+ "VolumeId": "vol-1122AABB",
+ "VolumeSizeInBytes": 107374182400,
+ "VolumeType": "STORED"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists the iSCSI stored volumes of a gateway. Results are sorted by volume ARN up to a maximum of 100 volumes.",
+ "id": "to-list-the-iscsi-stored-volumes-of-a-gateway-1472145723653",
+ "title": "To list the iSCSI stored volumes of a gateway"
+ }
+ ],
+ "RemoveTagsFromResource": [
+ {
+ "input": {
+ "ResourceARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-11A2222B",
+ "TagKeys": [
+ "Dev Gatgeway Region",
+ "East Coast"
+ ]
+ },
+ "output": {
+ "ResourceARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-11A2222B"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Lists the iSCSI stored volumes of a gateway. Removes one or more tags from the specified resource.",
+ "id": "to-remove-tags-from-a-resource-1472147210553",
+ "title": "To remove tags from a resource"
+ }
+ ],
+ "ResetCache": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-13B4567C"
+ },
+ "output": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-13B4567C"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Resets all cache disks that have encountered a error and makes the disks available for reconfiguration as cache storage.",
+ "id": "to-reset-cache-disks-in-error-status-1472148909807",
+ "title": "To reset cache disks in error status"
+ }
+ ],
+ "RetrieveTapeArchive": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:999999999999:gateway/sgw-12A3456B",
+ "TapeARN": "arn:aws:storagegateway:us-east-1:999999999999:tape/TEST0AA2AF"
+ },
+ "output": {
+ "TapeARN": "arn:aws:storagegateway:us-east-1:999999999999:tape/TEST0AA2AF"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Retrieves an archived virtual tape from the virtual tape shelf (VTS) to a gateway-VTL. Virtual tapes archived in the VTS are not associated with any gateway.",
+ "id": "to-retrieve-an-archived-tape-from-the-vts-1472149812358",
+ "title": "To retrieve an archived tape from the VTS"
+ }
+ ],
+ "RetrieveTapeRecoveryPoint": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:999999999999:gateway/sgw-12A3456B",
+ "TapeARN": "arn:aws:storagegateway:us-east-1:999999999999:tape/TEST0AA2AF"
+ },
+ "output": {
+ "TapeARN": "arn:aws:storagegateway:us-east-1:999999999999:tape/TEST0AA2AF"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Retrieves the recovery point for the specified virtual tape.",
+ "id": "to-retrieve-the-recovery-point-of-a-virtual-tape-1472150014805",
+ "title": "To retrieve the recovery point of a virtual tape"
+ }
+ ],
+ "SetLocalConsolePassword": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:999999999999:gateway/sgw-12A3456B",
+ "LocalConsolePassword": "PassWordMustBeAtLeast6Chars."
+ },
+ "output": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:999999999999:gateway/sgw-12A3456B"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Sets the password for your VM local console.",
+ "id": "to-set-a-password-for-your-vm-1472150202632",
+ "title": "To set a password for your VM"
+ }
+ ],
+ "ShutdownGateway": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:999999999999:gateway/sgw-12A3456B"
+ },
+ "output": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:999999999999:gateway/sgw-12A3456B"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This operation shuts down the gateway service component running in the storage gateway's virtual machine (VM) and not the VM.",
+ "id": "to-shut-down-a-gateway-service-1472150508835",
+ "title": "To shut down a gateway service"
+ }
+ ],
+ "StartGateway": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:999999999999:gateway/sgw-12A3456B"
+ },
+ "output": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:999999999999:gateway/sgw-12A3456B"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Starts a gateway service that was previously shut down.",
+ "id": "to-start-a-gateway-service-1472150722315",
+ "title": "To start a gateway service"
+ }
+ ],
+ "UpdateBandwidthRateLimit": [
+ {
+ "input": {
+ "AverageDownloadRateLimitInBitsPerSec": 102400,
+ "AverageUploadRateLimitInBitsPerSec": 51200,
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "output": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Updates the bandwidth rate limits of a gateway. Both the upload and download bandwidth rate limit can be set, or either one of the two. If a new limit is not set, the existing rate limit remains.",
+ "id": "to-update-the-bandwidth-rate-limits-of-a-gateway-1472151016202",
+ "title": "To update the bandwidth rate limits of a gateway"
+ }
+ ],
+ "UpdateChapCredentials": [
+ {
+ "input": {
+ "InitiatorName": "iqn.1991-05.com.microsoft:computername.domain.example.com",
+ "SecretToAuthenticateInitiator": "111111111111",
+ "SecretToAuthenticateTarget": "222222222222",
+ "TargetARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/target/iqn.1997-05.com.amazon:myvolume"
+ },
+ "output": {
+ "InitiatorName": "iqn.1991-05.com.microsoft:computername.domain.example.com",
+ "TargetARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/target/iqn.1997-05.com.amazon:myvolume"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Updates the Challenge-Handshake Authentication Protocol (CHAP) credentials for a specified iSCSI target.",
+ "id": "to-update-chap-credentials-for-an-iscsi-target-1472151325795",
+ "title": "To update CHAP credentials for an iSCSI target"
+ }
+ ],
+ "UpdateGatewayInformation": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B",
+ "GatewayName": "MyGateway2",
+ "GatewayTimezone": "GMT-12:00"
+ },
+ "output": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B",
+ "GatewayName": ""
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Updates a gateway's metadata, which includes the gateway's name and time zone.",
+ "id": "to-update-a-gateways-metadata-1472151688693",
+ "title": "To update a gateway's metadata"
+ }
+ ],
+ "UpdateGatewaySoftwareNow": [
+ {
+ "input": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "output": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Updates the gateway virtual machine (VM) software. The request immediately triggers the software update.",
+ "id": "to-update-a-gateways-vm-software-1472152020929",
+ "title": "To update a gateway's VM software"
+ }
+ ],
+ "UpdateMaintenanceStartTime": [
+ {
+ "input": {
+ "DayOfWeek": 2,
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B",
+ "HourOfDay": 0,
+ "MinuteOfHour": 30
+ },
+ "output": {
+ "GatewayARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Updates a gateway's weekly maintenance start time information, including day and time of the week. The maintenance time is in your gateway's time zone.",
+ "id": "to-update-a-gateways-maintenance-start-time-1472152552031",
+ "title": "To update a gateway's maintenance start time"
+ }
+ ],
+ "UpdateSnapshotSchedule": [
+ {
+ "input": {
+ "Description": "Hourly snapshot",
+ "RecurrenceInHours": 1,
+ "StartAt": 0,
+ "VolumeARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/volume/vol-1122AABB"
+ },
+ "output": {
+ "VolumeARN": "arn:aws:storagegateway:us-east-1:111122223333:gateway/sgw-12A3456B/volume/vol-1122AABB"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Updates a snapshot schedule configured for a gateway volume.",
+ "id": "to-update-a-volume-snapshot-schedule-1472152757068",
+ "title": "To update a volume snapshot schedule"
+ }
+ ],
+ "UpdateVTLDeviceType": [
+ {
+ "input": {
+ "DeviceType": "Medium Changer",
+ "VTLDeviceARN": "arn:aws:storagegateway:us-east-1:999999999999:gateway/sgw-12A3456B/device/AMZN_SGW-1FAD4876_MEDIACHANGER_00001"
+ },
+ "output": {
+ "VTLDeviceARN": "arn:aws:storagegateway:us-east-1:999999999999:gateway/sgw-12A3456B/device/AMZN_SGW-1FAD4876_MEDIACHANGER_00001"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "Updates the type of medium changer in a gateway-VTL after a gateway-VTL is activated.",
+ "id": "to-update-a-vtl-device-type-1472153012967",
+ "title": "To update a VTL device type"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/storagegateway/2013-06-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/storagegateway/2013-06-30/paginators-1.json
new file mode 100644
index 00000000..ef9e79e6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/storagegateway/2013-06-30/paginators-1.json
@@ -0,0 +1,79 @@
+{
+ "pagination": {
+ "DescribeTapeArchives": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "output_token": "Marker",
+ "result_key": "TapeArchives"
+ },
+ "DescribeTapeRecoveryPoints": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "output_token": "Marker",
+ "result_key": "TapeRecoveryPointInfos"
+ },
+ "DescribeTapes": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "output_token": "Marker",
+ "result_key": "Tapes"
+ },
+ "DescribeVTLDevices": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "output_token": "Marker",
+ "result_key": "VTLDevices"
+ },
+ "ListGateways": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "output_token": "Marker",
+ "result_key": "Gateways"
+ },
+ "ListVolumes": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "output_token": "Marker",
+ "result_key": "VolumeInfos"
+ },
+ "ListTapes": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "output_token": "Marker",
+ "result_key": "TapeInfos"
+ },
+ "ListFileShares": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "non_aggregate_keys": [
+ "Marker"
+ ],
+ "output_token": "NextMarker",
+ "result_key": "FileShareInfoList"
+ },
+ "ListTagsForResource": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "non_aggregate_keys": [
+ "ResourceARN"
+ ],
+ "output_token": "Marker",
+ "result_key": "Tags"
+ },
+ "ListTapePools": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "output_token": "Marker",
+ "result_key": "PoolInfos"
+ },
+ "ListFileSystemAssociations": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "non_aggregate_keys": [
+ "Marker"
+ ],
+ "output_token": "NextMarker",
+ "result_key": "FileSystemAssociationSummaryList"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/storagegateway/2013-06-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/storagegateway/2013-06-30/service-2.json.gz
new file mode 100644
index 00000000..4d042366
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/storagegateway/2013-06-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sts/2011-06-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sts/2011-06-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..c8ceff06
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sts/2011-06-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sts/2011-06-15/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sts/2011-06-15/examples-1.json
new file mode 100644
index 00000000..7396aef5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sts/2011-06-15/examples-1.json
@@ -0,0 +1,271 @@
+{
+ "version": "1.0",
+ "examples": {
+ "AssumeRole": [
+ {
+ "input": {
+ "ExternalId": "123ABC",
+ "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Stmt1\",\"Effect\":\"Allow\",\"Action\":\"s3:ListAllMyBuckets\",\"Resource\":\"*\"}]}",
+ "RoleArn": "arn:aws:iam::123456789012:role/demo",
+ "RoleSessionName": "testAssumeRoleSession",
+ "Tags": [
+ {
+ "Key": "Project",
+ "Value": "Unicorn"
+ },
+ {
+ "Key": "Team",
+ "Value": "Automation"
+ },
+ {
+ "Key": "Cost-Center",
+ "Value": "12345"
+ }
+ ],
+ "TransitiveTagKeys": [
+ "Project",
+ "Cost-Center"
+ ]
+ },
+ "output": {
+ "AssumedRoleUser": {
+ "Arn": "arn:aws:sts::123456789012:assumed-role/demo/Bob",
+ "AssumedRoleId": "ARO123EXAMPLE123:Bob"
+ },
+ "Credentials": {
+ "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
+ "Expiration": "2011-07-15T23:28:33.359Z",
+ "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY",
+ "SessionToken": "AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA=="
+ },
+ "PackedPolicySize": 8
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "",
+ "id": "to-assume-a-role-1480532402212",
+ "title": "To assume a role"
+ }
+ ],
+ "AssumeRoleWithSAML": [
+ {
+ "input": {
+ "DurationSeconds": 3600,
+ "PrincipalArn": "arn:aws:iam::123456789012:saml-provider/SAML-test",
+ "RoleArn": "arn:aws:iam::123456789012:role/TestSaml",
+ "SAMLAssertion": "VERYLONGENCODEDASSERTIONEXAMPLExzYW1sOkF1ZGllbmNlPmJsYW5rPC9zYW1sOkF1ZGllbmNlPjwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPjwvc2FtbDpDb25kaXRpb25zPjxzYW1sOlN1YmplY3Q+PHNhbWw6TmFtZUlEIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOm5hbWVpZC1mb3JtYXQ6dHJhbnNpZW50Ij5TYW1sRXhhbXBsZTwvc2FtbDpOYW1lSUQ+PHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbiBNZXRob2Q9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpjbTpiZWFyZXIiPjxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAxOS0xMS0wMVQyMDoyNTowNS4xNDVaIiBSZWNpcGllbnQ9Imh0dHBzOi8vc2lnbmluLmF3cy5hbWF6b24uY29tL3NhbWwiLz48L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj48L3NhbWw6U3ViamVjdD48c2FtbDpBdXRoblN0YXRlbWVudCBBdXRoPD94bWwgdmpSZXNwb25zZT4="
+ },
+ "output": {
+ "AssumedRoleUser": {
+ "Arn": "arn:aws:sts::123456789012:assumed-role/TestSaml",
+ "AssumedRoleId": "ARO456EXAMPLE789:TestSaml"
+ },
+ "Audience": "https://signin.aws.amazon.com/saml",
+ "Credentials": {
+ "AccessKeyId": "ASIAV3ZUEFP6EXAMPLE",
+ "Expiration": "2019-11-01T20:26:47Z",
+ "SecretAccessKey": "8P+SQvWIuLnKhh8d++jpw0nNmQRBZvNEXAMPLEKEY",
+ "SessionToken": "IQoJb3JpZ2luX2VjEOz////////////////////wEXAMPLEtMSJHMEUCIDoKK3JH9uGQE1z0sINr5M4jk+Na8KHDcCYRVjJCZEvOAiEA3OvJGtw1EcViOleS2vhs8VdCKFJQWPQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA=="
+ },
+ "Issuer": "https://integ.example.com/idp/shibboleth",
+ "NameQualifier": "SbdGOnUkh1i4+EXAMPLExL/jEvs=",
+ "PackedPolicySize": 6,
+ "Subject": "SamlExample",
+ "SubjectType": "transient"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "",
+ "id": "to-assume-role-with-saml-14882749597814",
+ "title": "To assume a role using a SAML assertion"
+ }
+ ],
+ "AssumeRoleWithWebIdentity": [
+ {
+ "input": {
+ "DurationSeconds": 3600,
+ "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Stmt1\",\"Effect\":\"Allow\",\"Action\":\"s3:ListAllMyBuckets\",\"Resource\":\"*\"}]}",
+ "ProviderId": "www.amazon.com",
+ "RoleArn": "arn:aws:iam::123456789012:role/FederatedWebIdentityRole",
+ "RoleSessionName": "app1",
+ "WebIdentityToken": "Atza%7CIQEBLjAsAhRFiXuWpUXuRvQ9PZL3GMFcYevydwIUFAHZwXZXXXXXXXXJnrulxKDHwy87oGKPznh0D6bEQZTSCzyoCtL_8S07pLpr0zMbn6w1lfVZKNTBdDansFBmtGnIsIapjI6xKR02Yc_2bQ8LZbUXSGm6Ry6_BG7PrtLZtj_dfCTj92xNGed-CrKqjG7nPBjNIL016GGvuS5gSvPRUxWES3VYfm1wl7WTI7jn-Pcb6M-buCgHhFOzTQxod27L9CqnOLio7N3gZAGpsp6n1-AJBOCJckcyXe2c6uD0srOJeZlKUm2eTDVMf8IehDVI0r1QOnTV6KzzAI3OY87Vd_cVMQ"
+ },
+ "output": {
+ "AssumedRoleUser": {
+ "Arn": "arn:aws:sts::123456789012:assumed-role/FederatedWebIdentityRole/app1",
+ "AssumedRoleId": "AROACLKWSDQRAOEXAMPLE:app1"
+ },
+ "Audience": "client.5498841531868486423.1548@apps.example.com",
+ "Credentials": {
+ "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
+ "Expiration": "2014-10-24T23:00:23Z",
+ "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY",
+ "SessionToken": "AQoDYXdzEE0a8ANXXXXXXXXNO1ewxE5TijQyp+IEXAMPLE"
+ },
+ "PackedPolicySize": 123,
+ "Provider": "www.amazon.com",
+ "SubjectFromWebIdentityToken": "amzn1.account.AF6RHO7KZU5XRVQJGXK6HEXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "",
+ "id": "to-assume-a-role-as-an-openid-connect-federated-user-1480533445696",
+ "title": "To assume a role as an OpenID Connect-federated user"
+ }
+ ],
+ "DecodeAuthorizationMessage": [
+ {
+ "input": {
+ "EncodedMessage": "<encoded-message>"
+ },
+ "output": {
+ "DecodedMessage": "{\"allowed\": \"false\",\"explicitDeny\": \"false\",\"matchedStatements\": \"\",\"failures\": \"\",\"context\": {\"principal\": {\"id\": \"AIDACKCEVSQ6C2EXAMPLE\",\"name\": \"Bob\",\"arn\": \"arn:aws:iam::123456789012:user/Bob\"},\"action\": \"ec2:StopInstances\",\"resource\": \"arn:aws:ec2:us-east-1:123456789012:instance/i-dd01c9bd\",\"conditions\": [{\"item\": {\"key\": \"ec2:Tenancy\",\"values\": [\"default\"]},{\"item\": {\"key\": \"ec2:ResourceTag/elasticbeanstalk:environment-name\",\"values\": [\"Default-Environment\"]}},(Additional items ...)]}}"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "",
+ "id": "to-decode-information-about-an-authorization-status-of-a-request-1480533854499",
+ "title": "To decode information about an authorization status of a request"
+ }
+ ],
+ "GetCallerIdentity": [
+ {
+ "input": {
+ },
+ "output": {
+ "Account": "123456789012",
+ "Arn": "arn:aws:iam::123456789012:user/Alice",
+ "UserId": "AKIAI44QH8DHBEXAMPLE"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example shows a request and response made with the credentials for a user named Alice in the AWS account 123456789012.",
+ "id": "to-get-details-about-a-calling-iam-user-1480540050376",
+ "title": "To get details about a calling IAM user"
+ },
+ {
+ "input": {
+ },
+ "output": {
+ "Account": "123456789012",
+ "Arn": "arn:aws:sts::123456789012:assumed-role/my-role-name/my-role-session-name",
+ "UserId": "AKIAI44QH8DHBEXAMPLE:my-role-session-name"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example shows a request and response made with temporary credentials created by AssumeRole. The name of the assumed role is my-role-name, and the RoleSessionName is set to my-role-session-name.",
+ "id": "to-get-details-about-a-calling-user-federated-with-assumerole-1480540158545",
+ "title": "To get details about a calling user federated with AssumeRole"
+ },
+ {
+ "input": {
+ },
+ "output": {
+ "Account": "123456789012",
+ "Arn": "arn:aws:sts::123456789012:federated-user/my-federated-user-name",
+ "UserId": "123456789012:my-federated-user-name"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "This example shows a request and response made with temporary credentials created by using GetFederationToken. The Name parameter is set to my-federated-user-name.",
+ "id": "to-get-details-about-a-calling-user-federated-with-getfederationtoken-1480540231316",
+ "title": "To get details about a calling user federated with GetFederationToken"
+ }
+ ],
+ "GetFederationToken": [
+ {
+ "input": {
+ "DurationSeconds": 3600,
+ "Name": "testFedUserSession",
+ "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Stmt1\",\"Effect\":\"Allow\",\"Action\":\"s3:ListAllMyBuckets\",\"Resource\":\"*\"}]}",
+ "Tags": [
+ {
+ "Key": "Project",
+ "Value": "Pegasus"
+ },
+ {
+ "Key": "Cost-Center",
+ "Value": "98765"
+ }
+ ]
+ },
+ "output": {
+ "Credentials": {
+ "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
+ "Expiration": "2011-07-15T23:28:33.359Z",
+ "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY",
+ "SessionToken": "AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA=="
+ },
+ "FederatedUser": {
+ "Arn": "arn:aws:sts::123456789012:federated-user/Bob",
+ "FederatedUserId": "123456789012:Bob"
+ },
+ "PackedPolicySize": 8
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "",
+ "id": "to-get-temporary-credentials-for-a-role-by-using-getfederationtoken-1480540749900",
+ "title": "To get temporary credentials for a role by using GetFederationToken"
+ }
+ ],
+ "GetSessionToken": [
+ {
+ "input": {
+ "DurationSeconds": 3600,
+ "SerialNumber": "YourMFASerialNumber",
+ "TokenCode": "123456"
+ },
+ "output": {
+ "Credentials": {
+ "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
+ "Expiration": "2011-07-11T19:55:29.611Z",
+ "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY",
+ "SessionToken": "AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "",
+ "id": "to-get-temporary-credentials-for-an-iam-user-or-an-aws-account-1480540814038",
+ "title": "To get temporary credentials for an IAM user or an AWS account"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sts/2011-06-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/sts/2011-06-15/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sts/2011-06-15/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/sts/2011-06-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/sts/2011-06-15/service-2.json.gz
new file mode 100644
index 00000000..27988cc6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/sts/2011-06-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/supplychain/2024-01-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/supplychain/2024-01-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..bd4c8512
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/supplychain/2024-01-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/supplychain/2024-01-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/supplychain/2024-01-01/paginators-1.json
new file mode 100644
index 00000000..8ca1db6b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/supplychain/2024-01-01/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListDataIntegrationFlows": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "flows"
+ },
+ "ListDataLakeDatasets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "datasets"
+ },
+ "ListInstances": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "instances"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/supplychain/2024-01-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/supplychain/2024-01-01/service-2.json.gz
new file mode 100644
index 00000000..820b768d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/supplychain/2024-01-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/support-app/2021-08-20/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/support-app/2021-08-20/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..6eb60e85
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/support-app/2021-08-20/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/support-app/2021-08-20/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/support-app/2021-08-20/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/support-app/2021-08-20/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/support-app/2021-08-20/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/support-app/2021-08-20/service-2.json.gz
new file mode 100644
index 00000000..1558d146
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/support-app/2021-08-20/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/support/2013-04-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/support/2013-04-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..e472d9be
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/support/2013-04-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/support/2013-04-15/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/support/2013-04-15/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/support/2013-04-15/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/support/2013-04-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/support/2013-04-15/paginators-1.json
new file mode 100644
index 00000000..11bdb62c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/support/2013-04-15/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "DescribeCases": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "cases"
+ },
+ "DescribeCommunications": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "communications"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/support/2013-04-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/support/2013-04-15/service-2.json.gz
new file mode 100644
index 00000000..df3bb85b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/support/2013-04-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/swf/2012-01-25/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/swf/2012-01-25/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..e2008f92
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/swf/2012-01-25/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/swf/2012-01-25/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/swf/2012-01-25/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/swf/2012-01-25/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/swf/2012-01-25/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/swf/2012-01-25/paginators-1.json
new file mode 100644
index 00000000..e92bfebe
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/swf/2012-01-25/paginators-1.json
@@ -0,0 +1,53 @@
+{
+ "pagination": {
+ "GetWorkflowExecutionHistory": {
+ "limit_key": "maximumPageSize",
+ "input_token": "nextPageToken",
+ "output_token": "nextPageToken",
+ "result_key": "events"
+ },
+ "ListActivityTypes": {
+ "limit_key": "maximumPageSize",
+ "input_token": "nextPageToken",
+ "output_token": "nextPageToken",
+ "result_key": "typeInfos"
+ },
+ "ListClosedWorkflowExecutions": {
+ "limit_key": "maximumPageSize",
+ "input_token": "nextPageToken",
+ "output_token": "nextPageToken",
+ "result_key": "executionInfos"
+ },
+ "ListDomains": {
+ "limit_key": "maximumPageSize",
+ "input_token": "nextPageToken",
+ "output_token": "nextPageToken",
+ "result_key": "domainInfos"
+ },
+ "ListOpenWorkflowExecutions": {
+ "limit_key": "maximumPageSize",
+ "input_token": "nextPageToken",
+ "output_token": "nextPageToken",
+ "result_key": "executionInfos"
+ },
+ "ListWorkflowTypes": {
+ "limit_key": "maximumPageSize",
+ "input_token": "nextPageToken",
+ "output_token": "nextPageToken",
+ "result_key": "typeInfos"
+ },
+ "PollForDecisionTask": {
+ "limit_key": "maximumPageSize",
+ "input_token": "nextPageToken",
+ "output_token": "nextPageToken",
+ "result_key": "events",
+ "non_aggregate_keys": [
+ "taskToken",
+ "startedEventId",
+ "workflowExecution",
+ "workflowType",
+ "previousStartedEventId"
+ ]
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/swf/2012-01-25/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/swf/2012-01-25/service-2.json.gz
new file mode 100644
index 00000000..a561f0a1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/swf/2012-01-25/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/synthetics/2017-10-11/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/synthetics/2017-10-11/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..fd6bf17b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/synthetics/2017-10-11/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/synthetics/2017-10-11/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/synthetics/2017-10-11/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/synthetics/2017-10-11/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/synthetics/2017-10-11/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/synthetics/2017-10-11/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/synthetics/2017-10-11/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/synthetics/2017-10-11/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/synthetics/2017-10-11/service-2.json.gz
new file mode 100644
index 00000000..066edd6a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/synthetics/2017-10-11/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/taxsettings/2018-05-10/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/taxsettings/2018-05-10/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..2b4c14ec
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/taxsettings/2018-05-10/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/taxsettings/2018-05-10/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/taxsettings/2018-05-10/paginators-1.json
new file mode 100644
index 00000000..bd57abc9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/taxsettings/2018-05-10/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListTaxRegistrations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "accountDetails"
+ },
+ "ListSupplementalTaxRegistrations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "taxRegistrations"
+ },
+ "ListTaxExemptions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "taxExemptionDetailsMap"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/taxsettings/2018-05-10/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/taxsettings/2018-05-10/service-2.json.gz
new file mode 100644
index 00000000..20b18d08
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/taxsettings/2018-05-10/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/textract/2018-06-27/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/textract/2018-06-27/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..5bae26c7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/textract/2018-06-27/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/textract/2018-06-27/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/textract/2018-06-27/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/textract/2018-06-27/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/textract/2018-06-27/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/textract/2018-06-27/paginators-1.json
new file mode 100644
index 00000000..f0d04050
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/textract/2018-06-27/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "ListAdapterVersions": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AdapterVersions"
+ },
+ "ListAdapters": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "Adapters"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/textract/2018-06-27/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/textract/2018-06-27/service-2.json.gz
new file mode 100644
index 00000000..72c9ba7c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/textract/2018-06-27/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/timestream-influxdb/2023-01-27/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/timestream-influxdb/2023-01-27/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..823aad3a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/timestream-influxdb/2023-01-27/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/timestream-influxdb/2023-01-27/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/timestream-influxdb/2023-01-27/paginators-1.json
new file mode 100644
index 00000000..e0b4f3c5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/timestream-influxdb/2023-01-27/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListDbInstances": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListDbParameterGroups": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListDbClusters": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListDbInstancesForCluster": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/timestream-influxdb/2023-01-27/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/timestream-influxdb/2023-01-27/service-2.json.gz
new file mode 100644
index 00000000..6635e9b6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/timestream-influxdb/2023-01-27/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/timestream-query/2018-11-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/timestream-query/2018-11-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..f6fc5c02
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/timestream-query/2018-11-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/timestream-query/2018-11-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/timestream-query/2018-11-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/timestream-query/2018-11-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/timestream-query/2018-11-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/timestream-query/2018-11-01/paginators-1.json
new file mode 100644
index 00000000..a20456ba
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/timestream-query/2018-11-01/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "Query": {
+ "input_token": "NextToken",
+ "limit_key": "MaxRows",
+ "non_aggregate_keys": [
+ "ColumnInfo",
+ "QueryId",
+ "QueryStatus",
+ "QueryInsightsResponse"
+ ],
+ "output_token": "NextToken",
+ "result_key": "Rows"
+ },
+ "ListScheduledQueries": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ScheduledQueries"
+ },
+ "ListTagsForResource": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Tags"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/timestream-query/2018-11-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/timestream-query/2018-11-01/service-2.json.gz
new file mode 100644
index 00000000..4a6aed5c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/timestream-query/2018-11-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/timestream-write/2018-11-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/timestream-write/2018-11-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..c1c6d35a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/timestream-write/2018-11-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/timestream-write/2018-11-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/timestream-write/2018-11-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/timestream-write/2018-11-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/timestream-write/2018-11-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/timestream-write/2018-11-01/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/timestream-write/2018-11-01/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/timestream-write/2018-11-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/timestream-write/2018-11-01/service-2.json.gz
new file mode 100644
index 00000000..df7b6414
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/timestream-write/2018-11-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/tnb/2008-10-21/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/tnb/2008-10-21/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..4f9a2fef
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/tnb/2008-10-21/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/tnb/2008-10-21/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/tnb/2008-10-21/paginators-1.json
new file mode 100644
index 00000000..18ac477b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/tnb/2008-10-21/paginators-1.json
@@ -0,0 +1,34 @@
+{
+ "pagination": {
+ "ListSolFunctionInstances": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "functionInstances"
+ },
+ "ListSolFunctionPackages": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "functionPackages"
+ },
+ "ListSolNetworkInstances": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "networkInstances"
+ },
+ "ListSolNetworkOperations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "networkOperations"
+ },
+ "ListSolNetworkPackages": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "networkPackages"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/tnb/2008-10-21/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/tnb/2008-10-21/service-2.json.gz
new file mode 100644
index 00000000..392c6fdf
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/tnb/2008-10-21/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/transcribe/2017-10-26/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/transcribe/2017-10-26/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..9816f9e8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/transcribe/2017-10-26/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/transcribe/2017-10-26/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/transcribe/2017-10-26/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/transcribe/2017-10-26/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/transcribe/2017-10-26/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/transcribe/2017-10-26/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/transcribe/2017-10-26/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/transcribe/2017-10-26/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/transcribe/2017-10-26/service-2.json.gz
new file mode 100644
index 00000000..9580b2f6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/transcribe/2017-10-26/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/transfer/2018-11-05/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/transfer/2018-11-05/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..140ab147
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/transfer/2018-11-05/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/transfer/2018-11-05/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/transfer/2018-11-05/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/transfer/2018-11-05/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/transfer/2018-11-05/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/transfer/2018-11-05/paginators-1.json
new file mode 100644
index 00000000..a343b613
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/transfer/2018-11-05/paginators-1.json
@@ -0,0 +1,94 @@
+{
+ "pagination": {
+ "ListServers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Servers"
+ },
+ "ListAccesses": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "ServerId"
+ ],
+ "output_token": "NextToken",
+ "result_key": "Accesses"
+ },
+ "ListExecutions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "WorkflowId"
+ ],
+ "output_token": "NextToken",
+ "result_key": "Executions"
+ },
+ "ListSecurityPolicies": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "SecurityPolicyNames"
+ },
+ "ListTagsForResource": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "Arn"
+ ],
+ "output_token": "NextToken",
+ "result_key": "Tags"
+ },
+ "ListUsers": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "non_aggregate_keys": [
+ "ServerId"
+ ],
+ "output_token": "NextToken",
+ "result_key": "Users"
+ },
+ "ListWorkflows": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Workflows"
+ },
+ "ListAgreements": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Agreements"
+ },
+ "ListCertificates": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Certificates"
+ },
+ "ListConnectors": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Connectors"
+ },
+ "ListProfiles": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Profiles"
+ },
+ "ListFileTransferResults": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "FileTransferResults"
+ },
+ "ListWebApps": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "WebApps"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/transfer/2018-11-05/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/transfer/2018-11-05/service-2.json.gz
new file mode 100644
index 00000000..55754635
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/transfer/2018-11-05/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/transfer/2018-11-05/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/transfer/2018-11-05/waiters-2.json
new file mode 100644
index 00000000..ddcd604d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/transfer/2018-11-05/waiters-2.json
@@ -0,0 +1,37 @@
+{
+ "version" : 2,
+ "waiters" : {
+ "ServerOffline" : {
+ "delay" : 30,
+ "maxAttempts" : 120,
+ "operation" : "DescribeServer",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "Server.State",
+ "state" : "success",
+ "expected" : "OFFLINE"
+ }, {
+ "matcher" : "path",
+ "argument" : "Server.State",
+ "state" : "failure",
+ "expected" : "STOP_FAILED"
+ } ]
+ },
+ "ServerOnline" : {
+ "delay" : 30,
+ "maxAttempts" : 120,
+ "operation" : "DescribeServer",
+ "acceptors" : [ {
+ "matcher" : "path",
+ "argument" : "Server.State",
+ "state" : "success",
+ "expected" : "ONLINE"
+ }, {
+ "matcher" : "path",
+ "argument" : "Server.State",
+ "state" : "failure",
+ "expected" : "START_FAILED"
+ } ]
+ }
+ }
+} \ No newline at end of file
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/translate/2017-07-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/translate/2017-07-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..bce6c991
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/translate/2017-07-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/translate/2017-07-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/translate/2017-07-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/translate/2017-07-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/translate/2017-07-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/translate/2017-07-01/paginators-1.json
new file mode 100644
index 00000000..6898cd44
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/translate/2017-07-01/paginators-1.json
@@ -0,0 +1,10 @@
+{
+ "pagination": {
+ "ListTerminologies": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "TerminologyPropertiesList"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/translate/2017-07-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/translate/2017-07-01/service-2.json.gz
new file mode 100644
index 00000000..d96c8221
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/translate/2017-07-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/trustedadvisor/2022-09-15/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/trustedadvisor/2022-09-15/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..1f8d7726
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/trustedadvisor/2022-09-15/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/trustedadvisor/2022-09-15/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/trustedadvisor/2022-09-15/paginators-1.json
new file mode 100644
index 00000000..0ac4c7b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/trustedadvisor/2022-09-15/paginators-1.json
@@ -0,0 +1,40 @@
+{
+ "pagination": {
+ "ListChecks": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "checkSummaries"
+ },
+ "ListOrganizationRecommendationAccounts": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "accountRecommendationLifecycleSummaries"
+ },
+ "ListOrganizationRecommendationResources": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "organizationRecommendationResourceSummaries"
+ },
+ "ListOrganizationRecommendations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "organizationRecommendationSummaries"
+ },
+ "ListRecommendationResources": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "recommendationResourceSummaries"
+ },
+ "ListRecommendations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "recommendationSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/trustedadvisor/2022-09-15/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/trustedadvisor/2022-09-15/service-2.json.gz
new file mode 100644
index 00000000..c3ce2f95
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/trustedadvisor/2022-09-15/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/verifiedpermissions/2021-12-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/verifiedpermissions/2021-12-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..9128a6e9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/verifiedpermissions/2021-12-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/verifiedpermissions/2021-12-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/verifiedpermissions/2021-12-01/paginators-1.json
new file mode 100644
index 00000000..4314d715
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/verifiedpermissions/2021-12-01/paginators-1.json
@@ -0,0 +1,28 @@
+{
+ "pagination": {
+ "ListIdentitySources": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "identitySources"
+ },
+ "ListPolicies": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "policies"
+ },
+ "ListPolicyStores": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "policyStores"
+ },
+ "ListPolicyTemplates": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "policyTemplates"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/verifiedpermissions/2021-12-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/verifiedpermissions/2021-12-01/service-2.json.gz
new file mode 100644
index 00000000..2216d487
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/verifiedpermissions/2021-12-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/verifiedpermissions/2021-12-01/waiters-2.json b/.venv/lib/python3.12/site-packages/botocore/data/verifiedpermissions/2021-12-01/waiters-2.json
new file mode 100644
index 00000000..13f60ee6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/verifiedpermissions/2021-12-01/waiters-2.json
@@ -0,0 +1,5 @@
+{
+ "version": 2,
+ "waiters": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/voice-id/2021-09-27/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/voice-id/2021-09-27/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..2b010efe
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/voice-id/2021-09-27/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/voice-id/2021-09-27/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/voice-id/2021-09-27/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/voice-id/2021-09-27/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/voice-id/2021-09-27/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/voice-id/2021-09-27/paginators-1.json
new file mode 100644
index 00000000..49dd7cca
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/voice-id/2021-09-27/paginators-1.json
@@ -0,0 +1,40 @@
+{
+ "pagination": {
+ "ListDomains": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "DomainSummaries"
+ },
+ "ListFraudsterRegistrationJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "JobSummaries"
+ },
+ "ListSpeakerEnrollmentJobs": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "JobSummaries"
+ },
+ "ListSpeakers": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "SpeakerSummaries"
+ },
+ "ListFraudsters": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "FraudsterSummaries"
+ },
+ "ListWatchlists": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "WatchlistSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/voice-id/2021-09-27/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/voice-id/2021-09-27/service-2.json.gz
new file mode 100644
index 00000000..c641a7d5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/voice-id/2021-09-27/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/vpc-lattice/2022-11-30/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/vpc-lattice/2022-11-30/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..6a2692e3
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/vpc-lattice/2022-11-30/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/vpc-lattice/2022-11-30/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/vpc-lattice/2022-11-30/paginators-1.json
new file mode 100644
index 00000000..36688e97
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/vpc-lattice/2022-11-30/paginators-1.json
@@ -0,0 +1,88 @@
+{
+ "pagination": {
+ "ListAccessLogSubscriptions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListListeners": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListRules": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListServiceNetworkServiceAssociations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListServiceNetworkVpcAssociations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListServiceNetworks": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListServices": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListTargetGroups": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListTargets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListResourceConfigurations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListResourceEndpointAssociations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListResourceGateways": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListServiceNetworkResourceAssociations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ },
+ "ListServiceNetworkVpcEndpointAssociations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/vpc-lattice/2022-11-30/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/vpc-lattice/2022-11-30/service-2.json.gz
new file mode 100644
index 00000000..7ff7e4bf
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/vpc-lattice/2022-11-30/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/waf-regional/2016-11-28/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/waf-regional/2016-11-28/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..5f8aa460
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/waf-regional/2016-11-28/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/waf-regional/2016-11-28/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/waf-regional/2016-11-28/examples-1.json
new file mode 100644
index 00000000..eee5b6f4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/waf-regional/2016-11-28/examples-1.json
@@ -0,0 +1,1017 @@
+{
+ "version": "1.0",
+ "examples": {
+ "CreateIPSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "Name": "MyIPSetFriendlyName"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "IPSet": {
+ "IPSetDescriptors": [
+ {
+ "Type": "IPV4",
+ "Value": "192.0.2.44/32"
+ }
+ ],
+ "IPSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "Name": "MyIPSetFriendlyName"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates an IP match set named MyIPSetFriendlyName.",
+ "id": "createipset-1472501003122",
+ "title": "To create an IP set"
+ }
+ ],
+ "CreateRule": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "MetricName": "WAFByteHeaderRule",
+ "Name": "WAFByteHeaderRule"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "Rule": {
+ "MetricName": "WAFByteHeaderRule",
+ "Name": "WAFByteHeaderRule",
+ "Predicates": [
+ {
+ "DataId": "MyByteMatchSetID",
+ "Negated": false,
+ "Type": "ByteMatch"
+ }
+ ],
+ "RuleId": "WAFRule-1-Example"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates a rule named WAFByteHeaderRule.",
+ "id": "createrule-1474072675555",
+ "title": "To create a rule"
+ }
+ ],
+ "CreateSizeConstraintSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "Name": "MySampleSizeConstraintSet"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "SizeConstraintSet": {
+ "Name": "MySampleSizeConstraintSet",
+ "SizeConstraintSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "SizeConstraints": [
+ {
+ "ComparisonOperator": "GT",
+ "FieldToMatch": {
+ "Type": "QUERY_STRING"
+ },
+ "Size": 0,
+ "TextTransformation": "NONE"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates size constraint set named MySampleSizeConstraintSet.",
+ "id": "createsizeconstraint-1474299140754",
+ "title": "To create a size constraint"
+ }
+ ],
+ "CreateSqlInjectionMatchSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "Name": "MySQLInjectionMatchSet"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "SqlInjectionMatchSet": {
+ "Name": "MySQLInjectionMatchSet",
+ "SqlInjectionMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "SqlInjectionMatchTuples": [
+ {
+ "FieldToMatch": {
+ "Type": "QUERY_STRING"
+ },
+ "TextTransformation": "URL_DECODE"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates a SQL injection match set named MySQLInjectionMatchSet.",
+ "id": "createsqlinjectionmatchset-1474492796105",
+ "title": "To create a SQL injection match set"
+ }
+ ],
+ "CreateWebACL": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "DefaultAction": {
+ "Type": "ALLOW"
+ },
+ "MetricName": "CreateExample",
+ "Name": "CreateExample"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "WebACL": {
+ "DefaultAction": {
+ "Type": "ALLOW"
+ },
+ "MetricName": "CreateExample",
+ "Name": "CreateExample",
+ "Rules": [
+ {
+ "Action": {
+ "Type": "ALLOW"
+ },
+ "Priority": 1,
+ "RuleId": "WAFRule-1-Example"
+ }
+ ],
+ "WebACLId": "example-46da-4444-5555-example"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates a web ACL named CreateExample.",
+ "id": "createwebacl-1472061481310",
+ "title": "To create a web ACL"
+ }
+ ],
+ "CreateXssMatchSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "Name": "MySampleXssMatchSet"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "XssMatchSet": {
+ "Name": "MySampleXssMatchSet",
+ "XssMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "XssMatchTuples": [
+ {
+ "FieldToMatch": {
+ "Type": "QUERY_STRING"
+ },
+ "TextTransformation": "URL_DECODE"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates an XSS match set named MySampleXssMatchSet.",
+ "id": "createxssmatchset-1474560868500",
+ "title": "To create an XSS match set"
+ }
+ ],
+ "DeleteByteMatchSet": [
+ {
+ "input": {
+ "ByteMatchSetId": "exampleIDs3t-46da-4fdb-b8d5-abc321j569j5",
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a byte match set with the ID exampleIDs3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "deletebytematchset-1473367566229",
+ "title": "To delete a byte match set"
+ }
+ ],
+ "DeleteIPSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "IPSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes an IP match set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "deleteipset-1472767434306",
+ "title": "To delete an IP set"
+ }
+ ],
+ "DeleteRule": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "RuleId": "WAFRule-1-Example"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a rule with the ID WAFRule-1-Example.",
+ "id": "deleterule-1474073108749",
+ "title": "To delete a rule"
+ }
+ ],
+ "DeleteSizeConstraintSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "SizeConstraintSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a size constraint set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "deletesizeconstraintset-1474299857905",
+ "title": "To delete a size constraint set"
+ }
+ ],
+ "DeleteSqlInjectionMatchSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "SqlInjectionMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a SQL injection match set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "deletesqlinjectionmatchset-1474493373197",
+ "title": "To delete a SQL injection match set"
+ }
+ ],
+ "DeleteWebACL": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "WebACLId": "example-46da-4444-5555-example"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a web ACL with the ID example-46da-4444-5555-example.",
+ "id": "deletewebacl-1472767755931",
+ "title": "To delete a web ACL"
+ }
+ ],
+ "DeleteXssMatchSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "XssMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes an XSS match set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "deletexssmatchset-1474561302618",
+ "title": "To delete an XSS match set"
+ }
+ ],
+ "GetByteMatchSet": [
+ {
+ "input": {
+ "ByteMatchSetId": "exampleIDs3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "ByteMatchSet": {
+ "ByteMatchSetId": "exampleIDs3t-46da-4fdb-b8d5-abc321j569j5",
+ "ByteMatchTuples": [
+ {
+ "FieldToMatch": {
+ "Data": "referer",
+ "Type": "HEADER"
+ },
+ "PositionalConstraint": "CONTAINS",
+ "TargetString": "badrefer1",
+ "TextTransformation": "NONE"
+ }
+ ],
+ "Name": "ByteMatchNameExample"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the details of a byte match set with the ID exampleIDs3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "getbytematchset-1473273311532",
+ "title": "To get a byte match set"
+ }
+ ],
+ "GetChangeToken": [
+ {
+ "input": {
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns a change token to use for a create, update or delete operation.",
+ "id": "get-change-token-example-1471635120794",
+ "title": "To get a change token"
+ }
+ ],
+ "GetChangeTokenStatus": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "output": {
+ "ChangeTokenStatus": "PENDING"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the status of a change token with the ID abcd12f2-46da-4fdb-b8d5-fbd4c466928f.",
+ "id": "getchangetokenstatus-1474658417107",
+ "title": "To get the change token status"
+ }
+ ],
+ "GetIPSet": [
+ {
+ "input": {
+ "IPSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "IPSet": {
+ "IPSetDescriptors": [
+ {
+ "Type": "IPV4",
+ "Value": "192.0.2.44/32"
+ }
+ ],
+ "IPSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "Name": "MyIPSetFriendlyName"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the details of an IP match set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "getipset-1474658688675",
+ "title": "To get an IP set"
+ }
+ ],
+ "GetRule": [
+ {
+ "input": {
+ "RuleId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "Rule": {
+ "MetricName": "WAFByteHeaderRule",
+ "Name": "WAFByteHeaderRule",
+ "Predicates": [
+ {
+ "DataId": "MyByteMatchSetID",
+ "Negated": false,
+ "Type": "ByteMatch"
+ }
+ ],
+ "RuleId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the details of a rule with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "getrule-1474659238790",
+ "title": "To get a rule"
+ }
+ ],
+ "GetSampledRequests": [
+ {
+ "input": {
+ "MaxItems": 100,
+ "RuleId": "WAFRule-1-Example",
+ "TimeWindow": {
+ "EndTime": "2016-09-27T15:50Z",
+ "StartTime": "2016-09-27T15:50Z"
+ },
+ "WebAclId": "createwebacl-1472061481310"
+ },
+ "output": {
+ "PopulationSize": 50,
+ "SampledRequests": [
+ {
+ "Action": "BLOCK",
+ "Request": {
+ "ClientIP": "192.0.2.44",
+ "Country": "US",
+ "HTTPVersion": "HTTP/1.1",
+ "Headers": [
+ {
+ "Name": "User-Agent",
+ "Value": "BadBot "
+ }
+ ],
+ "Method": "HEAD"
+ },
+ "Timestamp": "2016-09-27T14:55Z",
+ "Weight": 1
+ }
+ ],
+ "TimeWindow": {
+ "EndTime": "2016-09-27T15:50Z",
+ "StartTime": "2016-09-27T14:50Z"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns detailed information about 100 requests --a sample-- that AWS WAF randomly selects from among the first 5,000 requests that your AWS resource received between the time period 2016-09-27T15:50Z to 2016-09-27T15:50Z.",
+ "id": "getsampledrequests-1474927997195",
+ "title": "To get a sampled requests"
+ }
+ ],
+ "GetSizeConstraintSet": [
+ {
+ "input": {
+ "SizeConstraintSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "SizeConstraintSet": {
+ "Name": "MySampleSizeConstraintSet",
+ "SizeConstraintSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "SizeConstraints": [
+ {
+ "ComparisonOperator": "GT",
+ "FieldToMatch": {
+ "Type": "QUERY_STRING"
+ },
+ "Size": 0,
+ "TextTransformation": "NONE"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the details of a size constraint match set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "getsizeconstraintset-1475005422493",
+ "title": "To get a size constraint set"
+ }
+ ],
+ "GetSqlInjectionMatchSet": [
+ {
+ "input": {
+ "SqlInjectionMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "SqlInjectionMatchSet": {
+ "Name": "MySQLInjectionMatchSet",
+ "SqlInjectionMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "SqlInjectionMatchTuples": [
+ {
+ "FieldToMatch": {
+ "Type": "QUERY_STRING"
+ },
+ "TextTransformation": "URL_DECODE"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the details of a SQL injection match set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "getsqlinjectionmatchset-1475005940137",
+ "title": "To get a SQL injection match set"
+ }
+ ],
+ "GetWebACL": [
+ {
+ "input": {
+ "WebACLId": "createwebacl-1472061481310"
+ },
+ "output": {
+ "WebACL": {
+ "DefaultAction": {
+ "Type": "ALLOW"
+ },
+ "MetricName": "CreateExample",
+ "Name": "CreateExample",
+ "Rules": [
+ {
+ "Action": {
+ "Type": "ALLOW"
+ },
+ "Priority": 1,
+ "RuleId": "WAFRule-1-Example"
+ }
+ ],
+ "WebACLId": "createwebacl-1472061481310"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the details of a web ACL with the ID createwebacl-1472061481310.",
+ "id": "getwebacl-1475006348525",
+ "title": "To get a web ACL"
+ }
+ ],
+ "GetXssMatchSet": [
+ {
+ "input": {
+ "XssMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "XssMatchSet": {
+ "Name": "MySampleXssMatchSet",
+ "XssMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "XssMatchTuples": [
+ {
+ "FieldToMatch": {
+ "Type": "QUERY_STRING"
+ },
+ "TextTransformation": "URL_DECODE"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the details of an XSS match set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "getxssmatchset-1475187879017",
+ "title": "To get an XSS match set"
+ }
+ ],
+ "ListIPSets": [
+ {
+ "input": {
+ "Limit": 100
+ },
+ "output": {
+ "IPSets": [
+ {
+ "IPSetId": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "Name": "MyIPSetFriendlyName"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns an array of up to 100 IP match sets.",
+ "id": "listipsets-1472235676229",
+ "title": "To list IP sets"
+ }
+ ],
+ "ListRules": [
+ {
+ "input": {
+ "Limit": 100
+ },
+ "output": {
+ "Rules": [
+ {
+ "Name": "WAFByteHeaderRule",
+ "RuleId": "WAFRule-1-Example"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns an array of up to 100 rules.",
+ "id": "listrules-1475258406433",
+ "title": "To list rules"
+ }
+ ],
+ "ListSizeConstraintSets": [
+ {
+ "input": {
+ "Limit": 100
+ },
+ "output": {
+ "SizeConstraintSets": [
+ {
+ "Name": "MySampleSizeConstraintSet",
+ "SizeConstraintSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns an array of up to 100 size contraint match sets.",
+ "id": "listsizeconstraintsets-1474300067597",
+ "title": "To list a size constraint sets"
+ }
+ ],
+ "ListSqlInjectionMatchSets": [
+ {
+ "input": {
+ "Limit": 100
+ },
+ "output": {
+ "SqlInjectionMatchSets": [
+ {
+ "Name": "MySQLInjectionMatchSet",
+ "SqlInjectionMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns an array of up to 100 SQL injection match sets.",
+ "id": "listsqlinjectionmatchset-1474493560103",
+ "title": "To list SQL injection match sets"
+ }
+ ],
+ "ListWebACLs": [
+ {
+ "input": {
+ "Limit": 100
+ },
+ "output": {
+ "WebACLs": [
+ {
+ "Name": "WebACLexample",
+ "WebACLId": "webacl-1472061481310"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns an array of up to 100 web ACLs.",
+ "id": "listwebacls-1475258732691",
+ "title": "To list Web ACLs"
+ }
+ ],
+ "ListXssMatchSets": [
+ {
+ "input": {
+ "Limit": 100
+ },
+ "output": {
+ "XssMatchSets": [
+ {
+ "Name": "MySampleXssMatchSet",
+ "XssMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns an array of up to 100 XSS match sets.",
+ "id": "listxssmatchsets-1474561481168",
+ "title": "To list XSS match sets"
+ }
+ ],
+ "UpdateByteMatchSet": [
+ {
+ "input": {
+ "ByteMatchSetId": "exampleIDs3t-46da-4fdb-b8d5-abc321j569j5",
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "Updates": [
+ {
+ "Action": "DELETE",
+ "ByteMatchTuple": {
+ "FieldToMatch": {
+ "Data": "referer",
+ "Type": "HEADER"
+ },
+ "PositionalConstraint": "CONTAINS",
+ "TargetString": "badrefer1",
+ "TextTransformation": "NONE"
+ }
+ }
+ ]
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a ByteMatchTuple object (filters) in an byte match set with the ID exampleIDs3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "updatebytematchset-1475259074558",
+ "title": "To update a byte match set"
+ }
+ ],
+ "UpdateIPSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "IPSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "Updates": [
+ {
+ "Action": "DELETE",
+ "IPSetDescriptor": {
+ "Type": "IPV4",
+ "Value": "192.0.2.44/32"
+ }
+ }
+ ]
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes an IPSetDescriptor object in an IP match set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "updateipset-1475259733625",
+ "title": "To update an IP set"
+ }
+ ],
+ "UpdateRule": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "RuleId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "Updates": [
+ {
+ "Action": "DELETE",
+ "Predicate": {
+ "DataId": "MyByteMatchSetID",
+ "Negated": false,
+ "Type": "ByteMatch"
+ }
+ }
+ ]
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a Predicate object in a rule with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "updaterule-1475260064720",
+ "title": "To update a rule"
+ }
+ ],
+ "UpdateSizeConstraintSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "SizeConstraintSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "Updates": [
+ {
+ "Action": "DELETE",
+ "SizeConstraint": {
+ "ComparisonOperator": "GT",
+ "FieldToMatch": {
+ "Type": "QUERY_STRING"
+ },
+ "Size": 0,
+ "TextTransformation": "NONE"
+ }
+ }
+ ]
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a SizeConstraint object (filters) in a size constraint set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "updatesizeconstraintset-1475531697891",
+ "title": "To update a size constraint set"
+ }
+ ],
+ "UpdateSqlInjectionMatchSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "SqlInjectionMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "Updates": [
+ {
+ "Action": "DELETE",
+ "SqlInjectionMatchTuple": {
+ "FieldToMatch": {
+ "Type": "QUERY_STRING"
+ },
+ "TextTransformation": "URL_DECODE"
+ }
+ }
+ ]
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a SqlInjectionMatchTuple object (filters) in a SQL injection match set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "updatesqlinjectionmatchset-1475532094686",
+ "title": "To update a SQL injection match set"
+ }
+ ],
+ "UpdateWebACL": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "DefaultAction": {
+ "Type": "ALLOW"
+ },
+ "Updates": [
+ {
+ "Action": "DELETE",
+ "ActivatedRule": {
+ "Action": {
+ "Type": "ALLOW"
+ },
+ "Priority": 1,
+ "RuleId": "WAFRule-1-Example"
+ }
+ }
+ ],
+ "WebACLId": "webacl-1472061481310"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes an ActivatedRule object in a WebACL with the ID webacl-1472061481310.",
+ "id": "updatewebacl-1475533627385",
+ "title": "To update a Web ACL"
+ }
+ ],
+ "UpdateXssMatchSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "Updates": [
+ {
+ "Action": "DELETE",
+ "XssMatchTuple": {
+ "FieldToMatch": {
+ "Type": "QUERY_STRING"
+ },
+ "TextTransformation": "URL_DECODE"
+ }
+ }
+ ],
+ "XssMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes an XssMatchTuple object (filters) in an XssMatchSet with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "updatexssmatchset-1475534098881",
+ "title": "To update an XSS match set"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/waf-regional/2016-11-28/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/waf-regional/2016-11-28/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/waf-regional/2016-11-28/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/waf-regional/2016-11-28/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/waf-regional/2016-11-28/service-2.json.gz
new file mode 100644
index 00000000..369ded76
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/waf-regional/2016-11-28/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/waf/2015-08-24/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/waf/2015-08-24/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..99885da2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/waf/2015-08-24/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/waf/2015-08-24/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/waf/2015-08-24/examples-1.json
new file mode 100644
index 00000000..eee5b6f4
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/waf/2015-08-24/examples-1.json
@@ -0,0 +1,1017 @@
+{
+ "version": "1.0",
+ "examples": {
+ "CreateIPSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "Name": "MyIPSetFriendlyName"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "IPSet": {
+ "IPSetDescriptors": [
+ {
+ "Type": "IPV4",
+ "Value": "192.0.2.44/32"
+ }
+ ],
+ "IPSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "Name": "MyIPSetFriendlyName"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates an IP match set named MyIPSetFriendlyName.",
+ "id": "createipset-1472501003122",
+ "title": "To create an IP set"
+ }
+ ],
+ "CreateRule": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "MetricName": "WAFByteHeaderRule",
+ "Name": "WAFByteHeaderRule"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "Rule": {
+ "MetricName": "WAFByteHeaderRule",
+ "Name": "WAFByteHeaderRule",
+ "Predicates": [
+ {
+ "DataId": "MyByteMatchSetID",
+ "Negated": false,
+ "Type": "ByteMatch"
+ }
+ ],
+ "RuleId": "WAFRule-1-Example"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates a rule named WAFByteHeaderRule.",
+ "id": "createrule-1474072675555",
+ "title": "To create a rule"
+ }
+ ],
+ "CreateSizeConstraintSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "Name": "MySampleSizeConstraintSet"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "SizeConstraintSet": {
+ "Name": "MySampleSizeConstraintSet",
+ "SizeConstraintSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "SizeConstraints": [
+ {
+ "ComparisonOperator": "GT",
+ "FieldToMatch": {
+ "Type": "QUERY_STRING"
+ },
+ "Size": 0,
+ "TextTransformation": "NONE"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates size constraint set named MySampleSizeConstraintSet.",
+ "id": "createsizeconstraint-1474299140754",
+ "title": "To create a size constraint"
+ }
+ ],
+ "CreateSqlInjectionMatchSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "Name": "MySQLInjectionMatchSet"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "SqlInjectionMatchSet": {
+ "Name": "MySQLInjectionMatchSet",
+ "SqlInjectionMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "SqlInjectionMatchTuples": [
+ {
+ "FieldToMatch": {
+ "Type": "QUERY_STRING"
+ },
+ "TextTransformation": "URL_DECODE"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates a SQL injection match set named MySQLInjectionMatchSet.",
+ "id": "createsqlinjectionmatchset-1474492796105",
+ "title": "To create a SQL injection match set"
+ }
+ ],
+ "CreateWebACL": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "DefaultAction": {
+ "Type": "ALLOW"
+ },
+ "MetricName": "CreateExample",
+ "Name": "CreateExample"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "WebACL": {
+ "DefaultAction": {
+ "Type": "ALLOW"
+ },
+ "MetricName": "CreateExample",
+ "Name": "CreateExample",
+ "Rules": [
+ {
+ "Action": {
+ "Type": "ALLOW"
+ },
+ "Priority": 1,
+ "RuleId": "WAFRule-1-Example"
+ }
+ ],
+ "WebACLId": "example-46da-4444-5555-example"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates a web ACL named CreateExample.",
+ "id": "createwebacl-1472061481310",
+ "title": "To create a web ACL"
+ }
+ ],
+ "CreateXssMatchSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "Name": "MySampleXssMatchSet"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "XssMatchSet": {
+ "Name": "MySampleXssMatchSet",
+ "XssMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "XssMatchTuples": [
+ {
+ "FieldToMatch": {
+ "Type": "QUERY_STRING"
+ },
+ "TextTransformation": "URL_DECODE"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example creates an XSS match set named MySampleXssMatchSet.",
+ "id": "createxssmatchset-1474560868500",
+ "title": "To create an XSS match set"
+ }
+ ],
+ "DeleteByteMatchSet": [
+ {
+ "input": {
+ "ByteMatchSetId": "exampleIDs3t-46da-4fdb-b8d5-abc321j569j5",
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a byte match set with the ID exampleIDs3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "deletebytematchset-1473367566229",
+ "title": "To delete a byte match set"
+ }
+ ],
+ "DeleteIPSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "IPSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes an IP match set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "deleteipset-1472767434306",
+ "title": "To delete an IP set"
+ }
+ ],
+ "DeleteRule": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "RuleId": "WAFRule-1-Example"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a rule with the ID WAFRule-1-Example.",
+ "id": "deleterule-1474073108749",
+ "title": "To delete a rule"
+ }
+ ],
+ "DeleteSizeConstraintSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "SizeConstraintSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a size constraint set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "deletesizeconstraintset-1474299857905",
+ "title": "To delete a size constraint set"
+ }
+ ],
+ "DeleteSqlInjectionMatchSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "SqlInjectionMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a SQL injection match set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "deletesqlinjectionmatchset-1474493373197",
+ "title": "To delete a SQL injection match set"
+ }
+ ],
+ "DeleteWebACL": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "WebACLId": "example-46da-4444-5555-example"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a web ACL with the ID example-46da-4444-5555-example.",
+ "id": "deletewebacl-1472767755931",
+ "title": "To delete a web ACL"
+ }
+ ],
+ "DeleteXssMatchSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "XssMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes an XSS match set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "deletexssmatchset-1474561302618",
+ "title": "To delete an XSS match set"
+ }
+ ],
+ "GetByteMatchSet": [
+ {
+ "input": {
+ "ByteMatchSetId": "exampleIDs3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "ByteMatchSet": {
+ "ByteMatchSetId": "exampleIDs3t-46da-4fdb-b8d5-abc321j569j5",
+ "ByteMatchTuples": [
+ {
+ "FieldToMatch": {
+ "Data": "referer",
+ "Type": "HEADER"
+ },
+ "PositionalConstraint": "CONTAINS",
+ "TargetString": "badrefer1",
+ "TextTransformation": "NONE"
+ }
+ ],
+ "Name": "ByteMatchNameExample"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the details of a byte match set with the ID exampleIDs3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "getbytematchset-1473273311532",
+ "title": "To get a byte match set"
+ }
+ ],
+ "GetChangeToken": [
+ {
+ "input": {
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns a change token to use for a create, update or delete operation.",
+ "id": "get-change-token-example-1471635120794",
+ "title": "To get a change token"
+ }
+ ],
+ "GetChangeTokenStatus": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "output": {
+ "ChangeTokenStatus": "PENDING"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the status of a change token with the ID abcd12f2-46da-4fdb-b8d5-fbd4c466928f.",
+ "id": "getchangetokenstatus-1474658417107",
+ "title": "To get the change token status"
+ }
+ ],
+ "GetIPSet": [
+ {
+ "input": {
+ "IPSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "IPSet": {
+ "IPSetDescriptors": [
+ {
+ "Type": "IPV4",
+ "Value": "192.0.2.44/32"
+ }
+ ],
+ "IPSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "Name": "MyIPSetFriendlyName"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the details of an IP match set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "getipset-1474658688675",
+ "title": "To get an IP set"
+ }
+ ],
+ "GetRule": [
+ {
+ "input": {
+ "RuleId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "Rule": {
+ "MetricName": "WAFByteHeaderRule",
+ "Name": "WAFByteHeaderRule",
+ "Predicates": [
+ {
+ "DataId": "MyByteMatchSetID",
+ "Negated": false,
+ "Type": "ByteMatch"
+ }
+ ],
+ "RuleId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the details of a rule with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "getrule-1474659238790",
+ "title": "To get a rule"
+ }
+ ],
+ "GetSampledRequests": [
+ {
+ "input": {
+ "MaxItems": 100,
+ "RuleId": "WAFRule-1-Example",
+ "TimeWindow": {
+ "EndTime": "2016-09-27T15:50Z",
+ "StartTime": "2016-09-27T15:50Z"
+ },
+ "WebAclId": "createwebacl-1472061481310"
+ },
+ "output": {
+ "PopulationSize": 50,
+ "SampledRequests": [
+ {
+ "Action": "BLOCK",
+ "Request": {
+ "ClientIP": "192.0.2.44",
+ "Country": "US",
+ "HTTPVersion": "HTTP/1.1",
+ "Headers": [
+ {
+ "Name": "User-Agent",
+ "Value": "BadBot "
+ }
+ ],
+ "Method": "HEAD"
+ },
+ "Timestamp": "2016-09-27T14:55Z",
+ "Weight": 1
+ }
+ ],
+ "TimeWindow": {
+ "EndTime": "2016-09-27T15:50Z",
+ "StartTime": "2016-09-27T14:50Z"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns detailed information about 100 requests --a sample-- that AWS WAF randomly selects from among the first 5,000 requests that your AWS resource received between the time period 2016-09-27T15:50Z to 2016-09-27T15:50Z.",
+ "id": "getsampledrequests-1474927997195",
+ "title": "To get a sampled requests"
+ }
+ ],
+ "GetSizeConstraintSet": [
+ {
+ "input": {
+ "SizeConstraintSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "SizeConstraintSet": {
+ "Name": "MySampleSizeConstraintSet",
+ "SizeConstraintSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "SizeConstraints": [
+ {
+ "ComparisonOperator": "GT",
+ "FieldToMatch": {
+ "Type": "QUERY_STRING"
+ },
+ "Size": 0,
+ "TextTransformation": "NONE"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the details of a size constraint match set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "getsizeconstraintset-1475005422493",
+ "title": "To get a size constraint set"
+ }
+ ],
+ "GetSqlInjectionMatchSet": [
+ {
+ "input": {
+ "SqlInjectionMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "SqlInjectionMatchSet": {
+ "Name": "MySQLInjectionMatchSet",
+ "SqlInjectionMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "SqlInjectionMatchTuples": [
+ {
+ "FieldToMatch": {
+ "Type": "QUERY_STRING"
+ },
+ "TextTransformation": "URL_DECODE"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the details of a SQL injection match set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "getsqlinjectionmatchset-1475005940137",
+ "title": "To get a SQL injection match set"
+ }
+ ],
+ "GetWebACL": [
+ {
+ "input": {
+ "WebACLId": "createwebacl-1472061481310"
+ },
+ "output": {
+ "WebACL": {
+ "DefaultAction": {
+ "Type": "ALLOW"
+ },
+ "MetricName": "CreateExample",
+ "Name": "CreateExample",
+ "Rules": [
+ {
+ "Action": {
+ "Type": "ALLOW"
+ },
+ "Priority": 1,
+ "RuleId": "WAFRule-1-Example"
+ }
+ ],
+ "WebACLId": "createwebacl-1472061481310"
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the details of a web ACL with the ID createwebacl-1472061481310.",
+ "id": "getwebacl-1475006348525",
+ "title": "To get a web ACL"
+ }
+ ],
+ "GetXssMatchSet": [
+ {
+ "input": {
+ "XssMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "XssMatchSet": {
+ "Name": "MySampleXssMatchSet",
+ "XssMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "XssMatchTuples": [
+ {
+ "FieldToMatch": {
+ "Type": "QUERY_STRING"
+ },
+ "TextTransformation": "URL_DECODE"
+ }
+ ]
+ }
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns the details of an XSS match set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "getxssmatchset-1475187879017",
+ "title": "To get an XSS match set"
+ }
+ ],
+ "ListIPSets": [
+ {
+ "input": {
+ "Limit": 100
+ },
+ "output": {
+ "IPSets": [
+ {
+ "IPSetId": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "Name": "MyIPSetFriendlyName"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns an array of up to 100 IP match sets.",
+ "id": "listipsets-1472235676229",
+ "title": "To list IP sets"
+ }
+ ],
+ "ListRules": [
+ {
+ "input": {
+ "Limit": 100
+ },
+ "output": {
+ "Rules": [
+ {
+ "Name": "WAFByteHeaderRule",
+ "RuleId": "WAFRule-1-Example"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns an array of up to 100 rules.",
+ "id": "listrules-1475258406433",
+ "title": "To list rules"
+ }
+ ],
+ "ListSizeConstraintSets": [
+ {
+ "input": {
+ "Limit": 100
+ },
+ "output": {
+ "SizeConstraintSets": [
+ {
+ "Name": "MySampleSizeConstraintSet",
+ "SizeConstraintSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns an array of up to 100 size contraint match sets.",
+ "id": "listsizeconstraintsets-1474300067597",
+ "title": "To list a size constraint sets"
+ }
+ ],
+ "ListSqlInjectionMatchSets": [
+ {
+ "input": {
+ "Limit": 100
+ },
+ "output": {
+ "SqlInjectionMatchSets": [
+ {
+ "Name": "MySQLInjectionMatchSet",
+ "SqlInjectionMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns an array of up to 100 SQL injection match sets.",
+ "id": "listsqlinjectionmatchset-1474493560103",
+ "title": "To list SQL injection match sets"
+ }
+ ],
+ "ListWebACLs": [
+ {
+ "input": {
+ "Limit": 100
+ },
+ "output": {
+ "WebACLs": [
+ {
+ "Name": "WebACLexample",
+ "WebACLId": "webacl-1472061481310"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns an array of up to 100 web ACLs.",
+ "id": "listwebacls-1475258732691",
+ "title": "To list Web ACLs"
+ }
+ ],
+ "ListXssMatchSets": [
+ {
+ "input": {
+ "Limit": 100
+ },
+ "output": {
+ "XssMatchSets": [
+ {
+ "Name": "MySampleXssMatchSet",
+ "XssMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ }
+ ]
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example returns an array of up to 100 XSS match sets.",
+ "id": "listxssmatchsets-1474561481168",
+ "title": "To list XSS match sets"
+ }
+ ],
+ "UpdateByteMatchSet": [
+ {
+ "input": {
+ "ByteMatchSetId": "exampleIDs3t-46da-4fdb-b8d5-abc321j569j5",
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "Updates": [
+ {
+ "Action": "DELETE",
+ "ByteMatchTuple": {
+ "FieldToMatch": {
+ "Data": "referer",
+ "Type": "HEADER"
+ },
+ "PositionalConstraint": "CONTAINS",
+ "TargetString": "badrefer1",
+ "TextTransformation": "NONE"
+ }
+ }
+ ]
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a ByteMatchTuple object (filters) in an byte match set with the ID exampleIDs3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "updatebytematchset-1475259074558",
+ "title": "To update a byte match set"
+ }
+ ],
+ "UpdateIPSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "IPSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "Updates": [
+ {
+ "Action": "DELETE",
+ "IPSetDescriptor": {
+ "Type": "IPV4",
+ "Value": "192.0.2.44/32"
+ }
+ }
+ ]
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes an IPSetDescriptor object in an IP match set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "updateipset-1475259733625",
+ "title": "To update an IP set"
+ }
+ ],
+ "UpdateRule": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "RuleId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "Updates": [
+ {
+ "Action": "DELETE",
+ "Predicate": {
+ "DataId": "MyByteMatchSetID",
+ "Negated": false,
+ "Type": "ByteMatch"
+ }
+ }
+ ]
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a Predicate object in a rule with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "updaterule-1475260064720",
+ "title": "To update a rule"
+ }
+ ],
+ "UpdateSizeConstraintSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "SizeConstraintSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "Updates": [
+ {
+ "Action": "DELETE",
+ "SizeConstraint": {
+ "ComparisonOperator": "GT",
+ "FieldToMatch": {
+ "Type": "QUERY_STRING"
+ },
+ "Size": 0,
+ "TextTransformation": "NONE"
+ }
+ }
+ ]
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a SizeConstraint object (filters) in a size constraint set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "updatesizeconstraintset-1475531697891",
+ "title": "To update a size constraint set"
+ }
+ ],
+ "UpdateSqlInjectionMatchSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "SqlInjectionMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5",
+ "Updates": [
+ {
+ "Action": "DELETE",
+ "SqlInjectionMatchTuple": {
+ "FieldToMatch": {
+ "Type": "QUERY_STRING"
+ },
+ "TextTransformation": "URL_DECODE"
+ }
+ }
+ ]
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes a SqlInjectionMatchTuple object (filters) in a SQL injection match set with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "updatesqlinjectionmatchset-1475532094686",
+ "title": "To update a SQL injection match set"
+ }
+ ],
+ "UpdateWebACL": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "DefaultAction": {
+ "Type": "ALLOW"
+ },
+ "Updates": [
+ {
+ "Action": "DELETE",
+ "ActivatedRule": {
+ "Action": {
+ "Type": "ALLOW"
+ },
+ "Priority": 1,
+ "RuleId": "WAFRule-1-Example"
+ }
+ }
+ ],
+ "WebACLId": "webacl-1472061481310"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes an ActivatedRule object in a WebACL with the ID webacl-1472061481310.",
+ "id": "updatewebacl-1475533627385",
+ "title": "To update a Web ACL"
+ }
+ ],
+ "UpdateXssMatchSet": [
+ {
+ "input": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f",
+ "Updates": [
+ {
+ "Action": "DELETE",
+ "XssMatchTuple": {
+ "FieldToMatch": {
+ "Type": "QUERY_STRING"
+ },
+ "TextTransformation": "URL_DECODE"
+ }
+ }
+ ],
+ "XssMatchSetId": "example1ds3t-46da-4fdb-b8d5-abc321j569j5"
+ },
+ "output": {
+ "ChangeToken": "abcd12f2-46da-4fdb-b8d5-fbd4c466928f"
+ },
+ "comments": {
+ "input": {
+ },
+ "output": {
+ }
+ },
+ "description": "The following example deletes an XssMatchTuple object (filters) in an XssMatchSet with the ID example1ds3t-46da-4fdb-b8d5-abc321j569j5.",
+ "id": "updatexssmatchset-1475534098881",
+ "title": "To update an XSS match set"
+ }
+ ]
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/waf/2015-08-24/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/waf/2015-08-24/paginators-1.json
new file mode 100644
index 00000000..9f2eba80
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/waf/2015-08-24/paginators-1.json
@@ -0,0 +1,99 @@
+{
+ "pagination": {
+ "ListByteMatchSets": {
+ "input_token": "NextMarker",
+ "output_token": "NextMarker",
+ "limit_key": "Limit",
+ "result_key": "ByteMatchSets"
+ },
+ "ListIPSets": {
+ "input_token": "NextMarker",
+ "output_token": "NextMarker",
+ "limit_key": "Limit",
+ "result_key": "IPSets"
+ },
+ "ListRules": {
+ "input_token": "NextMarker",
+ "output_token": "NextMarker",
+ "limit_key": "Limit",
+ "result_key": "Rules"
+ },
+ "ListSizeConstraintSets": {
+ "input_token": "NextMarker",
+ "output_token": "NextMarker",
+ "limit_key": "Limit",
+ "result_key": "SizeConstraintSets"
+ },
+ "ListSqlInjectionMatchSets": {
+ "input_token": "NextMarker",
+ "output_token": "NextMarker",
+ "limit_key": "Limit",
+ "result_key": "SqlInjectionMatchSets"
+ },
+ "ListWebACLs": {
+ "input_token": "NextMarker",
+ "output_token": "NextMarker",
+ "limit_key": "Limit",
+ "result_key": "WebACLs"
+ },
+ "ListXssMatchSets": {
+ "input_token": "NextMarker",
+ "output_token": "NextMarker",
+ "limit_key": "Limit",
+ "result_key": "XssMatchSets"
+ },
+ "GetRateBasedRuleManagedKeys": {
+ "input_token": "NextMarker",
+ "output_token": "NextMarker",
+ "result_key": "ManagedKeys"
+ },
+ "ListActivatedRulesInRuleGroup": {
+ "input_token": "NextMarker",
+ "limit_key": "Limit",
+ "output_token": "NextMarker",
+ "result_key": "ActivatedRules"
+ },
+ "ListGeoMatchSets": {
+ "input_token": "NextMarker",
+ "limit_key": "Limit",
+ "output_token": "NextMarker",
+ "result_key": "GeoMatchSets"
+ },
+ "ListLoggingConfigurations": {
+ "input_token": "NextMarker",
+ "limit_key": "Limit",
+ "output_token": "NextMarker",
+ "result_key": "LoggingConfigurations"
+ },
+ "ListRateBasedRules": {
+ "input_token": "NextMarker",
+ "limit_key": "Limit",
+ "output_token": "NextMarker",
+ "result_key": "Rules"
+ },
+ "ListRegexMatchSets": {
+ "input_token": "NextMarker",
+ "limit_key": "Limit",
+ "output_token": "NextMarker",
+ "result_key": "RegexMatchSets"
+ },
+ "ListRegexPatternSets": {
+ "input_token": "NextMarker",
+ "limit_key": "Limit",
+ "output_token": "NextMarker",
+ "result_key": "RegexPatternSets"
+ },
+ "ListRuleGroups": {
+ "input_token": "NextMarker",
+ "limit_key": "Limit",
+ "output_token": "NextMarker",
+ "result_key": "RuleGroups"
+ },
+ "ListSubscribedRuleGroups": {
+ "input_token": "NextMarker",
+ "limit_key": "Limit",
+ "output_token": "NextMarker",
+ "result_key": "RuleGroups"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/waf/2015-08-24/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/waf/2015-08-24/service-2.json.gz
new file mode 100644
index 00000000..357918b1
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/waf/2015-08-24/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/wafv2/2019-07-29/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/wafv2/2019-07-29/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..19ff687e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/wafv2/2019-07-29/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/wafv2/2019-07-29/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/wafv2/2019-07-29/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/wafv2/2019-07-29/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/wafv2/2019-07-29/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/wafv2/2019-07-29/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/wafv2/2019-07-29/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/wafv2/2019-07-29/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/wafv2/2019-07-29/service-2.json.gz
new file mode 100644
index 00000000..72c6157d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/wafv2/2019-07-29/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/wellarchitected/2020-03-31/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/wellarchitected/2020-03-31/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..ab9b6a76
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/wellarchitected/2020-03-31/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/wellarchitected/2020-03-31/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/wellarchitected/2020-03-31/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/wellarchitected/2020-03-31/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/wellarchitected/2020-03-31/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/wellarchitected/2020-03-31/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/wellarchitected/2020-03-31/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/wellarchitected/2020-03-31/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/wellarchitected/2020-03-31/service-2.json.gz
new file mode 100644
index 00000000..2d595373
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/wellarchitected/2020-03-31/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/wisdom/2020-10-19/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/wisdom/2020-10-19/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..872dd90e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/wisdom/2020-10-19/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/wisdom/2020-10-19/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/wisdom/2020-10-19/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/wisdom/2020-10-19/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/wisdom/2020-10-19/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/wisdom/2020-10-19/paginators-1.json
new file mode 100644
index 00000000..60b1dca5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/wisdom/2020-10-19/paginators-1.json
@@ -0,0 +1,64 @@
+{
+ "pagination": {
+ "ListAssistantAssociations": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "assistantAssociationSummaries"
+ },
+ "ListAssistants": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "assistantSummaries"
+ },
+ "ListContents": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "contentSummaries"
+ },
+ "ListKnowledgeBases": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "knowledgeBaseSummaries"
+ },
+ "QueryAssistant": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "results"
+ },
+ "SearchContent": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "contentSummaries"
+ },
+ "SearchSessions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "sessionSummaries"
+ },
+ "ListImportJobs": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "importJobSummaries"
+ },
+ "ListQuickResponses": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "quickResponseSummaries"
+ },
+ "SearchQuickResponses": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "results"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/wisdom/2020-10-19/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/wisdom/2020-10-19/service-2.json.gz
new file mode 100644
index 00000000..97e57983
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/wisdom/2020-10-19/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workdocs/2016-05-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/workdocs/2016-05-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..52886300
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workdocs/2016-05-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workdocs/2016-05-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/workdocs/2016-05-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workdocs/2016-05-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workdocs/2016-05-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/workdocs/2016-05-01/paginators-1.json
new file mode 100644
index 00000000..ff2f410a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workdocs/2016-05-01/paginators-1.json
@@ -0,0 +1,67 @@
+{
+ "pagination": {
+ "DescribeDocumentVersions": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "output_token": "Marker",
+ "result_key": "DocumentVersions"
+ },
+ "DescribeFolderContents": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "output_token": "Marker",
+ "result_key": [
+ "Folders",
+ "Documents"
+ ]
+ },
+ "DescribeUsers": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "output_token": "Marker",
+ "result_key": "Users"
+ },
+ "DescribeActivities": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "output_token": "Marker",
+ "result_key": "UserActivities"
+ },
+ "DescribeComments": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "output_token": "Marker",
+ "result_key": "Comments"
+ },
+ "DescribeGroups": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "output_token": "Marker",
+ "result_key": "Groups"
+ },
+ "DescribeNotificationSubscriptions": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "output_token": "Marker",
+ "result_key": "Subscriptions"
+ },
+ "DescribeResourcePermissions": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "output_token": "Marker",
+ "result_key": "Principals"
+ },
+ "DescribeRootFolders": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "output_token": "Marker",
+ "result_key": "Folders"
+ },
+ "SearchResources": {
+ "input_token": "Marker",
+ "limit_key": "Limit",
+ "output_token": "Marker",
+ "result_key": "Items"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workdocs/2016-05-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/workdocs/2016-05-01/service-2.json.gz
new file mode 100644
index 00000000..630c9d94
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workdocs/2016-05-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workmail/2017-10-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/workmail/2017-10-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..a9e34c96
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workmail/2017-10-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workmail/2017-10-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/workmail/2017-10-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workmail/2017-10-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workmail/2017-10-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/workmail/2017-10-01/paginators-1.json
new file mode 100644
index 00000000..a4d5bd2f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workmail/2017-10-01/paginators-1.json
@@ -0,0 +1,64 @@
+{
+ "pagination": {
+ "ListUsers": {
+ "result_key": "Users",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListGroupMembers": {
+ "result_key": "Members",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListOrganizations": {
+ "result_key": "OrganizationSummaries",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListGroups": {
+ "result_key": "Groups",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListResources": {
+ "result_key": "Resources",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListAliases": {
+ "result_key": "Aliases",
+ "output_token": "NextToken",
+ "input_token": "NextToken",
+ "limit_key": "MaxResults"
+ },
+ "ListMailboxPermissions": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Permissions"
+ },
+ "ListResourceDelegates": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Delegates"
+ },
+ "ListAvailabilityConfigurations": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "AvailabilityConfigurations"
+ },
+ "ListPersonalAccessTokens": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "limit_key": "MaxResults",
+ "result_key": "PersonalAccessTokenSummaries"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workmail/2017-10-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/workmail/2017-10-01/service-2.json.gz
new file mode 100644
index 00000000..12be14f5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workmail/2017-10-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workmailmessageflow/2019-05-01/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/workmailmessageflow/2019-05-01/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..a1befe6b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workmailmessageflow/2019-05-01/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workmailmessageflow/2019-05-01/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/workmailmessageflow/2019-05-01/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workmailmessageflow/2019-05-01/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workmailmessageflow/2019-05-01/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/workmailmessageflow/2019-05-01/paginators-1.json
new file mode 100644
index 00000000..ea142457
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workmailmessageflow/2019-05-01/paginators-1.json
@@ -0,0 +1,3 @@
+{
+ "pagination": {}
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workmailmessageflow/2019-05-01/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/workmailmessageflow/2019-05-01/service-2.json.gz
new file mode 100644
index 00000000..811e63e8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workmailmessageflow/2019-05-01/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workspaces-thin-client/2023-08-22/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/workspaces-thin-client/2023-08-22/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..b49f35f7
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workspaces-thin-client/2023-08-22/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workspaces-thin-client/2023-08-22/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/workspaces-thin-client/2023-08-22/paginators-1.json
new file mode 100644
index 00000000..9fe21a48
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workspaces-thin-client/2023-08-22/paginators-1.json
@@ -0,0 +1,22 @@
+{
+ "pagination": {
+ "ListDevices": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "devices"
+ },
+ "ListEnvironments": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "environments"
+ },
+ "ListSoftwareSets": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "softwareSets"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workspaces-thin-client/2023-08-22/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/workspaces-thin-client/2023-08-22/service-2.json.gz
new file mode 100644
index 00000000..4ec6e78d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workspaces-thin-client/2023-08-22/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workspaces-web/2020-07-08/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/workspaces-web/2020-07-08/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..1ba47809
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workspaces-web/2020-07-08/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workspaces-web/2020-07-08/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/workspaces-web/2020-07-08/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workspaces-web/2020-07-08/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workspaces-web/2020-07-08/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/workspaces-web/2020-07-08/paginators-1.json
new file mode 100644
index 00000000..73743e34
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workspaces-web/2020-07-08/paginators-1.json
@@ -0,0 +1,16 @@
+{
+ "pagination": {
+ "ListSessions": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "sessions"
+ },
+ "ListDataProtectionSettings": {
+ "input_token": "nextToken",
+ "output_token": "nextToken",
+ "limit_key": "maxResults",
+ "result_key": "dataProtectionSettings"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workspaces-web/2020-07-08/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/workspaces-web/2020-07-08/service-2.json.gz
new file mode 100644
index 00000000..a0d7070b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workspaces-web/2020-07-08/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workspaces/2015-04-08/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/workspaces/2015-04-08/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..ea3c68ea
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workspaces/2015-04-08/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workspaces/2015-04-08/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/workspaces/2015-04-08/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workspaces/2015-04-08/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workspaces/2015-04-08/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/workspaces/2015-04-08/paginators-1.json
new file mode 100644
index 00000000..01176ffb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workspaces/2015-04-08/paginators-1.json
@@ -0,0 +1,54 @@
+{
+ "pagination": {
+ "DescribeWorkspaceBundles": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Bundles"
+ },
+ "DescribeWorkspaceDirectories": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Directories"
+ },
+ "DescribeWorkspaces": {
+ "limit_key": "Limit",
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Workspaces"
+ },
+ "DescribeAccountModifications": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "AccountModifications"
+ },
+ "DescribeIpGroups": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Result"
+ },
+ "DescribeWorkspaceImages": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "Images"
+ },
+ "DescribeWorkspacesConnectionStatus": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "WorkspacesConnectionStatus"
+ },
+ "ListAvailableManagementCidrRanges": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "ManagementCidrRanges"
+ },
+ "ListAccountLinks": {
+ "input_token": "NextToken",
+ "limit_key": "MaxResults",
+ "output_token": "NextToken",
+ "result_key": "AccountLinks"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/workspaces/2015-04-08/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/workspaces/2015-04-08/service-2.json.gz
new file mode 100644
index 00000000..542ce1b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/workspaces/2015-04-08/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/xray/2016-04-12/endpoint-rule-set-1.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/xray/2016-04-12/endpoint-rule-set-1.json.gz
new file mode 100644
index 00000000..251db98c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/xray/2016-04-12/endpoint-rule-set-1.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/xray/2016-04-12/examples-1.json b/.venv/lib/python3.12/site-packages/botocore/data/xray/2016-04-12/examples-1.json
new file mode 100644
index 00000000..0ea7e3b0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/xray/2016-04-12/examples-1.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "examples": {
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/xray/2016-04-12/paginators-1.json b/.venv/lib/python3.12/site-packages/botocore/data/xray/2016-04-12/paginators-1.json
new file mode 100644
index 00000000..0f65898f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/xray/2016-04-12/paginators-1.json
@@ -0,0 +1,69 @@
+{
+ "pagination": {
+ "BatchGetTraces": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Traces",
+ "non_aggregate_keys": [
+ "UnprocessedTraceIds"
+ ]
+ },
+ "GetServiceGraph": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Services",
+ "non_aggregate_keys": [
+ "StartTime",
+ "EndTime",
+ "ContainsOldGroupVersions"
+ ]
+ },
+ "GetTraceGraph": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Services"
+ },
+ "GetTraceSummaries": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "TraceSummaries",
+ "non_aggregate_keys": [
+ "TracesProcessedCount",
+ "ApproximateTime"
+ ]
+ },
+ "GetGroups": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Groups"
+ },
+ "GetSamplingRules": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "SamplingRuleRecords"
+ },
+ "GetSamplingStatisticSummaries": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "SamplingStatisticSummaries"
+ },
+ "GetTimeSeriesServiceStatistics": {
+ "input_token": "NextToken",
+ "non_aggregate_keys": [
+ "ContainsOldGroupVersions"
+ ],
+ "output_token": "NextToken",
+ "result_key": "TimeSeriesServiceStatistics"
+ },
+ "ListResourcePolicies": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "ResourcePolicies"
+ },
+ "ListTagsForResource": {
+ "input_token": "NextToken",
+ "output_token": "NextToken",
+ "result_key": "Tags"
+ }
+ }
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/data/xray/2016-04-12/service-2.json.gz b/.venv/lib/python3.12/site-packages/botocore/data/xray/2016-04-12/service-2.json.gz
new file mode 100644
index 00000000..0701492c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/data/xray/2016-04-12/service-2.json.gz
Binary files differ
diff --git a/.venv/lib/python3.12/site-packages/botocore/discovery.py b/.venv/lib/python3.12/site-packages/botocore/discovery.py
new file mode 100644
index 00000000..95b51b81
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/discovery.py
@@ -0,0 +1,281 @@
+# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import logging
+import time
+import weakref
+
+from botocore import xform_name
+from botocore.exceptions import BotoCoreError, ConnectionError, HTTPClientError
+from botocore.model import OperationNotFoundError
+from botocore.utils import CachedProperty
+
+logger = logging.getLogger(__name__)
+
+
+class EndpointDiscoveryException(BotoCoreError):
+ pass
+
+
+class EndpointDiscoveryRequired(EndpointDiscoveryException):
+ """Endpoint Discovery is disabled but is required for this operation."""
+
+ fmt = 'Endpoint Discovery is not enabled but this operation requires it.'
+
+
+class EndpointDiscoveryRefreshFailed(EndpointDiscoveryException):
+ """Endpoint Discovery failed to the refresh the known endpoints."""
+
+ fmt = 'Endpoint Discovery failed to refresh the required endpoints.'
+
+
+def block_endpoint_discovery_required_operations(model, **kwargs):
+ endpoint_discovery = model.endpoint_discovery
+ if endpoint_discovery and endpoint_discovery.get('required'):
+ raise EndpointDiscoveryRequired()
+
+
+class EndpointDiscoveryModel:
+ def __init__(self, service_model):
+ self._service_model = service_model
+
+ @CachedProperty
+ def discovery_operation_name(self):
+ discovery_operation = self._service_model.endpoint_discovery_operation
+ return xform_name(discovery_operation.name)
+
+ @CachedProperty
+ def discovery_operation_keys(self):
+ discovery_operation = self._service_model.endpoint_discovery_operation
+ keys = []
+ if discovery_operation.input_shape:
+ keys = list(discovery_operation.input_shape.members.keys())
+ return keys
+
+ def discovery_required_for(self, operation_name):
+ try:
+ operation_model = self._service_model.operation_model(
+ operation_name
+ )
+ return operation_model.endpoint_discovery.get('required', False)
+ except OperationNotFoundError:
+ return False
+
+ def discovery_operation_kwargs(self, **kwargs):
+ input_keys = self.discovery_operation_keys
+ # Operation and Identifiers are only sent if there are Identifiers
+ if not kwargs.get('Identifiers'):
+ kwargs.pop('Operation', None)
+ kwargs.pop('Identifiers', None)
+ return {k: v for k, v in kwargs.items() if k in input_keys}
+
+ def gather_identifiers(self, operation, params):
+ return self._gather_ids(operation.input_shape, params)
+
+ def _gather_ids(self, shape, params, ids=None):
+ # Traverse the input shape and corresponding parameters, gathering
+ # any input fields labeled as an endpoint discovery id
+ if ids is None:
+ ids = {}
+ for member_name, member_shape in shape.members.items():
+ if member_shape.metadata.get('endpointdiscoveryid'):
+ ids[member_name] = params[member_name]
+ elif (
+ member_shape.type_name == 'structure' and member_name in params
+ ):
+ self._gather_ids(member_shape, params[member_name], ids)
+ return ids
+
+
+class EndpointDiscoveryManager:
+ def __init__(
+ self, client, cache=None, current_time=None, always_discover=True
+ ):
+ if cache is None:
+ cache = {}
+ self._cache = cache
+ self._failed_attempts = {}
+ if current_time is None:
+ current_time = time.time
+ self._time = current_time
+ self._always_discover = always_discover
+
+ # This needs to be a weak ref in order to prevent memory leaks on
+ # python 2.6
+ self._client = weakref.proxy(client)
+ self._model = EndpointDiscoveryModel(client.meta.service_model)
+
+ def _parse_endpoints(self, response):
+ endpoints = response['Endpoints']
+ current_time = self._time()
+ for endpoint in endpoints:
+ cache_time = endpoint.get('CachePeriodInMinutes')
+ endpoint['Expiration'] = current_time + cache_time * 60
+ return endpoints
+
+ def _cache_item(self, value):
+ if isinstance(value, dict):
+ return tuple(sorted(value.items()))
+ else:
+ return value
+
+ def _create_cache_key(self, **kwargs):
+ kwargs = self._model.discovery_operation_kwargs(**kwargs)
+ return tuple(self._cache_item(v) for k, v in sorted(kwargs.items()))
+
+ def gather_identifiers(self, operation, params):
+ return self._model.gather_identifiers(operation, params)
+
+ def delete_endpoints(self, **kwargs):
+ cache_key = self._create_cache_key(**kwargs)
+ if cache_key in self._cache:
+ del self._cache[cache_key]
+
+ def _describe_endpoints(self, **kwargs):
+ # This is effectively a proxy to whatever name/kwargs the service
+ # supports for endpoint discovery.
+ kwargs = self._model.discovery_operation_kwargs(**kwargs)
+ operation_name = self._model.discovery_operation_name
+ discovery_operation = getattr(self._client, operation_name)
+ logger.debug('Discovering endpoints with kwargs: %s', kwargs)
+ return discovery_operation(**kwargs)
+
+ def _get_current_endpoints(self, key):
+ if key not in self._cache:
+ return None
+ now = self._time()
+ return [e for e in self._cache[key] if now < e['Expiration']]
+
+ def _refresh_current_endpoints(self, **kwargs):
+ cache_key = self._create_cache_key(**kwargs)
+ try:
+ response = self._describe_endpoints(**kwargs)
+ endpoints = self._parse_endpoints(response)
+ self._cache[cache_key] = endpoints
+ self._failed_attempts.pop(cache_key, None)
+ return endpoints
+ except (ConnectionError, HTTPClientError):
+ self._failed_attempts[cache_key] = self._time() + 60
+ return None
+
+ def _recently_failed(self, cache_key):
+ if cache_key in self._failed_attempts:
+ now = self._time()
+ if now < self._failed_attempts[cache_key]:
+ return True
+ del self._failed_attempts[cache_key]
+ return False
+
+ def _select_endpoint(self, endpoints):
+ return endpoints[0]['Address']
+
+ def describe_endpoint(self, **kwargs):
+ operation = kwargs['Operation']
+ discovery_required = self._model.discovery_required_for(operation)
+
+ if not self._always_discover and not discovery_required:
+ # Discovery set to only run on required operations
+ logger.debug(
+ f'Optional discovery disabled. Skipping discovery for Operation: {operation}'
+ )
+ return None
+
+ # Get the endpoint for the provided operation and identifiers
+ cache_key = self._create_cache_key(**kwargs)
+ endpoints = self._get_current_endpoints(cache_key)
+ if endpoints:
+ return self._select_endpoint(endpoints)
+ # All known endpoints are stale
+ recently_failed = self._recently_failed(cache_key)
+ if not recently_failed:
+ # We haven't failed to discover recently, go ahead and refresh
+ endpoints = self._refresh_current_endpoints(**kwargs)
+ if endpoints:
+ return self._select_endpoint(endpoints)
+ # Discovery has failed recently, do our best to get an endpoint
+ logger.debug('Endpoint Discovery has failed for: %s', kwargs)
+ stale_entries = self._cache.get(cache_key, None)
+ if stale_entries:
+ # We have stale entries, use those while discovery is failing
+ return self._select_endpoint(stale_entries)
+ if discovery_required:
+ # It looks strange to be checking recently_failed again but,
+ # this informs us as to whether or not we tried to refresh earlier
+ if recently_failed:
+ # Discovery is required and we haven't already refreshed
+ endpoints = self._refresh_current_endpoints(**kwargs)
+ if endpoints:
+ return self._select_endpoint(endpoints)
+ # No endpoints even refresh, raise hard error
+ raise EndpointDiscoveryRefreshFailed()
+ # Discovery is optional, just use the default endpoint for now
+ return None
+
+
+class EndpointDiscoveryHandler:
+ def __init__(self, manager):
+ self._manager = manager
+
+ def register(self, events, service_id):
+ events.register(
+ f'before-parameter-build.{service_id}', self.gather_identifiers
+ )
+ events.register_first(
+ f'request-created.{service_id}', self.discover_endpoint
+ )
+ events.register(f'needs-retry.{service_id}', self.handle_retries)
+
+ def gather_identifiers(self, params, model, context, **kwargs):
+ endpoint_discovery = model.endpoint_discovery
+ # Only continue if the operation supports endpoint discovery
+ if endpoint_discovery is None:
+ return
+ ids = self._manager.gather_identifiers(model, params)
+ context['discovery'] = {'identifiers': ids}
+
+ def discover_endpoint(self, request, operation_name, **kwargs):
+ ids = request.context.get('discovery', {}).get('identifiers')
+ if ids is None:
+ return
+ endpoint = self._manager.describe_endpoint(
+ Operation=operation_name, Identifiers=ids
+ )
+ if endpoint is None:
+ logger.debug('Failed to discover and inject endpoint')
+ return
+ if not endpoint.startswith('http'):
+ endpoint = 'https://' + endpoint
+ logger.debug('Injecting discovered endpoint: %s', endpoint)
+ request.url = endpoint
+
+ def handle_retries(self, request_dict, response, operation, **kwargs):
+ if response is None:
+ return None
+
+ _, response = response
+ status = response.get('ResponseMetadata', {}).get('HTTPStatusCode')
+ error_code = response.get('Error', {}).get('Code')
+ if status != 421 and error_code != 'InvalidEndpointException':
+ return None
+
+ context = request_dict.get('context', {})
+ ids = context.get('discovery', {}).get('identifiers')
+ if ids is None:
+ return None
+
+ # Delete the cached endpoints, forcing a refresh on retry
+ # TODO: Improve eviction behavior to only evict the bad endpoint if
+ # there are multiple. This will almost certainly require a lock.
+ self._manager.delete_endpoints(
+ Operation=operation.name, Identifiers=ids
+ )
+ return 0
diff --git a/.venv/lib/python3.12/site-packages/botocore/docs/__init__.py b/.venv/lib/python3.12/site-packages/botocore/docs/__init__.py
new file mode 100644
index 00000000..844f5de5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/docs/__init__.py
@@ -0,0 +1,54 @@
+# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import os
+
+from botocore.docs.service import ServiceDocumenter
+
+DEPRECATED_SERVICE_NAMES = {'sms-voice'}
+
+
+def generate_docs(root_dir, session):
+ """Generates the reference documentation for botocore
+
+ This will go through every available AWS service and output ReSTructured
+ text files documenting each service.
+
+ :param root_dir: The directory to write the reference files to. Each
+ service's reference documentation is loacated at
+ root_dir/reference/services/service-name.rst
+ """
+ # Create the root directory where all service docs live.
+ services_dir_path = os.path.join(root_dir, 'reference', 'services')
+ if not os.path.exists(services_dir_path):
+ os.makedirs(services_dir_path)
+
+ # Prevents deprecated service names from being generated in docs.
+ available_services = [
+ service
+ for service in session.get_available_services()
+ if service not in DEPRECATED_SERVICE_NAMES
+ ]
+
+ # Generate reference docs and write them out.
+ for service_name in available_services:
+ docs = ServiceDocumenter(
+ service_name, session, services_dir_path
+ ).document_service()
+
+ # Write the main service documentation page.
+ # Path: <root>/reference/services/<service>/index.rst
+ service_file_path = os.path.join(
+ services_dir_path, f'{service_name}.rst'
+ )
+ with open(service_file_path, 'wb') as f:
+ f.write(docs)
diff --git a/.venv/lib/python3.12/site-packages/botocore/docs/bcdoc/__init__.py b/.venv/lib/python3.12/site-packages/botocore/docs/bcdoc/__init__.py
new file mode 100644
index 00000000..b687f69d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/docs/bcdoc/__init__.py
@@ -0,0 +1,13 @@
+# Copyright 2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+__version__ = '0.16.0'
diff --git a/.venv/lib/python3.12/site-packages/botocore/docs/bcdoc/docstringparser.py b/.venv/lib/python3.12/site-packages/botocore/docs/bcdoc/docstringparser.py
new file mode 100644
index 00000000..ebe16ba5
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/docs/bcdoc/docstringparser.py
@@ -0,0 +1,315 @@
+# Copyright 2012-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+from html.parser import HTMLParser
+from itertools import zip_longest
+
+PRIORITY_PARENT_TAGS = ('code', 'a')
+OMIT_NESTED_TAGS = ('span', 'i', 'code', 'a')
+OMIT_SELF_TAGS = ('i', 'b')
+HTML_BLOCK_DISPLAY_TAGS = ('p', 'note', 'ul', 'li')
+
+
+class DocStringParser(HTMLParser):
+ """
+ A simple HTML parser. Focused on converting the subset of HTML
+ that appears in the documentation strings of the JSON models into
+ simple ReST format.
+ """
+
+ def __init__(self, doc):
+ self.tree = None
+ self.doc = doc
+ super().__init__()
+
+ def reset(self):
+ HTMLParser.reset(self)
+ self.tree = HTMLTree(self.doc)
+
+ def feed(self, data):
+ super().feed(data)
+ self.tree.write()
+ self.tree = HTMLTree(self.doc)
+
+ def close(self):
+ super().close()
+ # Write if there is anything remaining.
+ self.tree.write()
+ self.tree = HTMLTree(self.doc)
+
+ def handle_starttag(self, tag, attrs):
+ self.tree.add_tag(tag, attrs=attrs)
+
+ def handle_endtag(self, tag):
+ self.tree.add_tag(tag, is_start=False)
+
+ def handle_data(self, data):
+ self.tree.add_data(data)
+
+
+class HTMLTree:
+ """
+ A tree which handles HTML nodes. Designed to work with a python HTML parser,
+ meaning that the current_node will be the most recently opened tag. When
+ a tag is closed, the current_node moves up to the parent node.
+ """
+
+ def __init__(self, doc):
+ self.doc = doc
+ self.head = StemNode()
+ self.current_node = self.head
+ self.unhandled_tags = []
+
+ def add_tag(self, tag, attrs=None, is_start=True):
+ if not self._doc_has_handler(tag, is_start):
+ self.unhandled_tags.append(tag)
+ return
+
+ if is_start:
+ node = TagNode(tag, attrs)
+ self.current_node.add_child(node)
+ self.current_node = node
+ else:
+ self.current_node = self.current_node.parent
+
+ def _doc_has_handler(self, tag, is_start):
+ if is_start:
+ handler_name = f'start_{tag}'
+ else:
+ handler_name = f'end_{tag}'
+
+ return hasattr(self.doc.style, handler_name)
+
+ def add_data(self, data):
+ self.current_node.add_child(DataNode(data))
+
+ def write(self):
+ self.head.write(self.doc)
+
+
+class Node:
+ def __init__(self, parent=None):
+ self.parent = parent
+
+ def write(self, doc):
+ raise NotImplementedError
+
+
+class StemNode(Node):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.children = []
+
+ def add_child(self, child):
+ child.parent = self
+ self.children.append(child)
+
+ def write(self, doc):
+ self.collapse_whitespace()
+ self._write_children(doc)
+
+ def _write_children(self, doc):
+ for child, next_child in zip_longest(self.children, self.children[1:]):
+ if isinstance(child, TagNode) and next_child is not None:
+ child.write(doc, next_child)
+ else:
+ child.write(doc)
+
+ def is_whitespace(self):
+ return all(child.is_whitespace() for child in self.children)
+
+ def startswith_whitespace(self):
+ return self.children and self.children[0].startswith_whitespace()
+
+ def endswith_whitespace(self):
+ return self.children and self.children[-1].endswith_whitespace()
+
+ def lstrip(self):
+ while self.children and self.children[0].is_whitespace():
+ self.children = self.children[1:]
+ if self.children:
+ self.children[0].lstrip()
+
+ def rstrip(self):
+ while self.children and self.children[-1].is_whitespace():
+ self.children = self.children[:-1]
+ if self.children:
+ self.children[-1].rstrip()
+
+ def collapse_whitespace(self):
+ """Remove collapsible white-space from HTML.
+
+ HTML in docstrings often contains extraneous white-space around tags,
+ for readability. Browsers would collapse this white-space before
+ rendering. If not removed before conversion to RST where white-space is
+ part of the syntax, for example for indentation, it can result in
+ incorrect output.
+ """
+ self.lstrip()
+ self.rstrip()
+ for child in self.children:
+ child.collapse_whitespace()
+
+
+class TagNode(StemNode):
+ """
+ A generic Tag node. It will verify that handlers exist before writing.
+ """
+
+ def __init__(self, tag, attrs=None, parent=None):
+ super().__init__(parent)
+ self.attrs = attrs
+ self.tag = tag
+
+ def _has_nested_tags(self):
+ # Returns True if any children are TagNodes and False otherwise.
+ return any(isinstance(child, TagNode) for child in self.children)
+
+ def write(self, doc, next_child=None):
+ prioritize_nested_tags = (
+ self.tag in OMIT_SELF_TAGS and self._has_nested_tags()
+ )
+ prioritize_parent_tag = (
+ isinstance(self.parent, TagNode)
+ and self.parent.tag in PRIORITY_PARENT_TAGS
+ and self.tag in OMIT_NESTED_TAGS
+ )
+ if prioritize_nested_tags or prioritize_parent_tag:
+ self._write_children(doc)
+ return
+
+ self._write_start(doc)
+ self._write_children(doc)
+ self._write_end(doc, next_child)
+
+ def collapse_whitespace(self):
+ """Remove collapsible white-space.
+
+ All tags collapse internal whitespace. Block-display HTML tags also
+ strip all leading and trailing whitespace.
+
+ Approximately follows the specification used in browsers:
+ https://www.w3.org/TR/css-text-3/#white-space-rules
+ https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Whitespace
+ """
+ if self.tag in HTML_BLOCK_DISPLAY_TAGS:
+ self.lstrip()
+ self.rstrip()
+ # Collapse whitespace in situations like ``</b> <i> foo</i>`` into
+ # ``</b><i> foo</i>``.
+ for prev, cur in zip(self.children[:-1], self.children[1:]):
+ if (
+ isinstance(prev, DataNode)
+ and prev.endswith_whitespace()
+ and cur.startswith_whitespace()
+ ):
+ cur.lstrip()
+ # Same logic, but for situations like ``<b>bar </b> <i>``:
+ for cur, nxt in zip(self.children[:-1], self.children[1:]):
+ if (
+ isinstance(nxt, DataNode)
+ and cur.endswith_whitespace()
+ and nxt.startswith_whitespace()
+ ):
+ cur.rstrip()
+ # Recurse into children
+ for child in self.children:
+ child.collapse_whitespace()
+
+ def _write_start(self, doc):
+ handler_name = f'start_{self.tag}'
+ if hasattr(doc.style, handler_name):
+ getattr(doc.style, handler_name)(self.attrs)
+
+ def _write_end(self, doc, next_child):
+ handler_name = f'end_{self.tag}'
+ if hasattr(doc.style, handler_name):
+ if handler_name == 'end_a':
+ # We use lookahead to determine if a space is needed after a link node
+ getattr(doc.style, handler_name)(next_child)
+ else:
+ getattr(doc.style, handler_name)()
+
+
+class DataNode(Node):
+ """
+ A Node that contains only string data.
+ """
+
+ def __init__(self, data, parent=None):
+ super().__init__(parent)
+ if not isinstance(data, str):
+ raise ValueError(f"Expecting string type, {type(data)} given.")
+ self._leading_whitespace = ''
+ self._trailing_whitespace = ''
+ self._stripped_data = ''
+ if data == '':
+ return
+ if data.isspace():
+ self._trailing_whitespace = data
+ return
+ first_non_space = next(
+ idx for idx, ch in enumerate(data) if not ch.isspace()
+ )
+ last_non_space = len(data) - next(
+ idx for idx, ch in enumerate(reversed(data)) if not ch.isspace()
+ )
+ self._leading_whitespace = data[:first_non_space]
+ self._trailing_whitespace = data[last_non_space:]
+ self._stripped_data = data[first_non_space:last_non_space]
+
+ @property
+ def data(self):
+ return (
+ f'{self._leading_whitespace}{self._stripped_data}'
+ f'{self._trailing_whitespace}'
+ )
+
+ def is_whitespace(self):
+ return self._stripped_data == '' and (
+ self._leading_whitespace != '' or self._trailing_whitespace != ''
+ )
+
+ def startswith_whitespace(self):
+ return self._leading_whitespace != '' or (
+ self._stripped_data == '' and self._trailing_whitespace != ''
+ )
+
+ def endswith_whitespace(self):
+ return self._trailing_whitespace != '' or (
+ self._stripped_data == '' and self._leading_whitespace != ''
+ )
+
+ def lstrip(self):
+ if self._leading_whitespace != '':
+ self._leading_whitespace = ''
+ elif self._stripped_data == '':
+ self.rstrip()
+
+ def rstrip(self):
+ if self._trailing_whitespace != '':
+ self._trailing_whitespace = ''
+ elif self._stripped_data == '':
+ self.lstrip()
+
+ def collapse_whitespace(self):
+ """Noop, ``DataNode.write`` always collapses whitespace"""
+ return
+
+ def write(self, doc):
+ words = doc.translate_words(self._stripped_data.split())
+ str_data = (
+ f'{self._leading_whitespace}{" ".join(words)}'
+ f'{self._trailing_whitespace}'
+ )
+ if str_data != '':
+ doc.handle_data(str_data)
diff --git a/.venv/lib/python3.12/site-packages/botocore/docs/bcdoc/restdoc.py b/.venv/lib/python3.12/site-packages/botocore/docs/bcdoc/restdoc.py
new file mode 100644
index 00000000..3868126c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/docs/bcdoc/restdoc.py
@@ -0,0 +1,285 @@
+# Copyright 2012-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import logging
+import os
+import re
+
+from botocore.compat import OrderedDict
+from botocore.docs.bcdoc.docstringparser import DocStringParser
+from botocore.docs.bcdoc.style import ReSTStyle
+
+DEFAULT_AWS_DOCS_LINK = 'https://docs.aws.amazon.com/index.html'
+DOCUMENTATION_LINK_REGEX = re.compile(
+ r'`AWS API Documentation '
+ r'<https://docs.aws.amazon.com/goto/WebAPI/[a-z0-9-.]*/[a-zA-Z]*>`_'
+)
+LARGE_SECTION_MESSAGE = """
+
+ **{}**
+ ::
+
+ # This section is too large to render.
+ # Please see the AWS API Documentation linked below.
+
+ {}
+ """
+LOG = logging.getLogger('bcdocs')
+SECTION_LINE_LIMIT_CONFIG = {
+ 'response-example': {'name': 'Response Syntax', 'line_limit': 1500},
+ 'description': {'name': 'Response Structure', 'line_limit': 5000},
+ 'request-example': {'name': 'Request Syntax', 'line_limit': 1500},
+ 'request-params': {'name': 'Parameters', 'line_limit': 5000},
+}
+SECTION_METHOD_PATH_DEPTH = {
+ 'client-api': 4,
+ 'paginator-api': 3,
+ 'waiter-api': 3,
+}
+
+
+class ReSTDocument:
+ def __init__(self, target='man'):
+ self.style = ReSTStyle(self)
+ self.target = target
+ self.parser = DocStringParser(self)
+ self.keep_data = True
+ self.do_translation = False
+ self.translation_map = {}
+ self.hrefs = {}
+ self._writes = []
+ self._last_doc_string = None
+
+ def _write(self, s):
+ if self.keep_data and s is not None:
+ self._writes.append(s)
+
+ def write(self, content):
+ """
+ Write content into the document.
+ """
+ self._write(content)
+
+ def writeln(self, content):
+ """
+ Write content on a newline.
+ """
+ self._write(f'{self.style.spaces()}{content}\n')
+
+ def peek_write(self):
+ """
+ Returns the last content written to the document without
+ removing it from the stack.
+ """
+ return self._writes[-1]
+
+ def pop_write(self):
+ """
+ Removes and returns the last content written to the stack.
+ """
+ return self._writes.pop() if len(self._writes) > 0 else None
+
+ def push_write(self, s):
+ """
+ Places new content on the stack.
+ """
+ self._writes.append(s)
+
+ def getvalue(self):
+ """
+ Returns the current content of the document as a string.
+ """
+ if self.hrefs:
+ self.style.new_paragraph()
+ for refname, link in self.hrefs.items():
+ self.style.link_target_definition(refname, link)
+ return ''.join(self._writes).encode('utf-8')
+
+ def translate_words(self, words):
+ return [self.translation_map.get(w, w) for w in words]
+
+ def handle_data(self, data):
+ if data and self.keep_data:
+ self._write(data)
+
+ def include_doc_string(self, doc_string):
+ if doc_string:
+ try:
+ start = len(self._writes)
+ self.parser.feed(doc_string)
+ self.parser.close()
+ end = len(self._writes)
+ self._last_doc_string = (start, end)
+ except Exception:
+ LOG.debug('Error parsing doc string', exc_info=True)
+ LOG.debug(doc_string)
+
+ def remove_last_doc_string(self):
+ # Removes all writes inserted by last doc string
+ if self._last_doc_string is not None:
+ start, end = self._last_doc_string
+ del self._writes[start:end]
+
+
+class DocumentStructure(ReSTDocument):
+ def __init__(self, name, section_names=None, target='man', context=None):
+ """Provides a Hierarichial structure to a ReSTDocument
+
+ You can write to it similiar to as you can to a ReSTDocument but
+ has an innate structure for more orginaztion and abstraction.
+
+ :param name: The name of the document
+ :param section_names: A list of sections to be included
+ in the document.
+ :param target: The target documentation of the Document structure
+ :param context: A dictionary of data to store with the strucuture. These
+ are only stored per section not the entire structure.
+ """
+ super().__init__(target=target)
+ self._name = name
+ self._structure = OrderedDict()
+ self._path = [self._name]
+ self._context = {}
+ if context is not None:
+ self._context = context
+ if section_names is not None:
+ self._generate_structure(section_names)
+
+ @property
+ def name(self):
+ """The name of the document structure"""
+ return self._name
+
+ @property
+ def path(self):
+ """
+ A list of where to find a particular document structure in the
+ overlying document structure.
+ """
+ return self._path
+
+ @path.setter
+ def path(self, value):
+ self._path = value
+
+ @property
+ def available_sections(self):
+ return list(self._structure)
+
+ @property
+ def context(self):
+ return self._context
+
+ def _generate_structure(self, section_names):
+ for section_name in section_names:
+ self.add_new_section(section_name)
+
+ def add_new_section(self, name, context=None):
+ """Adds a new section to the current document structure
+
+ This document structure will be considered a section to the
+ current document structure but will in itself be an entirely
+ new document structure that can be written to and have sections
+ as well
+
+ :param name: The name of the section.
+ :param context: A dictionary of data to store with the strucuture. These
+ are only stored per section not the entire structure.
+ :rtype: DocumentStructure
+ :returns: A new document structure to add to but lives as a section
+ to the document structure it was instantiated from.
+ """
+ # Add a new section
+ section = self.__class__(
+ name=name, target=self.target, context=context
+ )
+ section.path = self.path + [name]
+ # Indent the section apporpriately as well
+ section.style.indentation = self.style.indentation
+ section.translation_map = self.translation_map
+ section.hrefs = self.hrefs
+ self._structure[name] = section
+ return section
+
+ def get_section(self, name):
+ """Retrieve a section"""
+ return self._structure[name]
+
+ def has_section(self, name):
+ return name in self._structure
+
+ def delete_section(self, name):
+ """Delete a section"""
+ del self._structure[name]
+
+ def flush_structure(self, docs_link=None):
+ """Flushes a doc structure to a ReSTructed string
+
+ The document is flushed out in a DFS style where sections and their
+ subsections' values are added to the string as they are visited.
+ """
+ # We are at the root flush the links at the beginning of the
+ # document
+ path_length = len(self.path)
+ if path_length == 1:
+ if self.hrefs:
+ self.style.new_paragraph()
+ for refname, link in self.hrefs.items():
+ self.style.link_target_definition(refname, link)
+ # Clear docs_link at the correct depth to prevent passing a non-related link.
+ elif path_length == SECTION_METHOD_PATH_DEPTH.get(self.path[1]):
+ docs_link = None
+ value = self.getvalue()
+ for name, section in self._structure.items():
+ # Checks is the AWS API Documentation link has been generated.
+ # If it has been generated, it gets passed as a the doc_link parameter.
+ match = DOCUMENTATION_LINK_REGEX.search(value.decode())
+ docs_link = (
+ f'{match.group(0)}\n\n'.encode() if match else docs_link
+ )
+ value += section.flush_structure(docs_link)
+
+ # Replace response/request sections if the line number exceeds our limit.
+ # The section is replaced with a message linking to AWS API Documentation.
+ line_count = len(value.splitlines())
+ section_config = SECTION_LINE_LIMIT_CONFIG.get(self.name)
+ aws_docs_link = (
+ docs_link.decode()
+ if docs_link is not None
+ else DEFAULT_AWS_DOCS_LINK
+ )
+ if section_config and line_count > section_config['line_limit']:
+ value = LARGE_SECTION_MESSAGE.format(
+ section_config['name'], aws_docs_link
+ ).encode()
+ return value
+
+ def getvalue(self):
+ return ''.join(self._writes).encode('utf-8')
+
+ def remove_all_sections(self):
+ self._structure = OrderedDict()
+
+ def clear_text(self):
+ self._writes = []
+
+ def add_title_section(self, title):
+ title_section = self.add_new_section('title')
+ title_section.style.h1(title)
+ return title_section
+
+ def write_to_file(self, full_path, file_name):
+ if not os.path.exists(full_path):
+ os.makedirs(full_path)
+ sub_resource_file_path = os.path.join(full_path, f'{file_name}.rst')
+ with open(sub_resource_file_path, 'wb') as f:
+ f.write(self.flush_structure())
diff --git a/.venv/lib/python3.12/site-packages/botocore/docs/bcdoc/style.py b/.venv/lib/python3.12/site-packages/botocore/docs/bcdoc/style.py
new file mode 100644
index 00000000..205d238d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/docs/bcdoc/style.py
@@ -0,0 +1,447 @@
+# Copyright 2012-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+
+import logging
+
+logger = logging.getLogger('bcdocs')
+# Terminal punctuation where a space is not needed before.
+PUNCTUATION_CHARACTERS = ('.', ',', '?', '!', ':', ';')
+
+
+class BaseStyle:
+ def __init__(self, doc, indent_width=2):
+ self.doc = doc
+ self.indent_width = indent_width
+ self._indent = 0
+ self.keep_data = True
+
+ @property
+ def indentation(self):
+ return self._indent
+
+ @indentation.setter
+ def indentation(self, value):
+ self._indent = value
+
+ def new_paragraph(self):
+ return f'\n{self.spaces()}'
+
+ def indent(self):
+ self._indent += 1
+
+ def dedent(self):
+ if self._indent > 0:
+ self._indent -= 1
+
+ def spaces(self):
+ return ' ' * (self._indent * self.indent_width)
+
+ def bold(self, s):
+ return s
+
+ def ref(self, link, title=None):
+ return link
+
+ def h2(self, s):
+ return s
+
+ def h3(self, s):
+ return s
+
+ def underline(self, s):
+ return s
+
+ def italics(self, s):
+ return s
+
+ def add_trailing_space_to_previous_write(self):
+ # Adds a trailing space if none exists. This is mainly used for
+ # ensuring inline code and links are separated from surrounding text.
+ last_write = self.doc.pop_write()
+ if last_write is None:
+ last_write = ''
+ if last_write != '' and last_write[-1] != ' ':
+ last_write += ' '
+ self.doc.push_write(last_write)
+
+
+class ReSTStyle(BaseStyle):
+ def __init__(self, doc, indent_width=2):
+ BaseStyle.__init__(self, doc, indent_width)
+ self.do_p = True
+ self.a_href = None
+ self.list_depth = 0
+
+ def new_paragraph(self):
+ self.doc.write(f'\n\n{self.spaces()}')
+
+ def new_line(self):
+ self.doc.write(f'\n{self.spaces()}')
+
+ def _start_inline(self, markup):
+ # Insert space between any directly adjacent bold and italic inlines to
+ # avoid situations like ``**abc***def*``.
+ try:
+ last_write = self.doc.peek_write()
+ except IndexError:
+ pass
+ else:
+ if last_write in ('*', '**') and markup in ('*', '**'):
+ self.doc.write(' ')
+ self.doc.write(markup)
+
+ def _end_inline(self, markup):
+ # Remove empty and self-closing tags like ``<b></b>`` and ``<b/>``.
+ # If we simply translate that directly then we end up with something
+ # like ****, which rst will assume is a heading instead of an empty
+ # bold.
+ last_write = self.doc.pop_write()
+ if last_write == markup:
+ return
+ self.doc.push_write(last_write)
+ self.doc.write(markup)
+
+ def start_bold(self, attrs=None):
+ self._start_inline('**')
+
+ def end_bold(self):
+ self._end_inline('**')
+
+ def start_b(self, attrs=None):
+ self.doc.do_translation = True
+ self.start_bold(attrs)
+
+ def end_b(self):
+ self.doc.do_translation = False
+ self.end_bold()
+
+ def bold(self, s):
+ if s:
+ self.start_bold()
+ self.doc.write(s)
+ self.end_bold()
+
+ def ref(self, title, link=None):
+ if link is None:
+ link = title
+ self.doc.write(f':doc:`{title} <{link}>`')
+
+ def _heading(self, s, border_char):
+ border = border_char * len(s)
+ self.new_paragraph()
+ self.doc.write(f'{border}\n{s}\n{border}')
+ self.new_paragraph()
+
+ def h1(self, s):
+ self._heading(s, '*')
+
+ def h2(self, s):
+ self._heading(s, '=')
+
+ def h3(self, s):
+ self._heading(s, '-')
+
+ def start_italics(self, attrs=None):
+ self._start_inline('*')
+
+ def end_italics(self):
+ self._end_inline('*')
+
+ def italics(self, s):
+ if s:
+ self.start_italics()
+ self.doc.write(s)
+ self.end_italics()
+
+ def start_p(self, attrs=None):
+ if self.do_p:
+ self.doc.write(f'\n\n{self.spaces()}')
+
+ def end_p(self):
+ if self.do_p:
+ self.doc.write(f'\n\n{self.spaces()}')
+
+ def start_code(self, attrs=None):
+ self.doc.do_translation = True
+ self.add_trailing_space_to_previous_write()
+ self._start_inline('``')
+
+ def end_code(self):
+ self.doc.do_translation = False
+ self._end_inline('``')
+
+ def code(self, s):
+ if s:
+ self.start_code()
+ self.doc.write(s)
+ self.end_code()
+
+ def start_note(self, attrs=None):
+ self.new_paragraph()
+ self.doc.write('.. note::')
+ self.indent()
+ self.new_paragraph()
+
+ def end_note(self):
+ self.dedent()
+ self.new_paragraph()
+
+ def start_important(self, attrs=None):
+ self.new_paragraph()
+ self.doc.write('.. warning::')
+ self.indent()
+ self.new_paragraph()
+
+ def end_important(self):
+ self.dedent()
+ self.new_paragraph()
+
+ def start_danger(self, attrs=None):
+ self.new_paragraph()
+ self.doc.write('.. danger::')
+ self.indent()
+ self.new_paragraph()
+
+ def end_danger(self):
+ self.dedent()
+ self.new_paragraph()
+
+ def start_a(self, attrs=None):
+ # Write an empty space to guard against zero whitespace
+ # before an "a" tag. Example: hi<a>Example</a>
+ self.add_trailing_space_to_previous_write()
+ if attrs:
+ for attr_key, attr_value in attrs:
+ if attr_key == 'href':
+ # Removes unnecessary whitespace around the href link.
+ # Example: <a href=" http://example.com ">Example</a>
+ self.a_href = attr_value.strip()
+ self.doc.write('`')
+ else:
+ # There are some model documentation that
+ # looks like this: <a>DescribeInstances</a>.
+ # In this case we just write out an empty
+ # string.
+ self.doc.write(' ')
+ self.doc.do_translation = True
+
+ def link_target_definition(self, refname, link):
+ self.doc.writeln(f'.. _{refname}: {link}')
+
+ def sphinx_reference_label(self, label, text=None):
+ if text is None:
+ text = label
+ if self.doc.target == 'html':
+ self.doc.write(f':ref:`{text} <{label}>`')
+ else:
+ self.doc.write(text)
+
+ def _clean_link_text(self):
+ doc = self.doc
+ # Pop till we reach the link start character to retrieve link text.
+ last_write = doc.pop_write()
+ while not last_write.startswith('`'):
+ last_write = doc.pop_write() + last_write
+ if last_write != '':
+ # Remove whitespace from the start of link text.
+ if last_write.startswith('` '):
+ last_write = f'`{last_write[1:].lstrip(" ")}'
+ doc.push_write(last_write)
+
+ def end_a(self, next_child=None):
+ self.doc.do_translation = False
+ if self.a_href:
+ self._clean_link_text()
+ last_write = self.doc.pop_write()
+ last_write = last_write.rstrip(' ')
+ if last_write and last_write != '`':
+ if ':' in last_write:
+ last_write = last_write.replace(':', r'\:')
+ self.doc.push_write(last_write)
+ self.doc.push_write(f' <{self.a_href}>`__')
+ elif last_write == '`':
+ # Look at start_a(). It will do a self.doc.write('`')
+ # which is the start of the link title. If that is the
+ # case then there was no link text. We should just
+ # use an inline link. The syntax of this is
+ # `<http://url>`_
+ self.doc.push_write(f'`<{self.a_href}>`__')
+ else:
+ self.doc.push_write(self.a_href)
+ self.doc.hrefs[self.a_href] = self.a_href
+ self.doc.write('`__')
+ self.a_href = None
+
+ def start_i(self, attrs=None):
+ self.doc.do_translation = True
+ self.start_italics()
+
+ def end_i(self):
+ self.doc.do_translation = False
+ self.end_italics()
+
+ def start_li(self, attrs=None):
+ self.new_line()
+ self.do_p = False
+ self.doc.write('* ')
+
+ def end_li(self):
+ self.do_p = True
+ self.new_line()
+
+ def li(self, s):
+ if s:
+ self.start_li()
+ self.doc.writeln(s)
+ self.end_li()
+
+ def start_ul(self, attrs=None):
+ if self.list_depth != 0:
+ self.indent()
+ self.list_depth += 1
+ self.new_paragraph()
+
+ def end_ul(self):
+ self.list_depth -= 1
+ if self.list_depth != 0:
+ self.dedent()
+ self.new_paragraph()
+
+ def start_ol(self, attrs=None):
+ # TODO: Need to control the bullets used for LI items
+ if self.list_depth != 0:
+ self.indent()
+ self.list_depth += 1
+ self.new_paragraph()
+
+ def end_ol(self):
+ self.list_depth -= 1
+ if self.list_depth != 0:
+ self.dedent()
+ self.new_paragraph()
+
+ def start_examples(self, attrs=None):
+ self.doc.keep_data = False
+
+ def end_examples(self):
+ self.doc.keep_data = True
+
+ def start_fullname(self, attrs=None):
+ self.doc.keep_data = False
+
+ def end_fullname(self):
+ self.doc.keep_data = True
+
+ def start_codeblock(self, attrs=None):
+ self.doc.write('::')
+ self.indent()
+ self.new_paragraph()
+
+ def end_codeblock(self):
+ self.dedent()
+ self.new_paragraph()
+
+ def codeblock(self, code):
+ """
+ Literal code blocks are introduced by ending a paragraph with
+ the special marker ::. The literal block must be indented
+ (and, like all paragraphs, separated from the surrounding
+ ones by blank lines).
+ """
+ self.start_codeblock()
+ self.doc.writeln(code)
+ self.end_codeblock()
+
+ def toctree(self):
+ if self.doc.target == 'html':
+ self.doc.write('\n.. toctree::\n')
+ self.doc.write(' :maxdepth: 1\n')
+ self.doc.write(' :titlesonly:\n\n')
+ else:
+ self.start_ul()
+
+ def tocitem(self, item, file_name=None):
+ if self.doc.target == 'man':
+ self.li(item)
+ else:
+ if file_name:
+ self.doc.writeln(f' {file_name}')
+ else:
+ self.doc.writeln(f' {item}')
+
+ def hidden_toctree(self):
+ if self.doc.target == 'html':
+ self.doc.write('\n.. toctree::\n')
+ self.doc.write(' :maxdepth: 1\n')
+ self.doc.write(' :hidden:\n\n')
+
+ def hidden_tocitem(self, item):
+ if self.doc.target == 'html':
+ self.tocitem(item)
+
+ def table_of_contents(self, title=None, depth=None):
+ self.doc.write('.. contents:: ')
+ if title is not None:
+ self.doc.writeln(title)
+ if depth is not None:
+ self.doc.writeln(f' :depth: {depth}')
+
+ def start_sphinx_py_class(self, class_name):
+ self.new_paragraph()
+ self.doc.write(f'.. py:class:: {class_name}')
+ self.indent()
+ self.new_paragraph()
+
+ def end_sphinx_py_class(self):
+ self.dedent()
+ self.new_paragraph()
+
+ def start_sphinx_py_method(self, method_name, parameters=None):
+ self.new_paragraph()
+ content = f'.. py:method:: {method_name}'
+ if parameters is not None:
+ content += f'({parameters})'
+ self.doc.write(content)
+ self.indent()
+ self.new_paragraph()
+
+ def end_sphinx_py_method(self):
+ self.dedent()
+ self.new_paragraph()
+
+ def start_sphinx_py_attr(self, attr_name):
+ self.new_paragraph()
+ self.doc.write(f'.. py:attribute:: {attr_name}')
+ self.indent()
+ self.new_paragraph()
+
+ def end_sphinx_py_attr(self):
+ self.dedent()
+ self.new_paragraph()
+
+ def write_py_doc_string(self, docstring):
+ docstring_lines = docstring.splitlines()
+ for docstring_line in docstring_lines:
+ self.doc.writeln(docstring_line)
+
+ def external_link(self, title, link):
+ if self.doc.target == 'html':
+ self.doc.write(f'`{title} <{link}>`_')
+ else:
+ self.doc.write(title)
+
+ def internal_link(self, title, page):
+ if self.doc.target == 'html':
+ self.doc.write(f':doc:`{title} <{page}>`')
+ else:
+ self.doc.write(title)
diff --git a/.venv/lib/python3.12/site-packages/botocore/docs/client.py b/.venv/lib/python3.12/site-packages/botocore/docs/client.py
new file mode 100644
index 00000000..41e37426
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/docs/client.py
@@ -0,0 +1,453 @@
+# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import os
+
+from botocore import xform_name
+from botocore.compat import OrderedDict
+from botocore.docs.bcdoc.restdoc import DocumentStructure
+from botocore.docs.example import ResponseExampleDocumenter
+from botocore.docs.method import (
+ document_custom_method,
+ document_model_driven_method,
+ get_instance_public_methods,
+)
+from botocore.docs.params import ResponseParamsDocumenter
+from botocore.docs.sharedexample import document_shared_examples
+from botocore.docs.utils import DocumentedShape, get_official_service_name
+
+
+def _allowlist_generate_presigned_url(method_name, service_name, **kwargs):
+ if method_name != 'generate_presigned_url':
+ return None
+ return service_name in ['s3']
+
+
+class ClientDocumenter:
+ _CLIENT_METHODS_FILTERS = [
+ _allowlist_generate_presigned_url,
+ ]
+
+ def __init__(self, client, root_docs_path, shared_examples=None):
+ self._client = client
+ self._client_class_name = self._client.__class__.__name__
+ self._root_docs_path = root_docs_path
+ self._shared_examples = shared_examples
+ if self._shared_examples is None:
+ self._shared_examples = {}
+ self._service_name = self._client.meta.service_model.service_name
+
+ def document_client(self, section):
+ """Documents a client and its methods
+
+ :param section: The section to write to.
+ """
+ self._add_title(section)
+ self._add_class_signature(section)
+ client_methods = self._get_client_methods()
+ self._add_client_intro(section, client_methods)
+ self._add_client_methods(client_methods)
+
+ def _get_client_methods(self):
+ client_methods = get_instance_public_methods(self._client)
+ return self._filter_client_methods(client_methods)
+
+ def _filter_client_methods(self, client_methods):
+ filtered_methods = {}
+ for method_name, method in client_methods.items():
+ include = self._filter_client_method(
+ method=method,
+ method_name=method_name,
+ service_name=self._service_name,
+ )
+ if include:
+ filtered_methods[method_name] = method
+ return filtered_methods
+
+ def _filter_client_method(self, **kwargs):
+ # Apply each filter to the method
+ for filter in self._CLIENT_METHODS_FILTERS:
+ filter_include = filter(**kwargs)
+ # Use the first non-None value returned by any of the filters
+ if filter_include is not None:
+ return filter_include
+ # Otherwise default to including it
+ return True
+
+ def _add_title(self, section):
+ section.style.h2('Client')
+
+ def _add_client_intro(self, section, client_methods):
+ section = section.add_new_section('intro')
+ # Write out the top level description for the client.
+ official_service_name = get_official_service_name(
+ self._client.meta.service_model
+ )
+ section.write(
+ f"A low-level client representing {official_service_name}"
+ )
+ section.style.new_line()
+ section.include_doc_string(
+ self._client.meta.service_model.documentation
+ )
+
+ # Write out the client example instantiation.
+ self._add_client_creation_example(section)
+
+ # List out all of the possible client methods.
+ section.style.dedent()
+ section.style.new_paragraph()
+ section.writeln('These are the available methods:')
+ section.style.toctree()
+ for method_name in sorted(client_methods):
+ section.style.tocitem(f'{self._service_name}/client/{method_name}')
+
+ def _add_class_signature(self, section):
+ section.style.start_sphinx_py_class(
+ class_name=f'{self._client_class_name}.Client'
+ )
+
+ def _add_client_creation_example(self, section):
+ section.style.start_codeblock()
+ section.style.new_line()
+ section.write(
+ f'client = session.create_client(\'{self._service_name}\')'
+ )
+ section.style.end_codeblock()
+
+ def _add_client_methods(self, client_methods):
+ for method_name in sorted(client_methods):
+ # Create a new DocumentStructure for each client method and add contents.
+ method_doc_structure = DocumentStructure(
+ method_name, target='html'
+ )
+ self._add_client_method(
+ method_doc_structure, method_name, client_methods[method_name]
+ )
+ # Write client methods in individual/nested files.
+ # Path: <root>/reference/services/<service>/client/<method_name>.rst
+ client_dir_path = os.path.join(
+ self._root_docs_path, self._service_name, 'client'
+ )
+ method_doc_structure.write_to_file(client_dir_path, method_name)
+
+ def _add_client_method(self, section, method_name, method):
+ breadcrumb_section = section.add_new_section('breadcrumb')
+ breadcrumb_section.style.ref(
+ self._client_class_name, f'../../{self._service_name}'
+ )
+ breadcrumb_section.write(f' / Client / {method_name}')
+ section.add_title_section(method_name)
+ method_section = section.add_new_section(
+ method_name,
+ context={'qualifier': f'{self._client_class_name}.Client.'},
+ )
+ if self._is_custom_method(method_name):
+ self._add_custom_method(
+ method_section,
+ method_name,
+ method,
+ )
+ else:
+ self._add_model_driven_method(method_section, method_name)
+
+ def _is_custom_method(self, method_name):
+ return method_name not in self._client.meta.method_to_api_mapping
+
+ def _add_custom_method(self, section, method_name, method):
+ document_custom_method(section, method_name, method)
+
+ def _add_method_exceptions_list(self, section, operation_model):
+ error_section = section.add_new_section('exceptions')
+ error_section.style.new_line()
+ error_section.style.bold('Exceptions')
+ error_section.style.new_line()
+ for error in operation_model.error_shapes:
+ class_name = (
+ f'{self._client_class_name}.Client.exceptions.{error.name}'
+ )
+ error_section.style.li(f':py:class:`{class_name}`')
+
+ def _add_model_driven_method(self, section, method_name):
+ service_model = self._client.meta.service_model
+ operation_name = self._client.meta.method_to_api_mapping[method_name]
+ operation_model = service_model.operation_model(operation_name)
+
+ example_prefix = f'response = client.{method_name}'
+ full_method_name = (
+ f"{section.context.get('qualifier', '')}{method_name}"
+ )
+ document_model_driven_method(
+ section,
+ full_method_name,
+ operation_model,
+ event_emitter=self._client.meta.events,
+ method_description=operation_model.documentation,
+ example_prefix=example_prefix,
+ )
+
+ # Add any modeled exceptions
+ if operation_model.error_shapes:
+ self._add_method_exceptions_list(section, operation_model)
+
+ # Add the shared examples
+ shared_examples = self._shared_examples.get(operation_name)
+ if shared_examples:
+ document_shared_examples(
+ section, operation_model, example_prefix, shared_examples
+ )
+
+
+class ClientExceptionsDocumenter:
+ _USER_GUIDE_LINK = (
+ 'https://boto3.amazonaws.com/'
+ 'v1/documentation/api/latest/guide/error-handling.html'
+ )
+ _GENERIC_ERROR_SHAPE = DocumentedShape(
+ name='Error',
+ type_name='structure',
+ documentation=('Normalized access to common exception attributes.'),
+ members=OrderedDict(
+ [
+ (
+ 'Code',
+ DocumentedShape(
+ name='Code',
+ type_name='string',
+ documentation=(
+ 'An identifier specifying the exception type.'
+ ),
+ ),
+ ),
+ (
+ 'Message',
+ DocumentedShape(
+ name='Message',
+ type_name='string',
+ documentation=(
+ 'A descriptive message explaining why the exception '
+ 'occured.'
+ ),
+ ),
+ ),
+ ]
+ ),
+ )
+
+ def __init__(self, client, root_docs_path):
+ self._client = client
+ self._client_class_name = self._client.__class__.__name__
+ self._service_name = self._client.meta.service_model.service_name
+ self._root_docs_path = root_docs_path
+
+ def document_exceptions(self, section):
+ self._add_title(section)
+ self._add_overview(section)
+ self._add_exceptions_list(section)
+ self._add_exception_classes()
+
+ def _add_title(self, section):
+ section.style.h2('Client Exceptions')
+
+ def _add_overview(self, section):
+ section.style.new_line()
+ section.write(
+ 'Client exceptions are available on a client instance '
+ 'via the ``exceptions`` property. For more detailed instructions '
+ 'and examples on the exact usage of client exceptions, see the '
+ 'error handling '
+ )
+ section.style.external_link(
+ title='user guide',
+ link=self._USER_GUIDE_LINK,
+ )
+ section.write('.')
+ section.style.new_line()
+
+ def _exception_class_name(self, shape):
+ return f'{self._client_class_name}.Client.exceptions.{shape.name}'
+
+ def _add_exceptions_list(self, section):
+ error_shapes = self._client.meta.service_model.error_shapes
+ if not error_shapes:
+ section.style.new_line()
+ section.write('This client has no modeled exception classes.')
+ section.style.new_line()
+ return
+ section.style.new_line()
+ section.writeln('The available client exceptions are:')
+ section.style.toctree()
+ for shape in error_shapes:
+ section.style.tocitem(
+ f'{self._service_name}/client/exceptions/{shape.name}'
+ )
+
+ def _add_exception_classes(self):
+ for shape in self._client.meta.service_model.error_shapes:
+ # Create a new DocumentStructure for each exception method and add contents.
+ exception_doc_structure = DocumentStructure(
+ shape.name, target='html'
+ )
+ self._add_exception_class(exception_doc_structure, shape)
+ # Write exceptions in individual/nested files.
+ # Path: <root>/reference/services/<service>/client/exceptions/<exception_name>.rst
+ exception_dir_path = os.path.join(
+ self._root_docs_path,
+ self._service_name,
+ 'client',
+ 'exceptions',
+ )
+ exception_doc_structure.write_to_file(
+ exception_dir_path, shape.name
+ )
+
+ def _add_exception_class(self, section, shape):
+ breadcrumb_section = section.add_new_section('breadcrumb')
+ breadcrumb_section.style.ref(
+ self._client_class_name, f'../../../{self._service_name}'
+ )
+ breadcrumb_section.write(f' / Client / exceptions / {shape.name}')
+ section.add_title_section(shape.name)
+ class_section = section.add_new_section(shape.name)
+ class_name = self._exception_class_name(shape)
+ class_section.style.start_sphinx_py_class(class_name=class_name)
+ self._add_top_level_documentation(class_section, shape)
+ self._add_exception_catch_example(class_section, shape)
+ self._add_response_attr(class_section, shape)
+ class_section.style.end_sphinx_py_class()
+
+ def _add_top_level_documentation(self, section, shape):
+ if shape.documentation:
+ section.style.new_line()
+ section.include_doc_string(shape.documentation)
+ section.style.new_line()
+
+ def _add_exception_catch_example(self, section, shape):
+ section.style.new_line()
+ section.style.bold('Example')
+ section.style.new_paragraph()
+ section.style.start_codeblock()
+ section.write('try:')
+ section.style.indent()
+ section.style.new_line()
+ section.write('...')
+ section.style.dedent()
+ section.style.new_line()
+ section.write(f'except client.exceptions.{shape.name} as e:')
+ section.style.indent()
+ section.style.new_line()
+ section.write('print(e.response)')
+ section.style.dedent()
+ section.style.end_codeblock()
+
+ def _add_response_attr(self, section, shape):
+ response_section = section.add_new_section('response')
+ response_section.style.start_sphinx_py_attr('response')
+ self._add_response_attr_description(response_section)
+ self._add_response_example(response_section, shape)
+ self._add_response_params(response_section, shape)
+ response_section.style.end_sphinx_py_attr()
+
+ def _add_response_attr_description(self, section):
+ section.style.new_line()
+ section.include_doc_string(
+ 'The parsed error response. All exceptions have a top level '
+ '``Error`` key that provides normalized access to common '
+ 'exception atrributes. All other keys are specific to this '
+ 'service or exception class.'
+ )
+ section.style.new_line()
+
+ def _add_response_example(self, section, shape):
+ example_section = section.add_new_section('syntax')
+ example_section.style.new_line()
+ example_section.style.bold('Syntax')
+ example_section.style.new_paragraph()
+ documenter = ResponseExampleDocumenter(
+ service_name=self._service_name,
+ operation_name=None,
+ event_emitter=self._client.meta.events,
+ )
+ documenter.document_example(
+ example_section,
+ shape,
+ include=[self._GENERIC_ERROR_SHAPE],
+ )
+
+ def _add_response_params(self, section, shape):
+ params_section = section.add_new_section('Structure')
+ params_section.style.new_line()
+ params_section.style.bold('Structure')
+ params_section.style.new_paragraph()
+ documenter = ResponseParamsDocumenter(
+ service_name=self._service_name,
+ operation_name=None,
+ event_emitter=self._client.meta.events,
+ )
+ documenter.document_params(
+ params_section,
+ shape,
+ include=[self._GENERIC_ERROR_SHAPE],
+ )
+
+
+class ClientContextParamsDocumenter:
+ _CONFIG_GUIDE_LINK = (
+ 'https://boto3.amazonaws.com/'
+ 'v1/documentation/api/latest/guide/configuration.html'
+ )
+
+ OMITTED_CONTEXT_PARAMS = {
+ 's3': (
+ 'Accelerate',
+ 'DisableMultiRegionAccessPoints',
+ 'ForcePathStyle',
+ 'UseArnRegion',
+ ),
+ 's3control': ('UseArnRegion',),
+ }
+
+ def __init__(self, service_name, context_params):
+ self._service_name = service_name
+ self._context_params = context_params
+
+ def document_context_params(self, section):
+ self._add_title(section)
+ self._add_overview(section)
+ self._add_context_params_list(section)
+
+ def _add_title(self, section):
+ section.style.h2('Client Context Parameters')
+
+ def _add_overview(self, section):
+ section.style.new_line()
+ section.write(
+ 'Client context parameters are configurable on a client '
+ 'instance via the ``client_context_params`` parameter in the '
+ '``Config`` object. For more detailed instructions and examples '
+ 'on the exact usage of context params see the '
+ )
+ section.style.external_link(
+ title='configuration guide',
+ link=self._CONFIG_GUIDE_LINK,
+ )
+ section.write('.')
+ section.style.new_line()
+
+ def _add_context_params_list(self, section):
+ section.style.new_line()
+ sn = f'``{self._service_name}``'
+ section.writeln(f'The available {sn} client context params are:')
+ for param in self._context_params:
+ section.style.new_line()
+ name = f'``{xform_name(param.name)}``'
+ section.write(f'* {name} ({param.type}) - {param.documentation}')
diff --git a/.venv/lib/python3.12/site-packages/botocore/docs/docstring.py b/.venv/lib/python3.12/site-packages/botocore/docs/docstring.py
new file mode 100644
index 00000000..93b2e6b2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/docs/docstring.py
@@ -0,0 +1,97 @@
+# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+from botocore.docs.bcdoc.restdoc import DocumentStructure
+from botocore.docs.method import document_model_driven_method
+from botocore.docs.paginator import document_paginate_method
+from botocore.docs.waiter import document_wait_method
+
+
+class LazyLoadedDocstring(str):
+ """Used for lazily loading docstrings
+
+ You can instantiate this class and assign it to a __doc__ value.
+ The docstring will not be generated till accessed via __doc__ or
+ help(). Note that all docstring classes **must** subclass from
+ this class. It cannot be used directly as a docstring.
+ """
+
+ def __init__(self, *args, **kwargs):
+ """
+ The args and kwargs are the same as the underlying document
+ generation function. These just get proxied to the underlying
+ function.
+ """
+ super().__init__()
+ self._gen_args = args
+ self._gen_kwargs = kwargs
+ self._docstring = None
+
+ def __new__(cls, *args, **kwargs):
+ # Needed in order to sub class from str with args and kwargs
+ return super().__new__(cls)
+
+ def _write_docstring(self, *args, **kwargs):
+ raise NotImplementedError(
+ '_write_docstring is not implemented. Please subclass from '
+ 'this class and provide your own _write_docstring method'
+ )
+
+ def expandtabs(self, tabsize=8):
+ """Expands tabs to spaces
+
+ So this is a big hack in order to get lazy loaded docstring work
+ for the ``help()``. In the ``help()`` function, ``pydoc`` and
+ ``inspect`` are used. At some point the ``inspect.cleandoc``
+ method is called. To clean the docs ``expandtabs`` is called
+ and that is where we override the method to generate and return the
+ docstrings.
+ """
+ if self._docstring is None:
+ self._generate()
+ return self._docstring.expandtabs(tabsize)
+
+ def __str__(self):
+ return self._generate()
+
+ # __doc__ of target will use either __repr__ or __str__ of this class.
+ __repr__ = __str__
+
+ def _generate(self):
+ # Generate the docstring if it is not already cached.
+ if self._docstring is None:
+ self._docstring = self._create_docstring()
+ return self._docstring
+
+ def _create_docstring(self):
+ docstring_structure = DocumentStructure('docstring', target='html')
+ # Call the document method function with the args and kwargs
+ # passed to the class.
+ self._write_docstring(
+ docstring_structure, *self._gen_args, **self._gen_kwargs
+ )
+ return docstring_structure.flush_structure().decode('utf-8')
+
+
+class ClientMethodDocstring(LazyLoadedDocstring):
+ def _write_docstring(self, *args, **kwargs):
+ document_model_driven_method(*args, **kwargs)
+
+
+class WaiterDocstring(LazyLoadedDocstring):
+ def _write_docstring(self, *args, **kwargs):
+ document_wait_method(*args, **kwargs)
+
+
+class PaginatorDocstring(LazyLoadedDocstring):
+ def _write_docstring(self, *args, **kwargs):
+ document_paginate_method(*args, **kwargs)
diff --git a/.venv/lib/python3.12/site-packages/botocore/docs/example.py b/.venv/lib/python3.12/site-packages/botocore/docs/example.py
new file mode 100644
index 00000000..cb43db55
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/docs/example.py
@@ -0,0 +1,236 @@
+# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+from botocore.docs.shape import ShapeDocumenter
+from botocore.docs.utils import py_default
+
+
+class BaseExampleDocumenter(ShapeDocumenter):
+ def document_example(
+ self, section, shape, prefix=None, include=None, exclude=None
+ ):
+ """Generates an example based on a shape
+
+ :param section: The section to write the documentation to.
+
+ :param shape: The shape of the operation.
+
+ :param prefix: Anything to be included before the example
+
+ :type include: Dictionary where keys are parameter names and
+ values are the shapes of the parameter names.
+ :param include: The parameter shapes to include in the documentation.
+
+ :type exclude: List of the names of the parameters to exclude.
+ :param exclude: The names of the parameters to exclude from
+ documentation.
+ """
+ history = []
+ section.style.new_line()
+ section.style.start_codeblock()
+ if prefix is not None:
+ section.write(prefix)
+ self.traverse_and_document_shape(
+ section=section,
+ shape=shape,
+ history=history,
+ include=include,
+ exclude=exclude,
+ )
+ final_blank_line_section = section.add_new_section('final-blank-line')
+ final_blank_line_section.style.new_line()
+
+ def document_recursive_shape(self, section, shape, **kwargs):
+ section.write('{\'... recursive ...\'}')
+
+ def document_shape_default(
+ self, section, shape, history, include=None, exclude=None, **kwargs
+ ):
+ py_type = self._get_special_py_default(shape)
+ if py_type is None:
+ py_type = py_default(shape.type_name)
+
+ if self._context.get('streaming_shape') == shape:
+ py_type = 'StreamingBody()'
+ section.write(py_type)
+
+ def document_shape_type_string(
+ self, section, shape, history, include=None, exclude=None, **kwargs
+ ):
+ if 'enum' in shape.metadata:
+ for i, enum in enumerate(shape.metadata['enum']):
+ section.write(f'\'{enum}\'')
+ if i < len(shape.metadata['enum']) - 1:
+ section.write('|')
+ else:
+ self.document_shape_default(section, shape, history)
+
+ def document_shape_type_list(
+ self, section, shape, history, include=None, exclude=None, **kwargs
+ ):
+ param_shape = shape.member
+ list_section = section.add_new_section('list-value')
+ self._start_nested_param(list_section, '[')
+ param_section = list_section.add_new_section(
+ 'member', context={'shape': param_shape.name}
+ )
+ self.traverse_and_document_shape(
+ section=param_section, shape=param_shape, history=history
+ )
+ ending_comma_section = list_section.add_new_section('ending-comma')
+ ending_comma_section.write(',')
+ ending_bracket_section = list_section.add_new_section('ending-bracket')
+ self._end_nested_param(ending_bracket_section, ']')
+
+ def document_shape_type_structure(
+ self, section, shape, history, include=None, exclude=None, **kwargs
+ ):
+ if not shape.members:
+ section.write('{}')
+ return
+
+ section = section.add_new_section('structure-value')
+ self._start_nested_param(section, '{')
+
+ input_members = self._add_members_to_shape(shape.members, include)
+
+ for i, param in enumerate(input_members):
+ if exclude and param in exclude:
+ continue
+ param_section = section.add_new_section(param)
+ param_section.write(f'\'{param}\': ')
+ param_shape = input_members[param]
+ param_value_section = param_section.add_new_section(
+ 'member-value', context={'shape': param_shape.name}
+ )
+ self.traverse_and_document_shape(
+ section=param_value_section,
+ shape=param_shape,
+ history=history,
+ name=param,
+ )
+ if i < len(input_members) - 1:
+ ending_comma_section = param_section.add_new_section(
+ 'ending-comma'
+ )
+ ending_comma_section.write(',')
+ ending_comma_section.style.new_line()
+ self._end_structure(section, '{', '}')
+
+ def document_shape_type_map(
+ self, section, shape, history, include=None, exclude=None, **kwargs
+ ):
+ map_section = section.add_new_section('map-value')
+ self._start_nested_param(map_section, '{')
+ value_shape = shape.value
+ key_section = map_section.add_new_section(
+ 'key', context={'shape': shape.key.name}
+ )
+ key_section.write('\'string\': ')
+ value_section = map_section.add_new_section(
+ 'value', context={'shape': value_shape.name}
+ )
+ self.traverse_and_document_shape(
+ section=value_section, shape=value_shape, history=history
+ )
+ end_bracket_section = map_section.add_new_section('ending-bracket')
+ self._end_nested_param(end_bracket_section, '}')
+
+ def _add_members_to_shape(self, members, include):
+ if include:
+ members = members.copy()
+ for param in include:
+ members[param.name] = param
+ return members
+
+ def _start_nested_param(self, section, start=None):
+ if start is not None:
+ section.write(start)
+ section.style.indent()
+ section.style.indent()
+ section.style.new_line()
+
+ def _end_nested_param(self, section, end=None):
+ section.style.dedent()
+ section.style.dedent()
+ section.style.new_line()
+ if end is not None:
+ section.write(end)
+
+ def _end_structure(self, section, start, end):
+ # If there are no members in the strucuture, then make sure the
+ # start and the end bracket are on the same line, by removing all
+ # previous text and writing the start and end.
+ if not section.available_sections:
+ section.clear_text()
+ section.write(start + end)
+ self._end_nested_param(section)
+ else:
+ end_bracket_section = section.add_new_section('ending-bracket')
+ self._end_nested_param(end_bracket_section, end)
+
+
+class ResponseExampleDocumenter(BaseExampleDocumenter):
+ EVENT_NAME = 'response-example'
+
+ def document_shape_type_event_stream(
+ self, section, shape, history, **kwargs
+ ):
+ section.write('EventStream(')
+ self.document_shape_type_structure(section, shape, history, **kwargs)
+ end_section = section.add_new_section('event-stream-end')
+ end_section.write(')')
+
+
+class RequestExampleDocumenter(BaseExampleDocumenter):
+ EVENT_NAME = 'request-example'
+
+ def document_shape_type_structure(
+ self, section, shape, history, include=None, exclude=None, **kwargs
+ ):
+ param_format = '\'%s\''
+ operator = ': '
+ start = '{'
+ end = '}'
+
+ if len(history) <= 1:
+ operator = '='
+ start = '('
+ end = ')'
+ param_format = '%s'
+ section = section.add_new_section('structure-value')
+ self._start_nested_param(section, start)
+ input_members = self._add_members_to_shape(shape.members, include)
+
+ for i, param in enumerate(input_members):
+ if exclude and param in exclude:
+ continue
+ param_section = section.add_new_section(param)
+ param_section.write(param_format % param)
+ param_section.write(operator)
+ param_shape = input_members[param]
+ param_value_section = param_section.add_new_section(
+ 'member-value', context={'shape': param_shape.name}
+ )
+ self.traverse_and_document_shape(
+ section=param_value_section,
+ shape=param_shape,
+ history=history,
+ name=param,
+ )
+ if i < len(input_members) - 1:
+ ending_comma_section = param_section.add_new_section(
+ 'ending-comma'
+ )
+ ending_comma_section.write(',')
+ ending_comma_section.style.new_line()
+ self._end_structure(section, start, end)
diff --git a/.venv/lib/python3.12/site-packages/botocore/docs/method.py b/.venv/lib/python3.12/site-packages/botocore/docs/method.py
new file mode 100644
index 00000000..5db906c8
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/docs/method.py
@@ -0,0 +1,328 @@
+# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import inspect
+import types
+
+from botocore.docs.example import (
+ RequestExampleDocumenter,
+ ResponseExampleDocumenter,
+)
+from botocore.docs.params import (
+ RequestParamsDocumenter,
+ ResponseParamsDocumenter,
+)
+
+AWS_DOC_BASE = 'https://docs.aws.amazon.com/goto/WebAPI'
+
+
+def get_instance_public_methods(instance):
+ """Retrieves an objects public methods
+
+ :param instance: The instance of the class to inspect
+ :rtype: dict
+ :returns: A dictionary that represents an instance's methods where
+ the keys are the name of the methods and the
+ values are the handler to the method.
+ """
+ instance_members = inspect.getmembers(instance)
+ instance_methods = {}
+ for name, member in instance_members:
+ if not name.startswith('_'):
+ if inspect.ismethod(member):
+ instance_methods[name] = member
+ return instance_methods
+
+
+def document_model_driven_signature(
+ section, name, operation_model, include=None, exclude=None
+):
+ """Documents the signature of a model-driven method
+
+ :param section: The section to write the documentation to.
+
+ :param name: The name of the method
+
+ :param operation_model: The operation model for the method
+
+ :type include: Dictionary where keys are parameter names and
+ values are the shapes of the parameter names.
+ :param include: The parameter shapes to include in the documentation.
+
+ :type exclude: List of the names of the parameters to exclude.
+ :param exclude: The names of the parameters to exclude from
+ documentation.
+ """
+ params = {}
+ if operation_model.input_shape:
+ params = operation_model.input_shape.members
+
+ parameter_names = list(params.keys())
+
+ if include is not None:
+ for member in include:
+ parameter_names.append(member.name)
+
+ if exclude is not None:
+ for member in exclude:
+ if member in parameter_names:
+ parameter_names.remove(member)
+
+ signature_params = ''
+ if parameter_names:
+ signature_params = '**kwargs'
+ section.style.start_sphinx_py_method(name, signature_params)
+
+
+def document_custom_signature(
+ section, name, method, include=None, exclude=None
+):
+ """Documents the signature of a custom method
+
+ :param section: The section to write the documentation to.
+
+ :param name: The name of the method
+
+ :param method: The handle to the method being documented
+
+ :type include: Dictionary where keys are parameter names and
+ values are the shapes of the parameter names.
+ :param include: The parameter shapes to include in the documentation.
+
+ :type exclude: List of the names of the parameters to exclude.
+ :param exclude: The names of the parameters to exclude from
+ documentation.
+ """
+ signature = inspect.signature(method)
+ # "raw" class methods are FunctionType and they include "self" param
+ # object methods are MethodType and they skip the "self" param
+ if isinstance(method, types.FunctionType):
+ self_param = next(iter(signature.parameters))
+ self_kind = signature.parameters[self_param].kind
+ # safety check that we got the right parameter
+ assert self_kind == inspect.Parameter.POSITIONAL_OR_KEYWORD
+ new_params = signature.parameters.copy()
+ del new_params[self_param]
+ signature = signature.replace(parameters=new_params.values())
+ signature_params = str(signature).lstrip('(')
+ signature_params = signature_params.rstrip(')')
+ section.style.start_sphinx_py_method(name, signature_params)
+
+
+def document_custom_method(section, method_name, method):
+ """Documents a non-data driven method
+
+ :param section: The section to write the documentation to.
+
+ :param method_name: The name of the method
+
+ :param method: The handle to the method being documented
+ """
+ full_method_name = f"{section.context.get('qualifier', '')}{method_name}"
+ document_custom_signature(section, full_method_name, method)
+ method_intro_section = section.add_new_section('method-intro')
+ method_intro_section.writeln('')
+ doc_string = inspect.getdoc(method)
+ if doc_string is not None:
+ method_intro_section.style.write_py_doc_string(doc_string)
+
+
+def document_model_driven_method(
+ section,
+ method_name,
+ operation_model,
+ event_emitter,
+ method_description=None,
+ example_prefix=None,
+ include_input=None,
+ include_output=None,
+ exclude_input=None,
+ exclude_output=None,
+ document_output=True,
+ include_signature=True,
+):
+ """Documents an individual method
+
+ :param section: The section to write to
+
+ :param method_name: The name of the method
+
+ :param operation_model: The model of the operation
+
+ :param event_emitter: The event emitter to use to emit events
+
+ :param example_prefix: The prefix to use in the method example.
+
+ :type include_input: Dictionary where keys are parameter names and
+ values are the shapes of the parameter names.
+ :param include_input: The parameter shapes to include in the
+ input documentation.
+
+ :type include_output: Dictionary where keys are parameter names and
+ values are the shapes of the parameter names.
+ :param include_input: The parameter shapes to include in the
+ output documentation.
+
+ :type exclude_input: List of the names of the parameters to exclude.
+ :param exclude_input: The names of the parameters to exclude from
+ input documentation.
+
+ :type exclude_output: List of the names of the parameters to exclude.
+ :param exclude_input: The names of the parameters to exclude from
+ output documentation.
+
+ :param document_output: A boolean flag to indicate whether to
+ document the output.
+
+ :param include_signature: Whether or not to include the signature.
+ It is useful for generating docstrings.
+ """
+ # Add the signature if specified.
+ if include_signature:
+ document_model_driven_signature(
+ section,
+ method_name,
+ operation_model,
+ include=include_input,
+ exclude=exclude_input,
+ )
+
+ # Add the description for the method.
+ method_intro_section = section.add_new_section('method-intro')
+ method_intro_section.include_doc_string(method_description)
+ if operation_model.deprecated:
+ method_intro_section.style.start_danger()
+ method_intro_section.writeln(
+ 'This operation is deprecated and may not function as '
+ 'expected. This operation should not be used going forward '
+ 'and is only kept for the purpose of backwards compatiblity.'
+ )
+ method_intro_section.style.end_danger()
+ service_uid = operation_model.service_model.metadata.get('uid')
+ if service_uid is not None:
+ method_intro_section.style.new_paragraph()
+ method_intro_section.write("See also: ")
+ link = f"{AWS_DOC_BASE}/{service_uid}/{operation_model.name}"
+ method_intro_section.style.external_link(
+ title="AWS API Documentation", link=link
+ )
+ method_intro_section.writeln('')
+
+ # Add the example section.
+ example_section = section.add_new_section('request-example')
+ example_section.style.new_paragraph()
+ example_section.style.bold('Request Syntax')
+
+ context = {
+ 'special_shape_types': {
+ 'streaming_input_shape': operation_model.get_streaming_input(),
+ 'streaming_output_shape': operation_model.get_streaming_output(),
+ 'eventstream_output_shape': operation_model.get_event_stream_output(),
+ },
+ }
+
+ if operation_model.input_shape:
+ RequestExampleDocumenter(
+ service_name=operation_model.service_model.service_name,
+ operation_name=operation_model.name,
+ event_emitter=event_emitter,
+ context=context,
+ ).document_example(
+ example_section,
+ operation_model.input_shape,
+ prefix=example_prefix,
+ include=include_input,
+ exclude=exclude_input,
+ )
+ else:
+ example_section.style.new_paragraph()
+ example_section.style.start_codeblock()
+ example_section.write(example_prefix + '()')
+
+ # Add the request parameter documentation.
+ request_params_section = section.add_new_section('request-params')
+ if operation_model.input_shape:
+ RequestParamsDocumenter(
+ service_name=operation_model.service_model.service_name,
+ operation_name=operation_model.name,
+ event_emitter=event_emitter,
+ context=context,
+ ).document_params(
+ request_params_section,
+ operation_model.input_shape,
+ include=include_input,
+ exclude=exclude_input,
+ )
+
+ # Add the return value documentation
+ return_section = section.add_new_section('return')
+ return_section.style.new_line()
+ if operation_model.output_shape is not None and document_output:
+ return_section.write(':rtype: dict')
+ return_section.style.new_line()
+ return_section.write(':returns: ')
+ return_section.style.indent()
+ return_section.style.new_line()
+
+ # If the operation is an event stream, describe the tagged union
+ event_stream_output = operation_model.get_event_stream_output()
+ if event_stream_output:
+ event_section = return_section.add_new_section('event-stream')
+ event_section.style.new_paragraph()
+ event_section.write(
+ 'The response of this operation contains an '
+ ':class:`.EventStream` member. When iterated the '
+ ':class:`.EventStream` will yield events based on the '
+ 'structure below, where only one of the top level keys '
+ 'will be present for any given event.'
+ )
+ event_section.style.new_line()
+
+ # Add an example return value
+ return_example_section = return_section.add_new_section(
+ 'response-example'
+ )
+ return_example_section.style.new_line()
+ return_example_section.style.bold('Response Syntax')
+ return_example_section.style.new_paragraph()
+ ResponseExampleDocumenter(
+ service_name=operation_model.service_model.service_name,
+ operation_name=operation_model.name,
+ event_emitter=event_emitter,
+ context=context,
+ ).document_example(
+ return_example_section,
+ operation_model.output_shape,
+ include=include_output,
+ exclude=exclude_output,
+ )
+
+ # Add a description for the return value
+ return_description_section = return_section.add_new_section(
+ 'description'
+ )
+ return_description_section.style.new_line()
+ return_description_section.style.bold('Response Structure')
+ return_description_section.style.new_paragraph()
+ ResponseParamsDocumenter(
+ service_name=operation_model.service_model.service_name,
+ operation_name=operation_model.name,
+ event_emitter=event_emitter,
+ context=context,
+ ).document_params(
+ return_description_section,
+ operation_model.output_shape,
+ include=include_output,
+ exclude=exclude_output,
+ )
+ else:
+ return_section.write(':returns: None')
diff --git a/.venv/lib/python3.12/site-packages/botocore/docs/paginator.py b/.venv/lib/python3.12/site-packages/botocore/docs/paginator.py
new file mode 100644
index 00000000..2c9b3003
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/docs/paginator.py
@@ -0,0 +1,241 @@
+# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import os
+
+from botocore import xform_name
+from botocore.compat import OrderedDict
+from botocore.docs.bcdoc.restdoc import DocumentStructure
+from botocore.docs.method import document_model_driven_method
+from botocore.docs.utils import DocumentedShape
+from botocore.utils import get_service_module_name
+
+
+class PaginatorDocumenter:
+ def __init__(self, client, service_paginator_model, root_docs_path):
+ self._client = client
+ self._client_class_name = self._client.__class__.__name__
+ self._service_name = self._client.meta.service_model.service_name
+ self._service_paginator_model = service_paginator_model
+ self._root_docs_path = root_docs_path
+ self._USER_GUIDE_LINK = (
+ 'https://boto3.amazonaws.com/'
+ 'v1/documentation/api/latest/guide/paginators.html'
+ )
+
+ def document_paginators(self, section):
+ """Documents the various paginators for a service
+
+ param section: The section to write to.
+ """
+ section.style.h2('Paginators')
+ self._add_overview(section)
+ section.style.new_line()
+ section.writeln('The available paginators are:')
+ section.style.toctree()
+
+ paginator_names = sorted(
+ self._service_paginator_model._paginator_config
+ )
+
+ # List the available paginators and then document each paginator.
+ for paginator_name in paginator_names:
+ section.style.tocitem(
+ f'{self._service_name}/paginator/{paginator_name}'
+ )
+ # Create a new DocumentStructure for each paginator and add contents.
+ paginator_doc_structure = DocumentStructure(
+ paginator_name, target='html'
+ )
+ self._add_paginator(paginator_doc_structure, paginator_name)
+ # Write paginators in individual/nested files.
+ # Path: <root>/reference/services/<service>/paginator/<paginator_name>.rst
+ paginator_dir_path = os.path.join(
+ self._root_docs_path, self._service_name, 'paginator'
+ )
+ paginator_doc_structure.write_to_file(
+ paginator_dir_path, paginator_name
+ )
+
+ def _add_paginator(self, section, paginator_name):
+ breadcrumb_section = section.add_new_section('breadcrumb')
+ breadcrumb_section.style.ref(
+ self._client_class_name, f'../../{self._service_name}'
+ )
+ breadcrumb_section.write(f' / Paginator / {paginator_name}')
+ section.add_title_section(paginator_name)
+
+ # Docment the paginator class
+ paginator_section = section.add_new_section(paginator_name)
+ paginator_section.style.start_sphinx_py_class(
+ class_name=(
+ f'{self._client_class_name}.Paginator.{paginator_name}'
+ )
+ )
+ paginator_section.style.start_codeblock()
+ paginator_section.style.new_line()
+
+ # Document how to instantiate the paginator.
+ paginator_section.write(
+ f"paginator = client.get_paginator('{xform_name(paginator_name)}')"
+ )
+ paginator_section.style.end_codeblock()
+ paginator_section.style.new_line()
+ # Get the pagination model for the particular paginator.
+ paginator_config = self._service_paginator_model.get_paginator(
+ paginator_name
+ )
+ document_paginate_method(
+ section=paginator_section,
+ paginator_name=paginator_name,
+ event_emitter=self._client.meta.events,
+ service_model=self._client.meta.service_model,
+ paginator_config=paginator_config,
+ )
+
+ def _add_overview(self, section):
+ section.style.new_line()
+ section.write(
+ 'Paginators are available on a client instance '
+ 'via the ``get_paginator`` method. For more detailed instructions '
+ 'and examples on the usage of paginators, see the '
+ 'paginators '
+ )
+ section.style.external_link(
+ title='user guide',
+ link=self._USER_GUIDE_LINK,
+ )
+ section.write('.')
+ section.style.new_line()
+
+
+def document_paginate_method(
+ section,
+ paginator_name,
+ event_emitter,
+ service_model,
+ paginator_config,
+ include_signature=True,
+):
+ """Documents the paginate method of a paginator
+
+ :param section: The section to write to
+
+ :param paginator_name: The name of the paginator. It is snake cased.
+
+ :param event_emitter: The event emitter to use to emit events
+
+ :param service_model: The service model
+
+ :param paginator_config: The paginator config associated to a particular
+ paginator.
+
+ :param include_signature: Whether or not to include the signature.
+ It is useful for generating docstrings.
+ """
+ # Retrieve the operation model of the underlying operation.
+ operation_model = service_model.operation_model(paginator_name)
+
+ # Add representations of the request and response parameters
+ # we want to include in the description of the paginate method.
+ # These are parameters we expose via the botocore interface.
+ pagination_config_members = OrderedDict()
+
+ pagination_config_members['MaxItems'] = DocumentedShape(
+ name='MaxItems',
+ type_name='integer',
+ documentation=(
+ '<p>The total number of items to return. If the total '
+ 'number of items available is more than the value '
+ 'specified in max-items then a <code>NextToken</code> '
+ 'will be provided in the output that you can use to '
+ 'resume pagination.</p>'
+ ),
+ )
+
+ if paginator_config.get('limit_key', None):
+ pagination_config_members['PageSize'] = DocumentedShape(
+ name='PageSize',
+ type_name='integer',
+ documentation='<p>The size of each page.<p>',
+ )
+
+ pagination_config_members['StartingToken'] = DocumentedShape(
+ name='StartingToken',
+ type_name='string',
+ documentation=(
+ '<p>A token to specify where to start paginating. '
+ 'This is the <code>NextToken</code> from a previous '
+ 'response.</p>'
+ ),
+ )
+
+ botocore_pagination_params = [
+ DocumentedShape(
+ name='PaginationConfig',
+ type_name='structure',
+ documentation=(
+ '<p>A dictionary that provides parameters to control '
+ 'pagination.</p>'
+ ),
+ members=pagination_config_members,
+ )
+ ]
+
+ botocore_pagination_response_params = [
+ DocumentedShape(
+ name='NextToken',
+ type_name='string',
+ documentation=('<p>A token to resume pagination.</p>'),
+ )
+ ]
+
+ service_pagination_params = []
+
+ # Add the normal input token of the method to a list
+ # of input paramters that we wish to hide since we expose our own.
+ if isinstance(paginator_config['input_token'], list):
+ service_pagination_params += paginator_config['input_token']
+ else:
+ service_pagination_params.append(paginator_config['input_token'])
+
+ # Hide the limit key in the documentation.
+ if paginator_config.get('limit_key', None):
+ service_pagination_params.append(paginator_config['limit_key'])
+
+ # Hide the output tokens in the documentation.
+ service_pagination_response_params = []
+ if isinstance(paginator_config['output_token'], list):
+ service_pagination_response_params += paginator_config['output_token']
+ else:
+ service_pagination_response_params.append(
+ paginator_config['output_token']
+ )
+
+ paginate_description = (
+ 'Creates an iterator that will paginate through responses '
+ f'from :py:meth:`{get_service_module_name(service_model)}.Client.{xform_name(paginator_name)}`.'
+ )
+
+ document_model_driven_method(
+ section,
+ 'paginate',
+ operation_model,
+ event_emitter=event_emitter,
+ method_description=paginate_description,
+ example_prefix='response_iterator = paginator.paginate',
+ include_input=botocore_pagination_params,
+ include_output=botocore_pagination_response_params,
+ exclude_input=service_pagination_params,
+ exclude_output=service_pagination_response_params,
+ include_signature=include_signature,
+ )
diff --git a/.venv/lib/python3.12/site-packages/botocore/docs/params.py b/.venv/lib/python3.12/site-packages/botocore/docs/params.py
new file mode 100644
index 00000000..74747ec2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/docs/params.py
@@ -0,0 +1,303 @@
+# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+from botocore.docs.shape import ShapeDocumenter
+from botocore.docs.utils import py_type_name
+
+
+class BaseParamsDocumenter(ShapeDocumenter):
+ def document_params(self, section, shape, include=None, exclude=None):
+ """Fills out the documentation for a section given a model shape.
+
+ :param section: The section to write the documentation to.
+
+ :param shape: The shape of the operation.
+
+ :type include: Dictionary where keys are parameter names and
+ values are the shapes of the parameter names.
+ :param include: The parameter shapes to include in the documentation.
+
+ :type exclude: List of the names of the parameters to exclude.
+ :param exclude: The names of the parameters to exclude from
+ documentation.
+ """
+ history = []
+ self.traverse_and_document_shape(
+ section=section,
+ shape=shape,
+ history=history,
+ name=None,
+ include=include,
+ exclude=exclude,
+ )
+
+ def document_recursive_shape(self, section, shape, **kwargs):
+ self._add_member_documentation(section, shape, **kwargs)
+
+ def document_shape_default(
+ self, section, shape, history, include=None, exclude=None, **kwargs
+ ):
+ self._add_member_documentation(section, shape, **kwargs)
+
+ def document_shape_type_list(
+ self, section, shape, history, include=None, exclude=None, **kwargs
+ ):
+ self._add_member_documentation(section, shape, **kwargs)
+ param_shape = shape.member
+ param_section = section.add_new_section(
+ param_shape.name, context={'shape': shape.member.name}
+ )
+ self._start_nested_param(param_section)
+ self.traverse_and_document_shape(
+ section=param_section,
+ shape=param_shape,
+ history=history,
+ name=None,
+ )
+ section = section.add_new_section('end-list')
+ self._end_nested_param(section)
+
+ def document_shape_type_map(
+ self, section, shape, history, include=None, exclude=None, **kwargs
+ ):
+ self._add_member_documentation(section, shape, **kwargs)
+
+ key_section = section.add_new_section(
+ 'key', context={'shape': shape.key.name}
+ )
+ self._start_nested_param(key_section)
+ self._add_member_documentation(key_section, shape.key)
+
+ param_section = section.add_new_section(
+ shape.value.name, context={'shape': shape.value.name}
+ )
+ param_section.style.indent()
+ self._start_nested_param(param_section)
+ self.traverse_and_document_shape(
+ section=param_section,
+ shape=shape.value,
+ history=history,
+ name=None,
+ )
+
+ end_section = section.add_new_section('end-map')
+ self._end_nested_param(end_section)
+ self._end_nested_param(end_section)
+
+ def document_shape_type_structure(
+ self,
+ section,
+ shape,
+ history,
+ include=None,
+ exclude=None,
+ name=None,
+ **kwargs,
+ ):
+ members = self._add_members_to_shape(shape.members, include)
+ self._add_member_documentation(section, shape, name=name)
+ for param in members:
+ if exclude and param in exclude:
+ continue
+ param_shape = members[param]
+ param_section = section.add_new_section(
+ param, context={'shape': param_shape.name}
+ )
+ self._start_nested_param(param_section)
+ self.traverse_and_document_shape(
+ section=param_section,
+ shape=param_shape,
+ history=history,
+ name=param,
+ )
+ section = section.add_new_section('end-structure')
+ self._end_nested_param(section)
+
+ def _add_member_documentation(self, section, shape, **kwargs):
+ pass
+
+ def _add_members_to_shape(self, members, include):
+ if include:
+ members = members.copy()
+ for param in include:
+ members[param.name] = param
+ return members
+
+ def _document_non_top_level_param_type(self, type_section, shape):
+ special_py_type = self._get_special_py_type_name(shape)
+ py_type = py_type_name(shape.type_name)
+
+ type_format = '(%s) --'
+ if special_py_type is not None:
+ # Special type can reference a linked class.
+ # Italicizing it blows away the link.
+ type_section.write(type_format % special_py_type)
+ else:
+ type_section.style.italics(type_format % py_type)
+ type_section.write(' ')
+
+ def _start_nested_param(self, section):
+ section.style.indent()
+ section.style.new_line()
+
+ def _end_nested_param(self, section):
+ section.style.dedent()
+ section.style.new_line()
+
+
+class ResponseParamsDocumenter(BaseParamsDocumenter):
+ """Generates the description for the response parameters"""
+
+ EVENT_NAME = 'response-params'
+
+ def _add_member_documentation(self, section, shape, name=None, **kwargs):
+ name_section = section.add_new_section('param-name')
+ name_section.write('- ')
+ if name is not None:
+ name_section.style.bold(f'{name}')
+ name_section.write(' ')
+ type_section = section.add_new_section('param-type')
+ self._document_non_top_level_param_type(type_section, shape)
+
+ documentation_section = section.add_new_section('param-documentation')
+ if shape.documentation:
+ documentation_section.style.indent()
+ if getattr(shape, 'is_tagged_union', False):
+ tagged_union_docs = section.add_new_section(
+ 'param-tagged-union-docs'
+ )
+ note = (
+ '.. note::'
+ ' This is a Tagged Union structure. Only one of the '
+ ' following top level keys will be set: %s. '
+ ' If a client receives an unknown member it will '
+ ' set ``SDK_UNKNOWN_MEMBER`` as the top level key, '
+ ' which maps to the name or tag of the unknown '
+ ' member. The structure of ``SDK_UNKNOWN_MEMBER`` is '
+ ' as follows'
+ )
+ tagged_union_members_str = ', '.join(
+ [f'``{key}``' for key in shape.members.keys()]
+ )
+ unknown_code_example = (
+ '\'SDK_UNKNOWN_MEMBER\': '
+ '{\'name\': \'UnknownMemberName\'}'
+ )
+ tagged_union_docs.write(note % (tagged_union_members_str))
+ example = section.add_new_section('param-unknown-example')
+ example.style.codeblock(unknown_code_example)
+ documentation_section.include_doc_string(shape.documentation)
+ section.style.new_paragraph()
+
+ def document_shape_type_event_stream(
+ self, section, shape, history, **kwargs
+ ):
+ self.document_shape_type_structure(section, shape, history, **kwargs)
+
+
+class RequestParamsDocumenter(BaseParamsDocumenter):
+ """Generates the description for the request parameters"""
+
+ EVENT_NAME = 'request-params'
+
+ def document_shape_type_structure(
+ self, section, shape, history, include=None, exclude=None, **kwargs
+ ):
+ if len(history) > 1:
+ self._add_member_documentation(section, shape, **kwargs)
+ section.style.indent()
+ members = self._add_members_to_shape(shape.members, include)
+ for i, param in enumerate(members):
+ if exclude and param in exclude:
+ continue
+ param_shape = members[param]
+ param_section = section.add_new_section(
+ param, context={'shape': param_shape.name}
+ )
+ param_section.style.new_line()
+ is_required = param in shape.required_members
+ self.traverse_and_document_shape(
+ section=param_section,
+ shape=param_shape,
+ history=history,
+ name=param,
+ is_required=is_required,
+ )
+ section = section.add_new_section('end-structure')
+ if len(history) > 1:
+ section.style.dedent()
+ section.style.new_line()
+
+ def _add_member_documentation(
+ self,
+ section,
+ shape,
+ name=None,
+ is_top_level_param=False,
+ is_required=False,
+ **kwargs,
+ ):
+ py_type = self._get_special_py_type_name(shape)
+ if py_type is None:
+ py_type = py_type_name(shape.type_name)
+ if is_top_level_param:
+ type_section = section.add_new_section('param-type')
+ type_section.write(f':type {name}: {py_type}')
+ end_type_section = type_section.add_new_section('end-param-type')
+ end_type_section.style.new_line()
+ name_section = section.add_new_section('param-name')
+ name_section.write(f':param {name}: ')
+
+ else:
+ name_section = section.add_new_section('param-name')
+ name_section.write('- ')
+ if name is not None:
+ name_section.style.bold(f'{name}')
+ name_section.write(' ')
+ type_section = section.add_new_section('param-type')
+ self._document_non_top_level_param_type(type_section, shape)
+
+ if is_required:
+ is_required_section = section.add_new_section('is-required')
+ is_required_section.style.indent()
+ is_required_section.style.bold('[REQUIRED]')
+ is_required_section.write(' ')
+ if shape.documentation:
+ documentation_section = section.add_new_section(
+ 'param-documentation'
+ )
+ documentation_section.style.indent()
+ if getattr(shape, 'is_tagged_union', False):
+ tagged_union_docs = section.add_new_section(
+ 'param-tagged-union-docs'
+ )
+ note = (
+ '.. note::'
+ ' This is a Tagged Union structure. Only one of the '
+ ' following top level keys can be set: %s. '
+ )
+ tagged_union_members_str = ', '.join(
+ [f'``{key}``' for key in shape.members.keys()]
+ )
+ tagged_union_docs.write(note % (tagged_union_members_str))
+ documentation_section.include_doc_string(shape.documentation)
+ self._add_special_trait_documentation(documentation_section, shape)
+ end_param_section = section.add_new_section('end-param')
+ end_param_section.style.new_paragraph()
+
+ def _add_special_trait_documentation(self, section, shape):
+ if 'idempotencyToken' in shape.metadata:
+ self._append_idempotency_documentation(section)
+
+ def _append_idempotency_documentation(self, section):
+ docstring = 'This field is autopopulated if not provided.'
+ section.write(docstring)
diff --git a/.venv/lib/python3.12/site-packages/botocore/docs/service.py b/.venv/lib/python3.12/site-packages/botocore/docs/service.py
new file mode 100644
index 00000000..d20a889d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/docs/service.py
@@ -0,0 +1,133 @@
+# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+from botocore.docs.bcdoc.restdoc import DocumentStructure
+from botocore.docs.client import (
+ ClientContextParamsDocumenter,
+ ClientDocumenter,
+ ClientExceptionsDocumenter,
+)
+from botocore.docs.paginator import PaginatorDocumenter
+from botocore.docs.waiter import WaiterDocumenter
+from botocore.exceptions import DataNotFoundError
+
+
+class ServiceDocumenter:
+ def __init__(self, service_name, session, root_docs_path):
+ self._session = session
+ self._service_name = service_name
+ self._root_docs_path = root_docs_path
+
+ self._client = self._session.create_client(
+ service_name,
+ region_name='us-east-1',
+ aws_access_key_id='foo',
+ aws_secret_access_key='bar',
+ )
+ self._event_emitter = self._client.meta.events
+
+ self.sections = [
+ 'title',
+ 'client-api',
+ 'client-exceptions',
+ 'paginator-api',
+ 'waiter-api',
+ 'client-context-params',
+ ]
+
+ def document_service(self):
+ """Documents an entire service.
+
+ :returns: The reStructured text of the documented service.
+ """
+ doc_structure = DocumentStructure(
+ self._service_name, section_names=self.sections, target='html'
+ )
+ self.title(doc_structure.get_section('title'))
+ self.client_api(doc_structure.get_section('client-api'))
+ self.client_exceptions(doc_structure.get_section('client-exceptions'))
+ self.paginator_api(doc_structure.get_section('paginator-api'))
+ self.waiter_api(doc_structure.get_section('waiter-api'))
+ context_params_section = doc_structure.get_section(
+ 'client-context-params'
+ )
+ self.client_context_params(context_params_section)
+ return doc_structure.flush_structure()
+
+ def title(self, section):
+ section.style.h1(self._client.__class__.__name__)
+ self._event_emitter.emit(
+ f"docs.title.{self._service_name}", section=section
+ )
+
+ def table_of_contents(self, section):
+ section.style.table_of_contents(title='Table of Contents', depth=2)
+
+ def client_api(self, section):
+ examples = None
+ try:
+ examples = self.get_examples(self._service_name)
+ except DataNotFoundError:
+ pass
+
+ ClientDocumenter(
+ self._client, self._root_docs_path, examples
+ ).document_client(section)
+
+ def client_exceptions(self, section):
+ ClientExceptionsDocumenter(
+ self._client, self._root_docs_path
+ ).document_exceptions(section)
+
+ def paginator_api(self, section):
+ try:
+ service_paginator_model = self._session.get_paginator_model(
+ self._service_name
+ )
+ except DataNotFoundError:
+ return
+ if service_paginator_model._paginator_config:
+ paginator_documenter = PaginatorDocumenter(
+ self._client, service_paginator_model, self._root_docs_path
+ )
+ paginator_documenter.document_paginators(section)
+
+ def waiter_api(self, section):
+ if self._client.waiter_names:
+ service_waiter_model = self._session.get_waiter_model(
+ self._service_name
+ )
+ waiter_documenter = WaiterDocumenter(
+ self._client, service_waiter_model, self._root_docs_path
+ )
+ waiter_documenter.document_waiters(section)
+
+ def get_examples(self, service_name, api_version=None):
+ loader = self._session.get_component('data_loader')
+ examples = loader.load_service_model(
+ service_name, 'examples-1', api_version
+ )
+ return examples['examples']
+
+ def client_context_params(self, section):
+ omitted_params = ClientContextParamsDocumenter.OMITTED_CONTEXT_PARAMS
+ params_to_omit = omitted_params.get(self._service_name, [])
+ service_model = self._client.meta.service_model
+ raw_context_params = service_model.client_context_parameters
+ context_params = [
+ p for p in raw_context_params if p.name not in params_to_omit
+ ]
+ if context_params:
+ context_param_documenter = ClientContextParamsDocumenter(
+ self._service_name, context_params
+ )
+ context_param_documenter.document_context_params(section)
diff --git a/.venv/lib/python3.12/site-packages/botocore/docs/shape.py b/.venv/lib/python3.12/site-packages/botocore/docs/shape.py
new file mode 100644
index 00000000..640a5d18
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/docs/shape.py
@@ -0,0 +1,135 @@
+# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+
+
+# NOTE: This class should not be instantiated and its
+# ``traverse_and_document_shape`` method called directly. It should be
+# inherited from a Documenter class with the appropriate methods
+# and attributes.
+from botocore.utils import is_json_value_header
+
+
+class ShapeDocumenter:
+ EVENT_NAME = ''
+
+ def __init__(
+ self, service_name, operation_name, event_emitter, context=None
+ ):
+ self._service_name = service_name
+ self._operation_name = operation_name
+ self._event_emitter = event_emitter
+ self._context = context
+ if context is None:
+ self._context = {'special_shape_types': {}}
+
+ def traverse_and_document_shape(
+ self,
+ section,
+ shape,
+ history,
+ include=None,
+ exclude=None,
+ name=None,
+ is_required=False,
+ ):
+ """Traverses and documents a shape
+
+ Will take a self class and call its appropriate methods as a shape
+ is traversed.
+
+ :param section: The section to document.
+
+ :param history: A list of the names of the shapes that have been
+ traversed.
+
+ :type include: Dictionary where keys are parameter names and
+ values are the shapes of the parameter names.
+ :param include: The parameter shapes to include in the documentation.
+
+ :type exclude: List of the names of the parameters to exclude.
+ :param exclude: The names of the parameters to exclude from
+ documentation.
+
+ :param name: The name of the shape.
+
+ :param is_required: If the shape is a required member.
+ """
+ param_type = shape.type_name
+ if getattr(shape, 'serialization', {}).get('eventstream'):
+ param_type = 'event_stream'
+ if shape.name in history:
+ self.document_recursive_shape(section, shape, name=name)
+ else:
+ history.append(shape.name)
+ is_top_level_param = len(history) == 2
+ if hasattr(shape, 'is_document_type') and shape.is_document_type:
+ param_type = 'document'
+ getattr(
+ self,
+ f"document_shape_type_{param_type}",
+ self.document_shape_default,
+ )(
+ section,
+ shape,
+ history=history,
+ name=name,
+ include=include,
+ exclude=exclude,
+ is_top_level_param=is_top_level_param,
+ is_required=is_required,
+ )
+ if is_top_level_param:
+ self._event_emitter.emit(
+ f"docs.{self.EVENT_NAME}.{self._service_name}.{self._operation_name}.{name}",
+ section=section,
+ )
+ at_overlying_method_section = len(history) == 1
+ if at_overlying_method_section:
+ self._event_emitter.emit(
+ f"docs.{self.EVENT_NAME}.{self._service_name}.{self._operation_name}.complete-section",
+ section=section,
+ )
+ history.pop()
+
+ def _get_special_py_default(self, shape):
+ special_defaults = {
+ 'document_type': '{...}|[...]|123|123.4|\'string\'|True|None',
+ 'jsonvalue_header': '{...}|[...]|123|123.4|\'string\'|True|None',
+ 'streaming_input_shape': 'b\'bytes\'|file',
+ 'streaming_output_shape': 'StreamingBody()',
+ 'eventstream_output_shape': 'EventStream()',
+ }
+ return self._get_value_for_special_type(shape, special_defaults)
+
+ def _get_special_py_type_name(self, shape):
+ special_type_names = {
+ 'document_type': ':ref:`document<document>`',
+ 'jsonvalue_header': 'JSON serializable',
+ 'streaming_input_shape': 'bytes or seekable file-like object',
+ 'streaming_output_shape': ':class:`.StreamingBody`',
+ 'eventstream_output_shape': ':class:`.EventStream`',
+ }
+ return self._get_value_for_special_type(shape, special_type_names)
+
+ def _get_value_for_special_type(self, shape, special_type_map):
+ if is_json_value_header(shape):
+ return special_type_map['jsonvalue_header']
+ if hasattr(shape, 'is_document_type') and shape.is_document_type:
+ return special_type_map['document_type']
+ for special_type, marked_shape in self._context[
+ 'special_shape_types'
+ ].items():
+ if special_type in special_type_map:
+ if shape == marked_shape:
+ return special_type_map[special_type]
+ return None
diff --git a/.venv/lib/python3.12/site-packages/botocore/docs/sharedexample.py b/.venv/lib/python3.12/site-packages/botocore/docs/sharedexample.py
new file mode 100644
index 00000000..29d3df5f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/docs/sharedexample.py
@@ -0,0 +1,227 @@
+# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import numbers
+import re
+
+from botocore.docs.utils import escape_controls
+from botocore.utils import parse_timestamp
+
+
+class SharedExampleDocumenter:
+ def document_shared_example(
+ self, example, prefix, section, operation_model
+ ):
+ """Documents a single shared example based on its definition.
+
+ :param example: The model of the example
+
+ :param prefix: The prefix to use in the method example.
+
+ :param section: The section to write to.
+
+ :param operation_model: The model of the operation used in the example
+ """
+ section.style.new_paragraph()
+ section.write(example.get('description'))
+ section.style.new_line()
+ self.document_input(
+ section, example, prefix, operation_model.input_shape
+ )
+ self.document_output(section, example, operation_model.output_shape)
+
+ def document_input(self, section, example, prefix, shape):
+ input_section = section.add_new_section('input')
+ input_section.style.start_codeblock()
+ if prefix is not None:
+ input_section.write(prefix)
+ params = example.get('input', {})
+ comments = example.get('comments')
+ if comments:
+ comments = comments.get('input')
+ param_section = input_section.add_new_section('parameters')
+ self._document_params(param_section, params, comments, [], shape)
+ closing_section = input_section.add_new_section('input-close')
+ closing_section.style.new_line()
+ closing_section.style.new_line()
+ closing_section.write('print(response)')
+ closing_section.style.end_codeblock()
+
+ def document_output(self, section, example, shape):
+ output_section = section.add_new_section('output')
+ output_section.style.new_line()
+ output_section.write('Expected Output:')
+ output_section.style.new_line()
+ output_section.style.start_codeblock()
+ params = example.get('output', {})
+
+ # There might not be an output, but we will return metadata anyway
+ params['ResponseMetadata'] = {"...": "..."}
+ comments = example.get('comments')
+ if comments:
+ comments = comments.get('output')
+ self._document_dict(output_section, params, comments, [], shape, True)
+ closing_section = output_section.add_new_section('output-close')
+ closing_section.style.end_codeblock()
+
+ def _document(self, section, value, comments, path, shape):
+ """
+ :param section: The section to add the docs to.
+
+ :param value: The input / output values representing the parameters that
+ are included in the example.
+
+ :param comments: The dictionary containing all the comments to be
+ applied to the example.
+
+ :param path: A list describing where the documenter is in traversing the
+ parameters. This is used to find the equivalent location
+ in the comments dictionary.
+ """
+ if isinstance(value, dict):
+ self._document_dict(section, value, comments, path, shape)
+ elif isinstance(value, list):
+ self._document_list(section, value, comments, path, shape)
+ elif isinstance(value, numbers.Number):
+ self._document_number(section, value, path)
+ elif shape and shape.type_name == 'timestamp':
+ self._document_datetime(section, value, path)
+ else:
+ self._document_str(section, value, path)
+
+ def _document_dict(
+ self, section, value, comments, path, shape, top_level=False
+ ):
+ dict_section = section.add_new_section('dict-value')
+ self._start_nested_value(dict_section, '{')
+ for key, val in value.items():
+ path.append(f'.{key}')
+ item_section = dict_section.add_new_section(key)
+ item_section.style.new_line()
+ item_comment = self._get_comment(path, comments)
+ if item_comment:
+ item_section.write(item_comment)
+ item_section.style.new_line()
+ item_section.write(f"'{key}': ")
+
+ # Shape could be none if there is no output besides ResponseMetadata
+ item_shape = None
+ if shape:
+ if shape.type_name == 'structure':
+ item_shape = shape.members.get(key)
+ elif shape.type_name == 'map':
+ item_shape = shape.value
+ self._document(item_section, val, comments, path, item_shape)
+ path.pop()
+ dict_section_end = dict_section.add_new_section('ending-brace')
+ self._end_nested_value(dict_section_end, '}')
+ if not top_level:
+ dict_section_end.write(',')
+
+ def _document_params(self, section, value, comments, path, shape):
+ param_section = section.add_new_section('param-values')
+ self._start_nested_value(param_section, '(')
+ for key, val in value.items():
+ path.append(f'.{key}')
+ item_section = param_section.add_new_section(key)
+ item_section.style.new_line()
+ item_comment = self._get_comment(path, comments)
+ if item_comment:
+ item_section.write(item_comment)
+ item_section.style.new_line()
+ item_section.write(key + '=')
+
+ # Shape could be none if there are no input parameters
+ item_shape = None
+ if shape:
+ item_shape = shape.members.get(key)
+ self._document(item_section, val, comments, path, item_shape)
+ path.pop()
+ param_section_end = param_section.add_new_section('ending-parenthesis')
+ self._end_nested_value(param_section_end, ')')
+
+ def _document_list(self, section, value, comments, path, shape):
+ list_section = section.add_new_section('list-section')
+ self._start_nested_value(list_section, '[')
+ item_shape = shape.member
+ for index, val in enumerate(value):
+ item_section = list_section.add_new_section(index)
+ item_section.style.new_line()
+ path.append(f'[{index}]')
+ item_comment = self._get_comment(path, comments)
+ if item_comment:
+ item_section.write(item_comment)
+ item_section.style.new_line()
+ self._document(item_section, val, comments, path, item_shape)
+ path.pop()
+ list_section_end = list_section.add_new_section('ending-bracket')
+ self._end_nested_value(list_section_end, '],')
+
+ def _document_str(self, section, value, path):
+ # We do the string conversion because this might accept a type that
+ # we don't specifically address.
+ safe_value = escape_controls(value)
+ section.write(f"'{safe_value}',")
+
+ def _document_number(self, section, value, path):
+ section.write(f"{str(value)},")
+
+ def _document_datetime(self, section, value, path):
+ datetime_tuple = parse_timestamp(value).timetuple()
+ datetime_str = str(datetime_tuple[0])
+ for i in range(1, len(datetime_tuple)):
+ datetime_str += ", " + str(datetime_tuple[i])
+ section.write(f"datetime({datetime_str}),")
+
+ def _get_comment(self, path, comments):
+ key = re.sub(r'^\.', '', ''.join(path))
+ if comments and key in comments:
+ return '# ' + comments[key]
+ else:
+ return ''
+
+ def _start_nested_value(self, section, start):
+ section.write(start)
+ section.style.indent()
+ section.style.indent()
+
+ def _end_nested_value(self, section, end):
+ section.style.dedent()
+ section.style.dedent()
+ section.style.new_line()
+ section.write(end)
+
+
+def document_shared_examples(
+ section, operation_model, example_prefix, shared_examples
+):
+ """Documents the shared examples
+
+ :param section: The section to write to.
+
+ :param operation_model: The model of the operation.
+
+ :param example_prefix: The prefix to use in the method example.
+
+ :param shared_examples: The shared JSON examples from the model.
+ """
+ container_section = section.add_new_section('shared-examples')
+ container_section.style.new_paragraph()
+ container_section.style.bold('Examples')
+ documenter = SharedExampleDocumenter()
+ for example in shared_examples:
+ documenter.document_shared_example(
+ example=example,
+ section=container_section.add_new_section(example['id']),
+ prefix=example_prefix,
+ operation_model=operation_model,
+ )
diff --git a/.venv/lib/python3.12/site-packages/botocore/docs/translator.py b/.venv/lib/python3.12/site-packages/botocore/docs/translator.py
new file mode 100644
index 00000000..0b0a3089
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/docs/translator.py
@@ -0,0 +1,62 @@
+# Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+from docutils import nodes
+from sphinx.locale import admonitionlabels
+from sphinx.writers.html5 import HTML5Translator as SphinxHTML5Translator
+
+
+class BotoHTML5Translator(SphinxHTML5Translator):
+ """Extension of Sphinx's ``HTML5Translator`` for Botocore documentation."""
+
+ IGNORE_IMPLICIT_HEADINGS = [
+ '[REQUIRED]',
+ ]
+
+ def visit_admonition(self, node, name=""):
+ """Uses the h3 tag for admonition titles instead of the p tag."""
+ self.body.append(
+ self.starttag(node, "div", CLASS=("admonition " + name))
+ )
+ if name:
+ title = (
+ f"<h3 class='admonition-title'> {admonitionlabels[name]}</h3>"
+ )
+ self.body.append(title)
+
+ def is_implicit_heading(self, node):
+ """Determines if a node is an implicit heading.
+
+ An implicit heading is represented by a paragraph node whose only
+ child is a strong node with text that isnt in `IGNORE_IMPLICIT_HEADINGS`.
+ """
+ return (
+ len(node) == 1
+ and isinstance(node[0], nodes.strong)
+ and len(node[0]) == 1
+ and isinstance(node[0][0], nodes.Text)
+ and node[0][0].astext() not in self.IGNORE_IMPLICIT_HEADINGS
+ )
+
+ def visit_paragraph(self, node):
+ """Visit a paragraph HTML element.
+
+ Replaces implicit headings with an h3 tag and defers to default
+ behavior for normal paragraph elements.
+ """
+ if self.is_implicit_heading(node):
+ text = node[0][0]
+ self.body.append(f'<h3>{text}</h3>\n')
+ # Do not visit the current nodes children or call its depart method.
+ raise nodes.SkipNode
+ else:
+ super().visit_paragraph(node)
diff --git a/.venv/lib/python3.12/site-packages/botocore/docs/utils.py b/.venv/lib/python3.12/site-packages/botocore/docs/utils.py
new file mode 100644
index 00000000..161e2602
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/docs/utils.py
@@ -0,0 +1,225 @@
+# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import re
+from collections import namedtuple
+
+
+def py_type_name(type_name):
+ """Get the Python type name for a given model type.
+
+ >>> py_type_name('list')
+ 'list'
+ >>> py_type_name('structure')
+ 'dict'
+
+ :rtype: string
+ """
+ return {
+ 'blob': 'bytes',
+ 'character': 'string',
+ 'double': 'float',
+ 'long': 'integer',
+ 'map': 'dict',
+ 'structure': 'dict',
+ 'timestamp': 'datetime',
+ }.get(type_name, type_name)
+
+
+def py_default(type_name):
+ """Get the Python default value for a given model type.
+
+ >>> py_default('string')
+ '\'string\''
+ >>> py_default('list')
+ '[...]'
+ >>> py_default('unknown')
+ '...'
+
+ :rtype: string
+ """
+ return {
+ 'double': '123.0',
+ 'long': '123',
+ 'integer': '123',
+ 'string': "'string'",
+ 'blob': "b'bytes'",
+ 'boolean': 'True|False',
+ 'list': '[...]',
+ 'map': '{...}',
+ 'structure': '{...}',
+ 'timestamp': 'datetime(2015, 1, 1)',
+ }.get(type_name, '...')
+
+
+def get_official_service_name(service_model):
+ """Generate the official name of an AWS Service
+
+ :param service_model: The service model representing the service
+ """
+ official_name = service_model.metadata.get('serviceFullName')
+ short_name = service_model.metadata.get('serviceAbbreviation', '')
+ if short_name.startswith('Amazon'):
+ short_name = short_name[7:]
+ if short_name.startswith('AWS'):
+ short_name = short_name[4:]
+ if short_name and short_name.lower() not in official_name.lower():
+ official_name += f' ({short_name})'
+ return official_name
+
+
+_DocumentedShape = namedtuple(
+ 'DocumentedShape',
+ [
+ 'name',
+ 'type_name',
+ 'documentation',
+ 'metadata',
+ 'members',
+ 'required_members',
+ ],
+)
+
+
+class DocumentedShape(_DocumentedShape):
+ """Use this class to inject new shapes into a model for documentation"""
+
+ def __new__(
+ cls,
+ name,
+ type_name,
+ documentation,
+ metadata=None,
+ members=None,
+ required_members=None,
+ ):
+ if metadata is None:
+ metadata = []
+ if members is None:
+ members = []
+ if required_members is None:
+ required_members = []
+ return super().__new__(
+ cls,
+ name,
+ type_name,
+ documentation,
+ metadata,
+ members,
+ required_members,
+ )
+
+
+class AutoPopulatedParam:
+ def __init__(self, name, param_description=None):
+ self.name = name
+ self.param_description = param_description
+ if param_description is None:
+ self.param_description = (
+ 'Please note that this parameter is automatically populated '
+ 'if it is not provided. Including this parameter is not '
+ 'required\n'
+ )
+
+ def document_auto_populated_param(self, event_name, section, **kwargs):
+ """Documents auto populated parameters
+
+ It will remove any required marks for the parameter, remove the
+ parameter from the example, and add a snippet about the parameter
+ being autopopulated in the description.
+ """
+ if event_name.startswith('docs.request-params'):
+ if self.name in section.available_sections:
+ section = section.get_section(self.name)
+ if 'is-required' in section.available_sections:
+ section.delete_section('is-required')
+ description_section = section.get_section(
+ 'param-documentation'
+ )
+ description_section.writeln(self.param_description)
+ elif event_name.startswith('docs.request-example'):
+ section = section.get_section('structure-value')
+ if self.name in section.available_sections:
+ section.delete_section(self.name)
+
+
+class HideParamFromOperations:
+ """Hides a single parameter from multiple operations.
+
+ This method will remove a parameter from documentation and from
+ examples. This method is typically used for things that are
+ automatically populated because a user would be unable to provide
+ a value (e.g., a checksum of a serialized XML request body)."""
+
+ def __init__(self, service_name, parameter_name, operation_names):
+ """
+ :type service_name: str
+ :param service_name: Name of the service to modify.
+
+ :type parameter_name: str
+ :param parameter_name: Name of the parameter to modify.
+
+ :type operation_names: list
+ :param operation_names: Operation names to modify.
+ """
+ self._parameter_name = parameter_name
+ self._params_events = set()
+ self._example_events = set()
+ # Build up the sets of relevant event names.
+ param_template = 'docs.request-params.%s.%s.complete-section'
+ example_template = 'docs.request-example.%s.%s.complete-section'
+ for name in operation_names:
+ self._params_events.add(param_template % (service_name, name))
+ self._example_events.add(example_template % (service_name, name))
+
+ def hide_param(self, event_name, section, **kwargs):
+ if event_name in self._example_events:
+ # Modify the structure value for example events.
+ section = section.get_section('structure-value')
+ elif event_name not in self._params_events:
+ return
+ if self._parameter_name in section.available_sections:
+ section.delete_section(self._parameter_name)
+
+
+class AppendParamDocumentation:
+ """Appends documentation to a specific parameter"""
+
+ def __init__(self, parameter_name, doc_string):
+ self._parameter_name = parameter_name
+ self._doc_string = doc_string
+
+ def append_documentation(self, event_name, section, **kwargs):
+ if self._parameter_name in section.available_sections:
+ section = section.get_section(self._parameter_name)
+ description_section = section.get_section('param-documentation')
+ description_section.writeln(self._doc_string)
+
+
+_CONTROLS = {
+ '\n': '\\n',
+ '\r': '\\r',
+ '\t': '\\t',
+ '\b': '\\b',
+ '\f': '\\f',
+}
+# Combines all CONTROLS keys into a big or regular expression
+_ESCAPE_CONTROLS_RE = re.compile('|'.join(map(re.escape, _CONTROLS)))
+
+
+# Based on the match get the appropriate replacement from CONTROLS
+def _CONTROLS_MATCH_HANDLER(match):
+ return _CONTROLS[match.group(0)]
+
+
+def escape_controls(value):
+ return _ESCAPE_CONTROLS_RE.sub(_CONTROLS_MATCH_HANDLER, value)
diff --git a/.venv/lib/python3.12/site-packages/botocore/docs/waiter.py b/.venv/lib/python3.12/site-packages/botocore/docs/waiter.py
new file mode 100644
index 00000000..2918602d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/docs/waiter.py
@@ -0,0 +1,180 @@
+# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import os
+
+from botocore import xform_name
+from botocore.compat import OrderedDict
+from botocore.docs.bcdoc.restdoc import DocumentStructure
+from botocore.docs.method import document_model_driven_method
+from botocore.docs.utils import DocumentedShape
+from botocore.utils import get_service_module_name
+
+
+class WaiterDocumenter:
+ def __init__(self, client, service_waiter_model, root_docs_path):
+ self._client = client
+ self._client_class_name = self._client.__class__.__name__
+ self._service_name = self._client.meta.service_model.service_name
+ self._service_waiter_model = service_waiter_model
+ self._root_docs_path = root_docs_path
+ self._USER_GUIDE_LINK = (
+ 'https://boto3.amazonaws.com/'
+ 'v1/documentation/api/latest/guide/clients.html#waiters'
+ )
+
+ def document_waiters(self, section):
+ """Documents the various waiters for a service.
+
+ :param section: The section to write to.
+ """
+ section.style.h2('Waiters')
+ self._add_overview(section)
+ section.style.new_line()
+ section.writeln('The available waiters are:')
+ section.style.toctree()
+ for waiter_name in self._service_waiter_model.waiter_names:
+ section.style.tocitem(f'{self._service_name}/waiter/{waiter_name}')
+ # Create a new DocumentStructure for each waiter and add contents.
+ waiter_doc_structure = DocumentStructure(
+ waiter_name, target='html'
+ )
+ self._add_single_waiter(waiter_doc_structure, waiter_name)
+ # Write waiters in individual/nested files.
+ # Path: <root>/reference/services/<service>/waiter/<waiter_name>.rst
+ waiter_dir_path = os.path.join(
+ self._root_docs_path, self._service_name, 'waiter'
+ )
+ waiter_doc_structure.write_to_file(waiter_dir_path, waiter_name)
+
+ def _add_single_waiter(self, section, waiter_name):
+ breadcrumb_section = section.add_new_section('breadcrumb')
+ breadcrumb_section.style.ref(
+ self._client_class_name, f'../../{self._service_name}'
+ )
+ breadcrumb_section.write(f' / Waiter / {waiter_name}')
+ section.add_title_section(waiter_name)
+ waiter_section = section.add_new_section(waiter_name)
+ waiter_section.style.start_sphinx_py_class(
+ class_name=f"{self._client_class_name}.Waiter.{waiter_name}"
+ )
+
+ # Add example on how to instantiate waiter.
+ waiter_section.style.start_codeblock()
+ waiter_section.style.new_line()
+ waiter_section.write(
+ f'waiter = client.get_waiter(\'{xform_name(waiter_name)}\')'
+ )
+ waiter_section.style.end_codeblock()
+
+ # Add information on the wait() method
+ waiter_section.style.new_line()
+ document_wait_method(
+ section=waiter_section,
+ waiter_name=waiter_name,
+ event_emitter=self._client.meta.events,
+ service_model=self._client.meta.service_model,
+ service_waiter_model=self._service_waiter_model,
+ )
+
+ def _add_overview(self, section):
+ section.style.new_line()
+ section.write(
+ 'Waiters are available on a client instance '
+ 'via the ``get_waiter`` method. For more detailed instructions '
+ 'and examples on the usage or waiters, see the '
+ 'waiters '
+ )
+ section.style.external_link(
+ title='user guide',
+ link=self._USER_GUIDE_LINK,
+ )
+ section.write('.')
+ section.style.new_line()
+
+
+def document_wait_method(
+ section,
+ waiter_name,
+ event_emitter,
+ service_model,
+ service_waiter_model,
+ include_signature=True,
+):
+ """Documents a the wait method of a waiter
+
+ :param section: The section to write to
+
+ :param waiter_name: The name of the waiter
+
+ :param event_emitter: The event emitter to use to emit events
+
+ :param service_model: The service model
+
+ :param service_waiter_model: The waiter model associated to the service
+
+ :param include_signature: Whether or not to include the signature.
+ It is useful for generating docstrings.
+ """
+ waiter_model = service_waiter_model.get_waiter(waiter_name)
+ operation_model = service_model.operation_model(waiter_model.operation)
+
+ waiter_config_members = OrderedDict()
+
+ waiter_config_members['Delay'] = DocumentedShape(
+ name='Delay',
+ type_name='integer',
+ documentation=(
+ '<p>The amount of time in seconds to wait between '
+ f'attempts. Default: {waiter_model.delay}</p>'
+ ),
+ )
+
+ waiter_config_members['MaxAttempts'] = DocumentedShape(
+ name='MaxAttempts',
+ type_name='integer',
+ documentation=(
+ '<p>The maximum number of attempts to be made. '
+ f'Default: {waiter_model.max_attempts}</p>'
+ ),
+ )
+
+ botocore_waiter_params = [
+ DocumentedShape(
+ name='WaiterConfig',
+ type_name='structure',
+ documentation=(
+ '<p>A dictionary that provides parameters to control '
+ 'waiting behavior.</p>'
+ ),
+ members=waiter_config_members,
+ )
+ ]
+
+ wait_description = (
+ f'Polls :py:meth:`{get_service_module_name(service_model)}.Client.'
+ f'{xform_name(waiter_model.operation)}` every {waiter_model.delay} '
+ 'seconds until a successful state is reached. An error is '
+ f'raised after {waiter_model.max_attempts} failed checks.'
+ )
+
+ document_model_driven_method(
+ section,
+ 'wait',
+ operation_model,
+ event_emitter=event_emitter,
+ method_description=wait_description,
+ example_prefix='waiter.wait',
+ include_input=botocore_waiter_params,
+ document_output=False,
+ include_signature=include_signature,
+ )
diff --git a/.venv/lib/python3.12/site-packages/botocore/endpoint.py b/.venv/lib/python3.12/site-packages/botocore/endpoint.py
new file mode 100644
index 00000000..1c2cee06
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/endpoint.py
@@ -0,0 +1,449 @@
+# Copyright (c) 2012-2013 Mitch Garnaat http://garnaat.org/
+# Copyright 2012-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+
+import datetime
+import logging
+import os
+import threading
+import time
+import uuid
+
+from botocore import parsers
+from botocore.awsrequest import create_request_object
+from botocore.exceptions import HTTPClientError
+from botocore.history import get_global_history_recorder
+from botocore.hooks import first_non_none_response
+from botocore.httpchecksum import handle_checksum_body
+from botocore.httpsession import URLLib3Session
+from botocore.response import StreamingBody
+from botocore.utils import (
+ get_environ_proxies,
+ is_valid_endpoint_url,
+ is_valid_ipv6_endpoint_url,
+)
+
+logger = logging.getLogger(__name__)
+history_recorder = get_global_history_recorder()
+DEFAULT_TIMEOUT = 60
+MAX_POOL_CONNECTIONS = 10
+
+
+def convert_to_response_dict(http_response, operation_model):
+ """Convert an HTTP response object to a request dict.
+
+ This converts the requests library's HTTP response object to
+ a dictionary.
+
+ :type http_response: botocore.vendored.requests.model.Response
+ :param http_response: The HTTP response from an AWS service request.
+
+ :rtype: dict
+ :return: A response dictionary which will contain the following keys:
+ * headers (dict)
+ * status_code (int)
+ * body (string or file-like object)
+
+ """
+ response_dict = {
+ 'headers': http_response.headers,
+ 'status_code': http_response.status_code,
+ 'context': {
+ 'operation_name': operation_model.name,
+ },
+ }
+ if response_dict['status_code'] >= 300:
+ response_dict['body'] = http_response.content
+ elif operation_model.has_event_stream_output:
+ response_dict['body'] = http_response.raw
+ elif operation_model.has_streaming_output:
+ length = response_dict['headers'].get('content-length')
+ response_dict['body'] = StreamingBody(http_response.raw, length)
+ else:
+ response_dict['body'] = http_response.content
+ return response_dict
+
+
+class Endpoint:
+ """
+ Represents an endpoint for a particular service in a specific
+ region. Only an endpoint can make requests.
+
+ :ivar service: The Service object that describes this endpoints
+ service.
+ :ivar host: The fully qualified endpoint hostname.
+ :ivar session: The session object.
+ """
+
+ def __init__(
+ self,
+ host,
+ endpoint_prefix,
+ event_emitter,
+ response_parser_factory=None,
+ http_session=None,
+ ):
+ self._endpoint_prefix = endpoint_prefix
+ self._event_emitter = event_emitter
+ self.host = host
+ self._lock = threading.Lock()
+ if response_parser_factory is None:
+ response_parser_factory = parsers.ResponseParserFactory()
+ self._response_parser_factory = response_parser_factory
+ self.http_session = http_session
+ if self.http_session is None:
+ self.http_session = URLLib3Session()
+
+ def __repr__(self):
+ return f'{self._endpoint_prefix}({self.host})'
+
+ def close(self):
+ self.http_session.close()
+
+ def make_request(self, operation_model, request_dict):
+ logger.debug(
+ "Making request for %s with params: %s",
+ operation_model,
+ request_dict,
+ )
+ return self._send_request(request_dict, operation_model)
+
+ def create_request(self, params, operation_model=None):
+ request = create_request_object(params)
+ if operation_model:
+ request.stream_output = any(
+ [
+ operation_model.has_streaming_output,
+ operation_model.has_event_stream_output,
+ ]
+ )
+ service_id = operation_model.service_model.service_id.hyphenize()
+ event_name = f'request-created.{service_id}.{operation_model.name}'
+ self._event_emitter.emit(
+ event_name,
+ request=request,
+ operation_name=operation_model.name,
+ )
+ prepared_request = self.prepare_request(request)
+ return prepared_request
+
+ def _encode_headers(self, headers):
+ # In place encoding of headers to utf-8 if they are unicode.
+ for key, value in headers.items():
+ if isinstance(value, str):
+ headers[key] = value.encode('utf-8')
+
+ def prepare_request(self, request):
+ self._encode_headers(request.headers)
+ return request.prepare()
+
+ def _calculate_ttl(
+ self, response_received_timestamp, date_header, read_timeout
+ ):
+ local_timestamp = datetime.datetime.utcnow()
+ date_conversion = datetime.datetime.strptime(
+ date_header, "%a, %d %b %Y %H:%M:%S %Z"
+ )
+ estimated_skew = date_conversion - response_received_timestamp
+ ttl = (
+ local_timestamp
+ + datetime.timedelta(seconds=read_timeout)
+ + estimated_skew
+ )
+ return ttl.strftime('%Y%m%dT%H%M%SZ')
+
+ def _set_ttl(self, retries_context, read_timeout, success_response):
+ response_date_header = success_response[0].headers.get('Date')
+ has_streaming_input = retries_context.get('has_streaming_input')
+ if response_date_header and not has_streaming_input:
+ try:
+ response_received_timestamp = datetime.datetime.utcnow()
+ retries_context['ttl'] = self._calculate_ttl(
+ response_received_timestamp,
+ response_date_header,
+ read_timeout,
+ )
+ except Exception:
+ logger.debug(
+ "Exception received when updating retries context with TTL",
+ exc_info=True,
+ )
+
+ def _update_retries_context(self, context, attempt, success_response=None):
+ retries_context = context.setdefault('retries', {})
+ retries_context['attempt'] = attempt
+ if 'invocation-id' not in retries_context:
+ retries_context['invocation-id'] = str(uuid.uuid4())
+
+ if success_response:
+ read_timeout = context['client_config'].read_timeout
+ self._set_ttl(retries_context, read_timeout, success_response)
+
+ def _send_request(self, request_dict, operation_model):
+ attempts = 1
+ context = request_dict['context']
+ self._update_retries_context(context, attempts)
+ request = self.create_request(request_dict, operation_model)
+ success_response, exception = self._get_response(
+ request, operation_model, context
+ )
+ while self._needs_retry(
+ attempts,
+ operation_model,
+ request_dict,
+ success_response,
+ exception,
+ ):
+ attempts += 1
+ self._update_retries_context(context, attempts, success_response)
+ # If there is a stream associated with the request, we need
+ # to reset it before attempting to send the request again.
+ # This will ensure that we resend the entire contents of the
+ # body.
+ request.reset_stream()
+ # Create a new request when retried (including a new signature).
+ request = self.create_request(request_dict, operation_model)
+ success_response, exception = self._get_response(
+ request, operation_model, context
+ )
+ if (
+ success_response is not None
+ and 'ResponseMetadata' in success_response[1]
+ ):
+ # We want to share num retries, not num attempts.
+ total_retries = attempts - 1
+ success_response[1]['ResponseMetadata']['RetryAttempts'] = (
+ total_retries
+ )
+ if exception is not None:
+ raise exception
+ else:
+ return success_response
+
+ def _get_response(self, request, operation_model, context):
+ # This will return a tuple of (success_response, exception)
+ # and success_response is itself a tuple of
+ # (http_response, parsed_dict).
+ # If an exception occurs then the success_response is None.
+ # If no exception occurs then exception is None.
+ success_response, exception = self._do_get_response(
+ request, operation_model, context
+ )
+ kwargs_to_emit = {
+ 'response_dict': None,
+ 'parsed_response': None,
+ 'context': context,
+ 'exception': exception,
+ }
+ if success_response is not None:
+ http_response, parsed_response = success_response
+ kwargs_to_emit['parsed_response'] = parsed_response
+ kwargs_to_emit['response_dict'] = convert_to_response_dict(
+ http_response, operation_model
+ )
+ service_id = operation_model.service_model.service_id.hyphenize()
+ self._event_emitter.emit(
+ f"response-received.{service_id}.{operation_model.name}",
+ **kwargs_to_emit,
+ )
+ return success_response, exception
+
+ def _do_get_response(self, request, operation_model, context):
+ try:
+ logger.debug("Sending http request: %s", request)
+ history_recorder.record(
+ 'HTTP_REQUEST',
+ {
+ 'method': request.method,
+ 'headers': request.headers,
+ 'streaming': operation_model.has_streaming_input,
+ 'url': request.url,
+ 'body': request.body,
+ },
+ )
+ service_id = operation_model.service_model.service_id.hyphenize()
+ event_name = f"before-send.{service_id}.{operation_model.name}"
+ responses = self._event_emitter.emit(event_name, request=request)
+ http_response = first_non_none_response(responses)
+ if http_response is None:
+ http_response = self._send(request)
+ except HTTPClientError as e:
+ return (None, e)
+ except Exception as e:
+ logger.debug(
+ "Exception received when sending HTTP request.", exc_info=True
+ )
+ return (None, e)
+ # This returns the http_response and the parsed_data.
+ response_dict = convert_to_response_dict(
+ http_response, operation_model
+ )
+ handle_checksum_body(
+ http_response,
+ response_dict,
+ context,
+ operation_model,
+ )
+
+ http_response_record_dict = response_dict.copy()
+ http_response_record_dict['streaming'] = (
+ operation_model.has_streaming_output
+ )
+ history_recorder.record('HTTP_RESPONSE', http_response_record_dict)
+
+ protocol = operation_model.metadata['protocol']
+ customized_response_dict = {}
+ self._event_emitter.emit(
+ f"before-parse.{service_id}.{operation_model.name}",
+ operation_model=operation_model,
+ response_dict=response_dict,
+ customized_response_dict=customized_response_dict,
+ )
+ parser = self._response_parser_factory.create_parser(protocol)
+ parsed_response = parser.parse(
+ response_dict, operation_model.output_shape
+ )
+ parsed_response.update(customized_response_dict)
+ # Do a second parsing pass to pick up on any modeled error fields
+ # NOTE: Ideally, we would push this down into the parser classes but
+ # they currently have no reference to the operation or service model
+ # The parsers should probably take the operation model instead of
+ # output shape but we can't change that now
+ if http_response.status_code >= 300:
+ self._add_modeled_error_fields(
+ response_dict,
+ parsed_response,
+ operation_model,
+ parser,
+ )
+ history_recorder.record('PARSED_RESPONSE', parsed_response)
+ return (http_response, parsed_response), None
+
+ def _add_modeled_error_fields(
+ self,
+ response_dict,
+ parsed_response,
+ operation_model,
+ parser,
+ ):
+ error_code = parsed_response.get("Error", {}).get("Code")
+ if error_code is None:
+ return
+ service_model = operation_model.service_model
+ error_shape = service_model.shape_for_error_code(error_code)
+ if error_shape is None:
+ return
+ modeled_parse = parser.parse(response_dict, error_shape)
+ # TODO: avoid naming conflicts with ResponseMetadata and Error
+ parsed_response.update(modeled_parse)
+
+ def _needs_retry(
+ self,
+ attempts,
+ operation_model,
+ request_dict,
+ response=None,
+ caught_exception=None,
+ ):
+ service_id = operation_model.service_model.service_id.hyphenize()
+ event_name = f"needs-retry.{service_id}.{operation_model.name}"
+ responses = self._event_emitter.emit(
+ event_name,
+ response=response,
+ endpoint=self,
+ operation=operation_model,
+ attempts=attempts,
+ caught_exception=caught_exception,
+ request_dict=request_dict,
+ )
+ handler_response = first_non_none_response(responses)
+ if handler_response is None:
+ return False
+ else:
+ # Request needs to be retried, and we need to sleep
+ # for the specified number of times.
+ logger.debug(
+ "Response received to retry, sleeping for %s seconds",
+ handler_response,
+ )
+ time.sleep(handler_response)
+ return True
+
+ def _send(self, request):
+ return self.http_session.send(request)
+
+
+class EndpointCreator:
+ def __init__(self, event_emitter):
+ self._event_emitter = event_emitter
+
+ def create_endpoint(
+ self,
+ service_model,
+ region_name,
+ endpoint_url,
+ verify=None,
+ response_parser_factory=None,
+ timeout=DEFAULT_TIMEOUT,
+ max_pool_connections=MAX_POOL_CONNECTIONS,
+ http_session_cls=URLLib3Session,
+ proxies=None,
+ socket_options=None,
+ client_cert=None,
+ proxies_config=None,
+ ):
+ if not is_valid_endpoint_url(
+ endpoint_url
+ ) and not is_valid_ipv6_endpoint_url(endpoint_url):
+ raise ValueError(f"Invalid endpoint: {endpoint_url}")
+
+ if proxies is None:
+ proxies = self._get_proxies(endpoint_url)
+ endpoint_prefix = service_model.endpoint_prefix
+
+ logger.debug('Setting %s timeout as %s', endpoint_prefix, timeout)
+ http_session = http_session_cls(
+ timeout=timeout,
+ proxies=proxies,
+ verify=self._get_verify_value(verify),
+ max_pool_connections=max_pool_connections,
+ socket_options=socket_options,
+ client_cert=client_cert,
+ proxies_config=proxies_config,
+ )
+
+ return Endpoint(
+ endpoint_url,
+ endpoint_prefix=endpoint_prefix,
+ event_emitter=self._event_emitter,
+ response_parser_factory=response_parser_factory,
+ http_session=http_session,
+ )
+
+ def _get_proxies(self, url):
+ # We could also support getting proxies from a config file,
+ # but for now proxy support is taken from the environment.
+ return get_environ_proxies(url)
+
+ def _get_verify_value(self, verify):
+ # This is to account for:
+ # https://github.com/kennethreitz/requests/issues/1436
+ # where we need to honor REQUESTS_CA_BUNDLE because we're creating our
+ # own request objects.
+ # First, if verify is not None, then the user explicitly specified
+ # a value so this automatically wins.
+ if verify is not None:
+ return verify
+ # Otherwise use the value from REQUESTS_CA_BUNDLE, or default to
+ # True if the env var does not exist.
+ return os.environ.get('REQUESTS_CA_BUNDLE', True)
diff --git a/.venv/lib/python3.12/site-packages/botocore/endpoint_provider.py b/.venv/lib/python3.12/site-packages/botocore/endpoint_provider.py
new file mode 100644
index 00000000..d76f9ac2
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/endpoint_provider.py
@@ -0,0 +1,723 @@
+# Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+
+"""
+NOTE: All classes and functions in this module are considered private and are
+subject to abrupt breaking changes. Please do not use them directly.
+
+To view the raw JSON that the objects in this module represent, please
+go to any `endpoint-rule-set.json` file in /botocore/data/<service>/<api version>/
+or you can look at the test files in /tests/unit/data/endpoints/valid-rules/
+"""
+
+import logging
+import re
+from enum import Enum
+from string import Formatter
+from typing import NamedTuple
+
+from botocore import xform_name
+from botocore.compat import IPV4_RE, quote, urlparse
+from botocore.exceptions import EndpointResolutionError
+from botocore.utils import (
+ ArnParser,
+ InvalidArnException,
+ is_valid_ipv4_endpoint_url,
+ is_valid_ipv6_endpoint_url,
+ lru_cache_weakref,
+ normalize_url_path,
+ percent_encode,
+)
+
+logger = logging.getLogger(__name__)
+
+TEMPLATE_STRING_RE = re.compile(r"\{[a-zA-Z#]+\}")
+GET_ATTR_RE = re.compile(r"(\w*)\[(\d+)\]")
+VALID_HOST_LABEL_RE = re.compile(
+ r"^(?!-)[a-zA-Z\d-]{1,63}(?<!-)$",
+)
+CACHE_SIZE = 100
+ARN_PARSER = ArnParser()
+STRING_FORMATTER = Formatter()
+
+
+class RuleSetStandardLibrary:
+ """Rule actions to be performed by the EndpointProvider."""
+
+ def __init__(self, partitions_data):
+ self.partitions_data = partitions_data
+
+ def is_func(self, argument):
+ """Determine if an object is a function object.
+
+ :type argument: Any
+ :rtype: bool
+ """
+ return isinstance(argument, dict) and "fn" in argument
+
+ def is_ref(self, argument):
+ """Determine if an object is a reference object.
+
+ :type argument: Any
+ :rtype: bool
+ """
+ return isinstance(argument, dict) and "ref" in argument
+
+ def is_template(self, argument):
+ """Determine if an object contains a template string.
+
+ :type argument: Any
+ :rtpe: bool
+ """
+ return (
+ isinstance(argument, str)
+ and TEMPLATE_STRING_RE.search(argument) is not None
+ )
+
+ def resolve_template_string(self, value, scope_vars):
+ """Resolve and inject values into a template string.
+
+ :type value: str
+ :type scope_vars: dict
+ :rtype: str
+ """
+ result = ""
+ for literal, reference, _, _ in STRING_FORMATTER.parse(value):
+ if reference is not None:
+ template_value = scope_vars
+ template_params = reference.split("#")
+ for param in template_params:
+ template_value = template_value[param]
+ result += f"{literal}{template_value}"
+ else:
+ result += literal
+ return result
+
+ def resolve_value(self, value, scope_vars):
+ """Return evaluated value based on type.
+
+ :type value: Any
+ :type scope_vars: dict
+ :rtype: Any
+ """
+ if self.is_func(value):
+ return self.call_function(value, scope_vars)
+ elif self.is_ref(value):
+ return scope_vars.get(value["ref"])
+ elif self.is_template(value):
+ return self.resolve_template_string(value, scope_vars)
+
+ return value
+
+ def convert_func_name(self, value):
+ """Normalize function names.
+
+ :type value: str
+ :rtype: str
+ """
+ normalized_name = f"{xform_name(value)}"
+ if normalized_name == "not":
+ normalized_name = f"_{normalized_name}"
+ return normalized_name.replace(".", "_")
+
+ def call_function(self, func_signature, scope_vars):
+ """Call the function with the resolved arguments and assign to `scope_vars`
+ when applicable.
+
+ :type func_signature: dict
+ :type scope_vars: dict
+ :rtype: Any
+ """
+ func_args = [
+ self.resolve_value(arg, scope_vars)
+ for arg in func_signature["argv"]
+ ]
+ func_name = self.convert_func_name(func_signature["fn"])
+ func = getattr(self, func_name)
+ result = func(*func_args)
+ if "assign" in func_signature:
+ assign = func_signature["assign"]
+ if assign in scope_vars:
+ raise EndpointResolutionError(
+ msg=f"Assignment {assign} already exists in "
+ "scoped variables and cannot be overwritten"
+ )
+ scope_vars[assign] = result
+ return result
+
+ def is_set(self, value):
+ """Evaluates whether a value is set.
+
+ :type value: Any
+ :rytpe: bool
+ """
+ return value is not None
+
+ def get_attr(self, value, path):
+ """Find an attribute within a value given a path string. The path can contain
+ the name of the attribute and an index in brackets. A period separating attribute
+ names indicates the one to the right is nested. The index will always occur at
+ the end of the path.
+
+ :type value: dict or tuple
+ :type path: str
+ :rtype: Any
+ """
+ for part in path.split("."):
+ match = GET_ATTR_RE.search(part)
+ if match is not None:
+ name, index = match.groups()
+ index = int(index)
+ if name:
+ value = value.get(name)
+ if value is None or index >= len(value):
+ return None
+ return value[index]
+ else:
+ value = value[part]
+ return value
+
+ def format_partition_output(self, partition):
+ output = partition["outputs"]
+ output["name"] = partition["id"]
+ return output
+
+ def is_partition_match(self, region, partition):
+ matches_regex = re.match(partition["regionRegex"], region) is not None
+ return region in partition["regions"] or matches_regex
+
+ def aws_partition(self, value):
+ """Match a region string to an AWS partition.
+
+ :type value: str
+ :rtype: dict
+ """
+ partitions = self.partitions_data['partitions']
+
+ if value is not None:
+ for partition in partitions:
+ if self.is_partition_match(value, partition):
+ return self.format_partition_output(partition)
+
+ # return the default partition if no matches were found
+ aws_partition = partitions[0]
+ return self.format_partition_output(aws_partition)
+
+ def aws_parse_arn(self, value):
+ """Parse and validate string for ARN components.
+
+ :type value: str
+ :rtype: dict
+ """
+ if value is None or not value.startswith("arn:"):
+ return None
+
+ try:
+ arn_dict = ARN_PARSER.parse_arn(value)
+ except InvalidArnException:
+ return None
+
+ # partition, resource, and service are required
+ if not all(
+ (arn_dict["partition"], arn_dict["service"], arn_dict["resource"])
+ ):
+ return None
+
+ arn_dict["accountId"] = arn_dict.pop("account")
+
+ resource = arn_dict.pop("resource")
+ arn_dict["resourceId"] = resource.replace(":", "/").split("/")
+
+ return arn_dict
+
+ def is_valid_host_label(self, value, allow_subdomains):
+ """Evaluates whether a value is a valid host label per
+ RFC 1123. If allow_subdomains is True, split on `.` and validate
+ each component separately.
+
+ :type value: str
+ :type allow_subdomains: bool
+ :rtype: bool
+ """
+ if value is None or allow_subdomains is False and value.count(".") > 0:
+ return False
+
+ if allow_subdomains is True:
+ return all(
+ self.is_valid_host_label(label, False)
+ for label in value.split(".")
+ )
+
+ return VALID_HOST_LABEL_RE.match(value) is not None
+
+ def string_equals(self, value1, value2):
+ """Evaluates two string values for equality.
+
+ :type value1: str
+ :type value2: str
+ :rtype: bool
+ """
+ if not all(isinstance(val, str) for val in (value1, value2)):
+ msg = f"Both values must be strings, not {type(value1)} and {type(value2)}."
+ raise EndpointResolutionError(msg=msg)
+ return value1 == value2
+
+ def uri_encode(self, value):
+ """Perform percent-encoding on an input string.
+
+ :type value: str
+ :rytpe: str
+ """
+ if value is None:
+ return None
+
+ return percent_encode(value)
+
+ def parse_url(self, value):
+ """Parse a URL string into components.
+
+ :type value: str
+ :rtype: dict
+ """
+ if value is None:
+ return None
+
+ url_components = urlparse(value)
+ try:
+ # url_parse may assign non-integer values to
+ # `port` and will fail when accessed.
+ url_components.port
+ except ValueError:
+ return None
+
+ scheme = url_components.scheme
+ query = url_components.query
+ # URLs with queries are not supported
+ if scheme not in ("https", "http") or len(query) > 0:
+ return None
+
+ path = url_components.path
+ normalized_path = quote(normalize_url_path(path))
+ if not normalized_path.endswith("/"):
+ normalized_path = f"{normalized_path}/"
+
+ return {
+ "scheme": scheme,
+ "authority": url_components.netloc,
+ "path": path,
+ "normalizedPath": normalized_path,
+ "isIp": is_valid_ipv4_endpoint_url(value)
+ or is_valid_ipv6_endpoint_url(value),
+ }
+
+ def boolean_equals(self, value1, value2):
+ """Evaluates two boolean values for equality.
+
+ :type value1: bool
+ :type value2: bool
+ :rtype: bool
+ """
+ if not all(isinstance(val, bool) for val in (value1, value2)):
+ msg = f"Both arguments must be bools, not {type(value1)} and {type(value2)}."
+ raise EndpointResolutionError(msg=msg)
+ return value1 is value2
+
+ def is_ascii(self, value):
+ """Evaluates if a string only contains ASCII characters.
+
+ :type value: str
+ :rtype: bool
+ """
+ try:
+ value.encode("ascii")
+ return True
+ except UnicodeEncodeError:
+ return False
+
+ def substring(self, value, start, stop, reverse):
+ """Computes a substring given the start index and end index. If `reverse` is
+ True, slice the string from the end instead.
+
+ :type value: str
+ :type start: int
+ :type end: int
+ :type reverse: bool
+ :rtype: str
+ """
+ if not isinstance(value, str):
+ msg = f"Input must be a string, not {type(value)}."
+ raise EndpointResolutionError(msg=msg)
+ if start >= stop or len(value) < stop or not self.is_ascii(value):
+ return None
+
+ if reverse is True:
+ r_start = len(value) - stop
+ r_stop = len(value) - start
+ return value[r_start:r_stop]
+
+ return value[start:stop]
+
+ def _not(self, value):
+ """A function implementation of the logical operator `not`.
+
+ :type value: Any
+ :rtype: bool
+ """
+ return not value
+
+ def aws_is_virtual_hostable_s3_bucket(self, value, allow_subdomains):
+ """Evaluates whether a value is a valid bucket name for virtual host
+ style bucket URLs. To pass, the value must meet the following criteria:
+ 1. is_valid_host_label(value) is True
+ 2. length between 3 and 63 characters (inclusive)
+ 3. does not contain uppercase characters
+ 4. is not formatted as an IP address
+
+ If allow_subdomains is True, split on `.` and validate
+ each component separately.
+
+ :type value: str
+ :type allow_subdomains: bool
+ :rtype: bool
+ """
+ if (
+ value is None
+ or len(value) < 3
+ or value.lower() != value
+ or IPV4_RE.match(value) is not None
+ ):
+ return False
+
+ return self.is_valid_host_label(
+ value, allow_subdomains=allow_subdomains
+ )
+
+
+# maintains backwards compatibility as `Library` was misspelled
+# in earlier versions
+RuleSetStandardLibary = RuleSetStandardLibrary
+
+
+class BaseRule:
+ """Base interface for individual endpoint rules."""
+
+ def __init__(self, conditions, documentation=None):
+ self.conditions = conditions
+ self.documentation = documentation
+
+ def evaluate(self, scope_vars, rule_lib):
+ raise NotImplementedError()
+
+ def evaluate_conditions(self, scope_vars, rule_lib):
+ """Determine if all conditions in a rule are met.
+
+ :type scope_vars: dict
+ :type rule_lib: RuleSetStandardLibrary
+ :rtype: bool
+ """
+ for func_signature in self.conditions:
+ result = rule_lib.call_function(func_signature, scope_vars)
+ if result is False or result is None:
+ return False
+ return True
+
+
+class RuleSetEndpoint(NamedTuple):
+ """A resolved endpoint object returned by a rule."""
+
+ url: str
+ properties: dict
+ headers: dict
+
+
+class EndpointRule(BaseRule):
+ def __init__(self, endpoint, **kwargs):
+ super().__init__(**kwargs)
+ self.endpoint = endpoint
+
+ def evaluate(self, scope_vars, rule_lib):
+ """Determine if conditions are met to provide a valid endpoint.
+
+ :type scope_vars: dict
+ :rtype: RuleSetEndpoint
+ """
+ if self.evaluate_conditions(scope_vars, rule_lib):
+ url = rule_lib.resolve_value(self.endpoint["url"], scope_vars)
+ properties = self.resolve_properties(
+ self.endpoint.get("properties", {}),
+ scope_vars,
+ rule_lib,
+ )
+ headers = self.resolve_headers(scope_vars, rule_lib)
+ return RuleSetEndpoint(
+ url=url, properties=properties, headers=headers
+ )
+
+ return None
+
+ def resolve_properties(self, properties, scope_vars, rule_lib):
+ """Traverse `properties` attribute, resolving any template strings.
+
+ :type properties: dict/list/str
+ :type scope_vars: dict
+ :type rule_lib: RuleSetStandardLibrary
+ :rtype: dict
+ """
+ if isinstance(properties, list):
+ return [
+ self.resolve_properties(prop, scope_vars, rule_lib)
+ for prop in properties
+ ]
+ elif isinstance(properties, dict):
+ return {
+ key: self.resolve_properties(value, scope_vars, rule_lib)
+ for key, value in properties.items()
+ }
+ elif rule_lib.is_template(properties):
+ return rule_lib.resolve_template_string(properties, scope_vars)
+
+ return properties
+
+ def resolve_headers(self, scope_vars, rule_lib):
+ """Iterate through headers attribute resolving all values.
+
+ :type scope_vars: dict
+ :type rule_lib: RuleSetStandardLibrary
+ :rtype: dict
+ """
+ resolved_headers = {}
+ headers = self.endpoint.get("headers", {})
+
+ for header, values in headers.items():
+ resolved_headers[header] = [
+ rule_lib.resolve_value(item, scope_vars) for item in values
+ ]
+ return resolved_headers
+
+
+class ErrorRule(BaseRule):
+ def __init__(self, error, **kwargs):
+ super().__init__(**kwargs)
+ self.error = error
+
+ def evaluate(self, scope_vars, rule_lib):
+ """If an error rule's conditions are met, raise an error rule.
+
+ :type scope_vars: dict
+ :type rule_lib: RuleSetStandardLibrary
+ :rtype: EndpointResolutionError
+ """
+ if self.evaluate_conditions(scope_vars, rule_lib):
+ error = rule_lib.resolve_value(self.error, scope_vars)
+ raise EndpointResolutionError(msg=error)
+ return None
+
+
+class TreeRule(BaseRule):
+ """A tree rule is non-terminal meaning it will never be returned to a provider.
+ Additionally this means it has no attributes that need to be resolved.
+ """
+
+ def __init__(self, rules, **kwargs):
+ super().__init__(**kwargs)
+ self.rules = [RuleCreator.create(**rule) for rule in rules]
+
+ def evaluate(self, scope_vars, rule_lib):
+ """If a tree rule's conditions are met, iterate its sub-rules
+ and return first result found.
+
+ :type scope_vars: dict
+ :type rule_lib: RuleSetStandardLibrary
+ :rtype: RuleSetEndpoint/EndpointResolutionError
+ """
+ if self.evaluate_conditions(scope_vars, rule_lib):
+ for rule in self.rules:
+ # don't share scope_vars between rules
+ rule_result = rule.evaluate(scope_vars.copy(), rule_lib)
+ if rule_result:
+ return rule_result
+ return None
+
+
+class RuleCreator:
+ endpoint = EndpointRule
+ error = ErrorRule
+ tree = TreeRule
+
+ @classmethod
+ def create(cls, **kwargs):
+ """Create a rule instance from metadata.
+
+ :rtype: TreeRule/EndpointRule/ErrorRule
+ """
+ rule_type = kwargs.pop("type")
+ try:
+ rule_class = getattr(cls, rule_type)
+ except AttributeError:
+ raise EndpointResolutionError(
+ msg=f"Unknown rule type: {rule_type}. A rule must "
+ "be of type tree, endpoint or error."
+ )
+ else:
+ return rule_class(**kwargs)
+
+
+class ParameterType(Enum):
+ """Translation from `type` attribute to native Python type."""
+
+ string = str
+ boolean = bool
+ stringarray = tuple
+
+
+class ParameterDefinition:
+ """The spec of an individual parameter defined in a RuleSet."""
+
+ def __init__(
+ self,
+ name,
+ parameter_type,
+ documentation=None,
+ builtIn=None,
+ default=None,
+ required=None,
+ deprecated=None,
+ ):
+ self.name = name
+ try:
+ self.parameter_type = getattr(
+ ParameterType, parameter_type.lower()
+ ).value
+ except AttributeError:
+ raise EndpointResolutionError(
+ msg=f"Unknown parameter type: {parameter_type}. "
+ "A parameter must be of type string, boolean, or stringarray."
+ )
+ self.documentation = documentation
+ self.builtin = builtIn
+ self.default = default
+ self.required = required
+ self.deprecated = deprecated
+
+ def validate_input(self, value):
+ """Perform base validation on parameter input.
+
+ :type value: Any
+ :raises: EndpointParametersError
+ """
+
+ if not isinstance(value, self.parameter_type):
+ raise EndpointResolutionError(
+ msg=f"Value ({self.name}) is the wrong "
+ f"type. Must be {self.parameter_type}."
+ )
+ if self.deprecated is not None:
+ depr_str = f"{self.name} has been deprecated."
+ msg = self.deprecated.get("message")
+ since = self.deprecated.get("since")
+ if msg:
+ depr_str += f"\n{msg}"
+ if since:
+ depr_str += f"\nDeprecated since {since}."
+ logger.info(depr_str)
+
+ return None
+
+ def process_input(self, value):
+ """Process input against spec, applying default if value is None."""
+ if value is None:
+ if self.default is not None:
+ return self.default
+ if self.required:
+ raise EndpointResolutionError(
+ msg=f"Cannot find value for required parameter {self.name}"
+ )
+ # in all other cases, the parameter will keep the value None
+ else:
+ self.validate_input(value)
+ return value
+
+
+class RuleSet:
+ """Collection of rules to derive a routable service endpoint."""
+
+ def __init__(
+ self, version, parameters, rules, partitions, documentation=None
+ ):
+ self.version = version
+ self.parameters = self._ingest_parameter_spec(parameters)
+ self.rules = [RuleCreator.create(**rule) for rule in rules]
+ self.rule_lib = RuleSetStandardLibrary(partitions)
+ self.documentation = documentation
+
+ def _ingest_parameter_spec(self, parameters):
+ return {
+ name: ParameterDefinition(
+ name,
+ spec["type"],
+ spec.get("documentation"),
+ spec.get("builtIn"),
+ spec.get("default"),
+ spec.get("required"),
+ spec.get("deprecated"),
+ )
+ for name, spec in parameters.items()
+ }
+
+ def process_input_parameters(self, input_params):
+ """Process each input parameter against its spec.
+
+ :type input_params: dict
+ """
+ for name, spec in self.parameters.items():
+ value = spec.process_input(input_params.get(name))
+ if value is not None:
+ input_params[name] = value
+ return None
+
+ def evaluate(self, input_parameters):
+ """Evaluate input parameters against rules returning first match.
+
+ :type input_parameters: dict
+ """
+ self.process_input_parameters(input_parameters)
+ for rule in self.rules:
+ evaluation = rule.evaluate(input_parameters.copy(), self.rule_lib)
+ if evaluation is not None:
+ return evaluation
+ return None
+
+
+class EndpointProvider:
+ """Derives endpoints from a RuleSet for given input parameters."""
+
+ def __init__(self, ruleset_data, partition_data):
+ self.ruleset = RuleSet(**ruleset_data, partitions=partition_data)
+
+ @lru_cache_weakref(maxsize=CACHE_SIZE)
+ def resolve_endpoint(self, **input_parameters):
+ """Match input parameters to a rule.
+
+ :type input_parameters: dict
+ :rtype: RuleSetEndpoint
+ """
+ params_for_error = input_parameters.copy()
+ endpoint = self.ruleset.evaluate(input_parameters)
+ if endpoint is None:
+ param_string = "\n".join(
+ [f"{key}: {value}" for key, value in params_for_error.items()]
+ )
+ raise EndpointResolutionError(
+ msg=f"No endpoint found for parameters:\n{param_string}"
+ )
+ return endpoint
diff --git a/.venv/lib/python3.12/site-packages/botocore/errorfactory.py b/.venv/lib/python3.12/site-packages/botocore/errorfactory.py
new file mode 100644
index 00000000..6084e51d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/errorfactory.py
@@ -0,0 +1,90 @@
+# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+from botocore.exceptions import ClientError
+from botocore.utils import get_service_module_name
+
+
+class BaseClientExceptions:
+ ClientError = ClientError
+
+ def __init__(self, code_to_exception):
+ """Base class for exceptions object on a client
+
+ :type code_to_exception: dict
+ :param code_to_exception: Mapping of error codes (strings) to exception
+ class that should be raised when encountering a particular
+ error code.
+ """
+ self._code_to_exception = code_to_exception
+
+ def from_code(self, error_code):
+ """Retrieves the error class based on the error code
+
+ This is helpful for identifying the exception class needing to be
+ caught based on the ClientError.parsed_reponse['Error']['Code'] value
+
+ :type error_code: string
+ :param error_code: The error code associated to a ClientError exception
+
+ :rtype: ClientError or a subclass of ClientError
+ :returns: The appropriate modeled exception class for that error
+ code. If the error code does not match any of the known
+ modeled exceptions then return a generic ClientError.
+ """
+ return self._code_to_exception.get(error_code, self.ClientError)
+
+ def __getattr__(self, name):
+ exception_cls_names = [
+ exception_cls.__name__
+ for exception_cls in self._code_to_exception.values()
+ ]
+ raise AttributeError(
+ rf"{self} object has no attribute {name}. "
+ rf"Valid exceptions are: {', '.join(exception_cls_names)}"
+ )
+
+
+class ClientExceptionsFactory:
+ def __init__(self):
+ self._client_exceptions_cache = {}
+
+ def create_client_exceptions(self, service_model):
+ """Creates a ClientExceptions object for the particular service client
+
+ :type service_model: botocore.model.ServiceModel
+ :param service_model: The service model for the client
+
+ :rtype: object that subclasses from BaseClientExceptions
+ :returns: The exceptions object of a client that can be used
+ to grab the various different modeled exceptions.
+ """
+ service_name = service_model.service_name
+ if service_name not in self._client_exceptions_cache:
+ client_exceptions = self._create_client_exceptions(service_model)
+ self._client_exceptions_cache[service_name] = client_exceptions
+ return self._client_exceptions_cache[service_name]
+
+ def _create_client_exceptions(self, service_model):
+ cls_props = {}
+ code_to_exception = {}
+ for error_shape in service_model.error_shapes:
+ exception_name = str(error_shape.name)
+ exception_cls = type(exception_name, (ClientError,), {})
+ cls_props[exception_name] = exception_cls
+ code = str(error_shape.error_code)
+ code_to_exception[code] = exception_cls
+ cls_name = str(get_service_module_name(service_model) + 'Exceptions')
+ client_exceptions_cls = type(
+ cls_name, (BaseClientExceptions,), cls_props
+ )
+ return client_exceptions_cls(code_to_exception)
diff --git a/.venv/lib/python3.12/site-packages/botocore/eventstream.py b/.venv/lib/python3.12/site-packages/botocore/eventstream.py
new file mode 100644
index 00000000..583ceb03
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/eventstream.py
@@ -0,0 +1,622 @@
+# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+"""Binary Event Stream Decoding"""
+
+from binascii import crc32
+from struct import unpack
+
+from botocore.exceptions import EventStreamError
+
+# byte length of the prelude (total_length + header_length + prelude_crc)
+_PRELUDE_LENGTH = 12
+_MAX_HEADERS_LENGTH = 128 * 1024 # 128 Kb
+
+
+class ParserError(Exception):
+ """Base binary flow encoding parsing exception."""
+
+ pass
+
+
+class DuplicateHeader(ParserError):
+ """Duplicate header found in the event."""
+
+ def __init__(self, header):
+ message = f'Duplicate header present: "{header}"'
+ super().__init__(message)
+
+
+class InvalidHeadersLength(ParserError):
+ """Headers length is longer than the maximum."""
+
+ def __init__(self, length):
+ message = f'Header length of {length} exceeded the maximum of {_MAX_HEADERS_LENGTH}'
+ super().__init__(message)
+
+
+class InvalidPayloadLength(ParserError):
+ """Payload length is longer than the maximum.
+
+ DEPRECATED: This case is no longer validated client side. Payloads
+ of varying lengths are now supported by AWS services.
+ """
+
+ def __init__(self, length):
+ message = f'Payload length of {length} exceeded the maximum of 24MB.'
+ super().__init__(message)
+
+
+class ChecksumMismatch(ParserError):
+ """Calculated checksum did not match the expected checksum."""
+
+ def __init__(self, expected, calculated):
+ message = f'Checksum mismatch: expected 0x{expected:08x}, calculated 0x{calculated:08x}'
+ super().__init__(message)
+
+
+class NoInitialResponseError(ParserError):
+ """An event of type initial-response was not received.
+
+ This exception is raised when the event stream produced no events or
+ the first event in the stream was not of the initial-response type.
+ """
+
+ def __init__(self):
+ message = 'First event was not of the initial-response type'
+ super().__init__(message)
+
+
+class DecodeUtils:
+ """Unpacking utility functions used in the decoder.
+
+ All methods on this class take raw bytes and return a tuple containing
+ the value parsed from the bytes and the number of bytes consumed to parse
+ that value.
+ """
+
+ UINT8_BYTE_FORMAT = '!B'
+ UINT16_BYTE_FORMAT = '!H'
+ UINT32_BYTE_FORMAT = '!I'
+ INT8_BYTE_FORMAT = '!b'
+ INT16_BYTE_FORMAT = '!h'
+ INT32_BYTE_FORMAT = '!i'
+ INT64_BYTE_FORMAT = '!q'
+ PRELUDE_BYTE_FORMAT = '!III'
+
+ # uint byte size to unpack format
+ UINT_BYTE_FORMAT = {
+ 1: UINT8_BYTE_FORMAT,
+ 2: UINT16_BYTE_FORMAT,
+ 4: UINT32_BYTE_FORMAT,
+ }
+
+ @staticmethod
+ def unpack_true(data):
+ """This method consumes none of the provided bytes and returns True.
+
+ :type data: bytes
+ :param data: The bytes to parse from. This is ignored in this method.
+
+ :rtype: tuple
+ :rtype: (bool, int)
+ :returns: The tuple (True, 0)
+ """
+ return True, 0
+
+ @staticmethod
+ def unpack_false(data):
+ """This method consumes none of the provided bytes and returns False.
+
+ :type data: bytes
+ :param data: The bytes to parse from. This is ignored in this method.
+
+ :rtype: tuple
+ :rtype: (bool, int)
+ :returns: The tuple (False, 0)
+ """
+ return False, 0
+
+ @staticmethod
+ def unpack_uint8(data):
+ """Parse an unsigned 8-bit integer from the bytes.
+
+ :type data: bytes
+ :param data: The bytes to parse from.
+
+ :rtype: (int, int)
+ :returns: A tuple containing the (parsed integer value, bytes consumed)
+ """
+ value = unpack(DecodeUtils.UINT8_BYTE_FORMAT, data[:1])[0]
+ return value, 1
+
+ @staticmethod
+ def unpack_uint32(data):
+ """Parse an unsigned 32-bit integer from the bytes.
+
+ :type data: bytes
+ :param data: The bytes to parse from.
+
+ :rtype: (int, int)
+ :returns: A tuple containing the (parsed integer value, bytes consumed)
+ """
+ value = unpack(DecodeUtils.UINT32_BYTE_FORMAT, data[:4])[0]
+ return value, 4
+
+ @staticmethod
+ def unpack_int8(data):
+ """Parse a signed 8-bit integer from the bytes.
+
+ :type data: bytes
+ :param data: The bytes to parse from.
+
+ :rtype: (int, int)
+ :returns: A tuple containing the (parsed integer value, bytes consumed)
+ """
+ value = unpack(DecodeUtils.INT8_BYTE_FORMAT, data[:1])[0]
+ return value, 1
+
+ @staticmethod
+ def unpack_int16(data):
+ """Parse a signed 16-bit integer from the bytes.
+
+ :type data: bytes
+ :param data: The bytes to parse from.
+
+ :rtype: tuple
+ :rtype: (int, int)
+ :returns: A tuple containing the (parsed integer value, bytes consumed)
+ """
+ value = unpack(DecodeUtils.INT16_BYTE_FORMAT, data[:2])[0]
+ return value, 2
+
+ @staticmethod
+ def unpack_int32(data):
+ """Parse a signed 32-bit integer from the bytes.
+
+ :type data: bytes
+ :param data: The bytes to parse from.
+
+ :rtype: tuple
+ :rtype: (int, int)
+ :returns: A tuple containing the (parsed integer value, bytes consumed)
+ """
+ value = unpack(DecodeUtils.INT32_BYTE_FORMAT, data[:4])[0]
+ return value, 4
+
+ @staticmethod
+ def unpack_int64(data):
+ """Parse a signed 64-bit integer from the bytes.
+
+ :type data: bytes
+ :param data: The bytes to parse from.
+
+ :rtype: tuple
+ :rtype: (int, int)
+ :returns: A tuple containing the (parsed integer value, bytes consumed)
+ """
+ value = unpack(DecodeUtils.INT64_BYTE_FORMAT, data[:8])[0]
+ return value, 8
+
+ @staticmethod
+ def unpack_byte_array(data, length_byte_size=2):
+ """Parse a variable length byte array from the bytes.
+
+ The bytes are expected to be in the following format:
+ [ length ][0 ... length bytes]
+ where length is an unsigned integer represented in the smallest number
+ of bytes to hold the maximum length of the array.
+
+ :type data: bytes
+ :param data: The bytes to parse from.
+
+ :type length_byte_size: int
+ :param length_byte_size: The byte size of the preceding integer that
+ represents the length of the array. Supported values are 1, 2, and 4.
+
+ :rtype: (bytes, int)
+ :returns: A tuple containing the (parsed byte array, bytes consumed).
+ """
+ uint_byte_format = DecodeUtils.UINT_BYTE_FORMAT[length_byte_size]
+ length = unpack(uint_byte_format, data[:length_byte_size])[0]
+ bytes_end = length + length_byte_size
+ array_bytes = data[length_byte_size:bytes_end]
+ return array_bytes, bytes_end
+
+ @staticmethod
+ def unpack_utf8_string(data, length_byte_size=2):
+ """Parse a variable length utf-8 string from the bytes.
+
+ The bytes are expected to be in the following format:
+ [ length ][0 ... length bytes]
+ where length is an unsigned integer represented in the smallest number
+ of bytes to hold the maximum length of the array and the following
+ bytes are a valid utf-8 string.
+
+ :type data: bytes
+ :param bytes: The bytes to parse from.
+
+ :type length_byte_size: int
+ :param length_byte_size: The byte size of the preceding integer that
+ represents the length of the array. Supported values are 1, 2, and 4.
+
+ :rtype: (str, int)
+ :returns: A tuple containing the (utf-8 string, bytes consumed).
+ """
+ array_bytes, consumed = DecodeUtils.unpack_byte_array(
+ data, length_byte_size
+ )
+ return array_bytes.decode('utf-8'), consumed
+
+ @staticmethod
+ def unpack_uuid(data):
+ """Parse a 16-byte uuid from the bytes.
+
+ :type data: bytes
+ :param data: The bytes to parse from.
+
+ :rtype: (bytes, int)
+ :returns: A tuple containing the (uuid bytes, bytes consumed).
+ """
+ return data[:16], 16
+
+ @staticmethod
+ def unpack_prelude(data):
+ """Parse the prelude for an event stream message from the bytes.
+
+ The prelude for an event stream message has the following format:
+ [total_length][header_length][prelude_crc]
+ where each field is an unsigned 32-bit integer.
+
+ :rtype: ((int, int, int), int)
+ :returns: A tuple of ((total_length, headers_length, prelude_crc),
+ consumed)
+ """
+ return (unpack(DecodeUtils.PRELUDE_BYTE_FORMAT, data), _PRELUDE_LENGTH)
+
+
+def _validate_checksum(data, checksum, crc=0):
+ # To generate the same numeric value across all Python versions and
+ # platforms use crc32(data) & 0xffffffff.
+ computed_checksum = crc32(data, crc) & 0xFFFFFFFF
+ if checksum != computed_checksum:
+ raise ChecksumMismatch(checksum, computed_checksum)
+
+
+class MessagePrelude:
+ """Represents the prelude of an event stream message."""
+
+ def __init__(self, total_length, headers_length, crc):
+ self.total_length = total_length
+ self.headers_length = headers_length
+ self.crc = crc
+
+ @property
+ def payload_length(self):
+ """Calculates the total payload length.
+
+ The extra minus 4 bytes is for the message CRC.
+
+ :rtype: int
+ :returns: The total payload length.
+ """
+ return self.total_length - self.headers_length - _PRELUDE_LENGTH - 4
+
+ @property
+ def payload_end(self):
+ """Calculates the byte offset for the end of the message payload.
+
+ The extra minus 4 bytes is for the message CRC.
+
+ :rtype: int
+ :returns: The byte offset from the beginning of the event stream
+ message to the end of the payload.
+ """
+ return self.total_length - 4
+
+ @property
+ def headers_end(self):
+ """Calculates the byte offset for the end of the message headers.
+
+ :rtype: int
+ :returns: The byte offset from the beginning of the event stream
+ message to the end of the headers.
+ """
+ return _PRELUDE_LENGTH + self.headers_length
+
+
+class EventStreamMessage:
+ """Represents an event stream message."""
+
+ def __init__(self, prelude, headers, payload, crc):
+ self.prelude = prelude
+ self.headers = headers
+ self.payload = payload
+ self.crc = crc
+
+ def to_response_dict(self, status_code=200):
+ message_type = self.headers.get(':message-type')
+ if message_type == 'error' or message_type == 'exception':
+ status_code = 400
+ return {
+ 'status_code': status_code,
+ 'headers': self.headers,
+ 'body': self.payload,
+ }
+
+
+class EventStreamHeaderParser:
+ """Parses the event headers from an event stream message.
+
+ Expects all of the header data upfront and creates a dictionary of headers
+ to return. This object can be reused multiple times to parse the headers
+ from multiple event stream messages.
+ """
+
+ # Maps header type to appropriate unpacking function
+ # These unpacking functions return the value and the amount unpacked
+ _HEADER_TYPE_MAP = {
+ # boolean_true
+ 0: DecodeUtils.unpack_true,
+ # boolean_false
+ 1: DecodeUtils.unpack_false,
+ # byte
+ 2: DecodeUtils.unpack_int8,
+ # short
+ 3: DecodeUtils.unpack_int16,
+ # integer
+ 4: DecodeUtils.unpack_int32,
+ # long
+ 5: DecodeUtils.unpack_int64,
+ # byte_array
+ 6: DecodeUtils.unpack_byte_array,
+ # string
+ 7: DecodeUtils.unpack_utf8_string,
+ # timestamp
+ 8: DecodeUtils.unpack_int64,
+ # uuid
+ 9: DecodeUtils.unpack_uuid,
+ }
+
+ def __init__(self):
+ self._data = None
+
+ def parse(self, data):
+ """Parses the event stream headers from an event stream message.
+
+ :type data: bytes
+ :param data: The bytes that correspond to the headers section of an
+ event stream message.
+
+ :rtype: dict
+ :returns: A dictionary of header key, value pairs.
+ """
+ self._data = data
+ return self._parse_headers()
+
+ def _parse_headers(self):
+ headers = {}
+ while self._data:
+ name, value = self._parse_header()
+ if name in headers:
+ raise DuplicateHeader(name)
+ headers[name] = value
+ return headers
+
+ def _parse_header(self):
+ name = self._parse_name()
+ value = self._parse_value()
+ return name, value
+
+ def _parse_name(self):
+ name, consumed = DecodeUtils.unpack_utf8_string(self._data, 1)
+ self._advance_data(consumed)
+ return name
+
+ def _parse_type(self):
+ type, consumed = DecodeUtils.unpack_uint8(self._data)
+ self._advance_data(consumed)
+ return type
+
+ def _parse_value(self):
+ header_type = self._parse_type()
+ value_unpacker = self._HEADER_TYPE_MAP[header_type]
+ value, consumed = value_unpacker(self._data)
+ self._advance_data(consumed)
+ return value
+
+ def _advance_data(self, consumed):
+ self._data = self._data[consumed:]
+
+
+class EventStreamBuffer:
+ """Streaming based event stream buffer
+
+ A buffer class that wraps bytes from an event stream providing parsed
+ messages as they become available via an iterable interface.
+ """
+
+ def __init__(self):
+ self._data = b''
+ self._prelude = None
+ self._header_parser = EventStreamHeaderParser()
+
+ def add_data(self, data):
+ """Add data to the buffer.
+
+ :type data: bytes
+ :param data: The bytes to add to the buffer to be used when parsing
+ """
+ self._data += data
+
+ def _validate_prelude(self, prelude):
+ if prelude.headers_length > _MAX_HEADERS_LENGTH:
+ raise InvalidHeadersLength(prelude.headers_length)
+
+ def _parse_prelude(self):
+ prelude_bytes = self._data[:_PRELUDE_LENGTH]
+ raw_prelude, _ = DecodeUtils.unpack_prelude(prelude_bytes)
+ prelude = MessagePrelude(*raw_prelude)
+ # The minus 4 removes the prelude crc from the bytes to be checked
+ _validate_checksum(prelude_bytes[: _PRELUDE_LENGTH - 4], prelude.crc)
+ self._validate_prelude(prelude)
+ return prelude
+
+ def _parse_headers(self):
+ header_bytes = self._data[_PRELUDE_LENGTH : self._prelude.headers_end]
+ return self._header_parser.parse(header_bytes)
+
+ def _parse_payload(self):
+ prelude = self._prelude
+ payload_bytes = self._data[prelude.headers_end : prelude.payload_end]
+ return payload_bytes
+
+ def _parse_message_crc(self):
+ prelude = self._prelude
+ crc_bytes = self._data[prelude.payload_end : prelude.total_length]
+ message_crc, _ = DecodeUtils.unpack_uint32(crc_bytes)
+ return message_crc
+
+ def _parse_message_bytes(self):
+ # The minus 4 includes the prelude crc to the bytes to be checked
+ message_bytes = self._data[
+ _PRELUDE_LENGTH - 4 : self._prelude.payload_end
+ ]
+ return message_bytes
+
+ def _validate_message_crc(self):
+ message_crc = self._parse_message_crc()
+ message_bytes = self._parse_message_bytes()
+ _validate_checksum(message_bytes, message_crc, crc=self._prelude.crc)
+ return message_crc
+
+ def _parse_message(self):
+ crc = self._validate_message_crc()
+ headers = self._parse_headers()
+ payload = self._parse_payload()
+ message = EventStreamMessage(self._prelude, headers, payload, crc)
+ self._prepare_for_next_message()
+ return message
+
+ def _prepare_for_next_message(self):
+ # Advance the data and reset the current prelude
+ self._data = self._data[self._prelude.total_length :]
+ self._prelude = None
+
+ def next(self):
+ """Provides the next available message parsed from the stream
+
+ :rtype: EventStreamMessage
+ :returns: The next event stream message
+ """
+ if len(self._data) < _PRELUDE_LENGTH:
+ raise StopIteration()
+
+ if self._prelude is None:
+ self._prelude = self._parse_prelude()
+
+ if len(self._data) < self._prelude.total_length:
+ raise StopIteration()
+
+ return self._parse_message()
+
+ def __next__(self):
+ return self.next()
+
+ def __iter__(self):
+ return self
+
+
+class EventStream:
+ """Wrapper class for an event stream body.
+
+ This wraps the underlying streaming body, parsing it for individual events
+ and yielding them as they come available through the iterator interface.
+
+ The following example uses the S3 select API to get structured data out of
+ an object stored in S3 using an event stream.
+
+ **Example:**
+ ::
+ from botocore.session import Session
+
+ s3 = Session().create_client('s3')
+ response = s3.select_object_content(
+ Bucket='bucketname',
+ Key='keyname',
+ ExpressionType='SQL',
+ RequestProgress={'Enabled': True},
+ Expression="SELECT * FROM S3Object s",
+ InputSerialization={'CSV': {}},
+ OutputSerialization={'CSV': {}},
+ )
+ # This is the event stream in the response
+ event_stream = response['Payload']
+ end_event_received = False
+ with open('output', 'wb') as f:
+ # Iterate over events in the event stream as they come
+ for event in event_stream:
+ # If we received a records event, write the data to a file
+ if 'Records' in event:
+ data = event['Records']['Payload']
+ f.write(data)
+ # If we received a progress event, print the details
+ elif 'Progress' in event:
+ print(event['Progress']['Details'])
+ # End event indicates that the request finished successfully
+ elif 'End' in event:
+ print('Result is complete')
+ end_event_received = True
+ if not end_event_received:
+ raise Exception("End event not received, request incomplete.")
+ """
+
+ def __init__(self, raw_stream, output_shape, parser, operation_name):
+ self._raw_stream = raw_stream
+ self._output_shape = output_shape
+ self._operation_name = operation_name
+ self._parser = parser
+ self._event_generator = self._create_raw_event_generator()
+
+ def __iter__(self):
+ for event in self._event_generator:
+ parsed_event = self._parse_event(event)
+ if parsed_event:
+ yield parsed_event
+
+ def _create_raw_event_generator(self):
+ event_stream_buffer = EventStreamBuffer()
+ for chunk in self._raw_stream.stream():
+ event_stream_buffer.add_data(chunk)
+ yield from event_stream_buffer
+
+ def _parse_event(self, event):
+ response_dict = event.to_response_dict()
+ parsed_response = self._parser.parse(response_dict, self._output_shape)
+ if response_dict['status_code'] == 200:
+ return parsed_response
+ else:
+ raise EventStreamError(parsed_response, self._operation_name)
+
+ def get_initial_response(self):
+ try:
+ initial_event = next(self._event_generator)
+ event_type = initial_event.headers.get(':event-type')
+ if event_type == 'initial-response':
+ return initial_event
+ except StopIteration:
+ pass
+ raise NoInitialResponseError()
+
+ def close(self):
+ """Closes the underlying streaming body."""
+ self._raw_stream.close()
diff --git a/.venv/lib/python3.12/site-packages/botocore/exceptions.py b/.venv/lib/python3.12/site-packages/botocore/exceptions.py
new file mode 100644
index 00000000..10a7c586
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/exceptions.py
@@ -0,0 +1,834 @@
+# Copyright (c) 2012-2013 Mitch Garnaat http://garnaat.org/
+# Copyright 2012-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+
+from botocore.vendored import requests
+from botocore.vendored.requests.packages import urllib3
+
+
+def _exception_from_packed_args(exception_cls, args=None, kwargs=None):
+ # This is helpful for reducing Exceptions that only accept kwargs as
+ # only positional arguments can be provided for __reduce__
+ # Ideally, this would also be a class method on the BotoCoreError
+ # but instance methods cannot be pickled.
+ if args is None:
+ args = ()
+ if kwargs is None:
+ kwargs = {}
+ return exception_cls(*args, **kwargs)
+
+
+class BotoCoreError(Exception):
+ """
+ The base exception class for BotoCore exceptions.
+
+ :ivar msg: The descriptive message associated with the error.
+ """
+
+ fmt = 'An unspecified error occurred'
+
+ def __init__(self, **kwargs):
+ msg = self.fmt.format(**kwargs)
+ Exception.__init__(self, msg)
+ self.kwargs = kwargs
+
+ def __reduce__(self):
+ return _exception_from_packed_args, (self.__class__, None, self.kwargs)
+
+
+class DataNotFoundError(BotoCoreError):
+ """
+ The data associated with a particular path could not be loaded.
+
+ :ivar data_path: The data path that the user attempted to load.
+ """
+
+ fmt = 'Unable to load data for: {data_path}'
+
+
+class UnknownServiceError(DataNotFoundError):
+ """Raised when trying to load data for an unknown service.
+
+ :ivar service_name: The name of the unknown service.
+
+ """
+
+ fmt = (
+ "Unknown service: '{service_name}'. Valid service names are: "
+ "{known_service_names}"
+ )
+
+
+class UnknownRegionError(BotoCoreError):
+ """Raised when trying to load data for an unknown region.
+
+ :ivar region_name: The name of the unknown region.
+
+ """
+
+ fmt = "Unknown region: '{region_name}'. {error_msg}"
+
+
+class ApiVersionNotFoundError(BotoCoreError):
+ """
+ The data associated with either the API version or a compatible one
+ could not be loaded.
+
+ :ivar data_path: The data path that the user attempted to load.
+ :ivar api_version: The API version that the user attempted to load.
+ """
+
+ fmt = 'Unable to load data {data_path} for: {api_version}'
+
+
+class HTTPClientError(BotoCoreError):
+ fmt = 'An HTTP Client raised an unhandled exception: {error}'
+
+ def __init__(self, request=None, response=None, **kwargs):
+ self.request = request
+ self.response = response
+ super().__init__(**kwargs)
+
+ def __reduce__(self):
+ return _exception_from_packed_args, (
+ self.__class__,
+ (self.request, self.response),
+ self.kwargs,
+ )
+
+
+class ConnectionError(BotoCoreError):
+ fmt = 'An HTTP Client failed to establish a connection: {error}'
+
+
+class InvalidIMDSEndpointError(BotoCoreError):
+ fmt = 'Invalid endpoint EC2 Instance Metadata endpoint: {endpoint}'
+
+
+class InvalidIMDSEndpointModeError(BotoCoreError):
+ fmt = (
+ 'Invalid EC2 Instance Metadata endpoint mode: {mode}'
+ ' Valid endpoint modes (case-insensitive): {valid_modes}.'
+ )
+
+
+class EndpointConnectionError(ConnectionError):
+ fmt = 'Could not connect to the endpoint URL: "{endpoint_url}"'
+
+
+class SSLError(ConnectionError, requests.exceptions.SSLError):
+ fmt = 'SSL validation failed for {endpoint_url} {error}'
+
+
+class ConnectionClosedError(HTTPClientError):
+ fmt = (
+ 'Connection was closed before we received a valid response '
+ 'from endpoint URL: "{endpoint_url}".'
+ )
+
+
+class ReadTimeoutError(
+ HTTPClientError,
+ requests.exceptions.ReadTimeout,
+ urllib3.exceptions.ReadTimeoutError,
+):
+ fmt = 'Read timeout on endpoint URL: "{endpoint_url}"'
+
+
+class ConnectTimeoutError(ConnectionError, requests.exceptions.ConnectTimeout):
+ fmt = 'Connect timeout on endpoint URL: "{endpoint_url}"'
+
+
+class ProxyConnectionError(ConnectionError, requests.exceptions.ProxyError):
+ fmt = 'Failed to connect to proxy URL: "{proxy_url}"'
+
+
+class ResponseStreamingError(HTTPClientError):
+ fmt = 'An error occurred while reading from response stream: {error}'
+
+
+class NoCredentialsError(BotoCoreError):
+ """
+ No credentials could be found.
+ """
+
+ fmt = 'Unable to locate credentials'
+
+
+class NoAuthTokenError(BotoCoreError):
+ """
+ No authorization token could be found.
+ """
+
+ fmt = 'Unable to locate authorization token'
+
+
+class TokenRetrievalError(BotoCoreError):
+ """
+ Error attempting to retrieve a token from a remote source.
+
+ :ivar provider: The name of the token provider.
+ :ivar error_msg: The msg explaining why the token could not be retrieved.
+
+ """
+
+ fmt = 'Error when retrieving token from {provider}: {error_msg}'
+
+
+class PartialCredentialsError(BotoCoreError):
+ """
+ Only partial credentials were found.
+
+ :ivar cred_var: The missing credential variable name.
+
+ """
+
+ fmt = 'Partial credentials found in {provider}, missing: {cred_var}'
+
+
+class CredentialRetrievalError(BotoCoreError):
+ """
+ Error attempting to retrieve credentials from a remote source.
+
+ :ivar provider: The name of the credential provider.
+ :ivar error_msg: The msg explaining why credentials could not be
+ retrieved.
+
+ """
+
+ fmt = 'Error when retrieving credentials from {provider}: {error_msg}'
+
+
+class UnknownSignatureVersionError(BotoCoreError):
+ """
+ Requested Signature Version is not known.
+
+ :ivar signature_version: The name of the requested signature version.
+ """
+
+ fmt = 'Unknown Signature Version: {signature_version}.'
+
+
+class ServiceNotInRegionError(BotoCoreError):
+ """
+ The service is not available in requested region.
+
+ :ivar service_name: The name of the service.
+ :ivar region_name: The name of the region.
+ """
+
+ fmt = 'Service {service_name} not available in region {region_name}'
+
+
+class BaseEndpointResolverError(BotoCoreError):
+ """Base error for endpoint resolving errors.
+
+ Should never be raised directly, but clients can catch
+ this exception if they want to generically handle any errors
+ during the endpoint resolution process.
+
+ """
+
+
+class NoRegionError(BaseEndpointResolverError):
+ """No region was specified."""
+
+ fmt = 'You must specify a region.'
+
+
+class EndpointVariantError(BaseEndpointResolverError):
+ """
+ Could not construct modeled endpoint variant.
+
+ :ivar error_msg: The message explaining why the modeled endpoint variant
+ is unable to be constructed.
+
+ """
+
+ fmt = (
+ 'Unable to construct a modeled endpoint with the following '
+ 'variant(s) {tags}: '
+ )
+
+
+class UnknownEndpointError(BaseEndpointResolverError, ValueError):
+ """
+ Could not construct an endpoint.
+
+ :ivar service_name: The name of the service.
+ :ivar region_name: The name of the region.
+ """
+
+ fmt = (
+ 'Unable to construct an endpoint for '
+ '{service_name} in region {region_name}'
+ )
+
+
+class UnknownFIPSEndpointError(BaseEndpointResolverError):
+ """
+ Could not construct a FIPS endpoint.
+
+ :ivar service_name: The name of the service.
+ :ivar region_name: The name of the region.
+ """
+
+ fmt = (
+ 'The provided FIPS pseudo-region "{region_name}" is not known for '
+ 'the service "{service_name}". A FIPS compliant endpoint cannot be '
+ 'constructed.'
+ )
+
+
+class ProfileNotFound(BotoCoreError):
+ """
+ The specified configuration profile was not found in the
+ configuration file.
+
+ :ivar profile: The name of the profile the user attempted to load.
+ """
+
+ fmt = 'The config profile ({profile}) could not be found'
+
+
+class ConfigParseError(BotoCoreError):
+ """
+ The configuration file could not be parsed.
+
+ :ivar path: The path to the configuration file.
+ """
+
+ fmt = 'Unable to parse config file: {path}'
+
+
+class ConfigNotFound(BotoCoreError):
+ """
+ The specified configuration file could not be found.
+
+ :ivar path: The path to the configuration file.
+ """
+
+ fmt = 'The specified config file ({path}) could not be found.'
+
+
+class MissingParametersError(BotoCoreError):
+ """
+ One or more required parameters were not supplied.
+
+ :ivar object: The object that has missing parameters.
+ This can be an operation or a parameter (in the
+ case of inner params). The str() of this object
+ will be used so it doesn't need to implement anything
+ other than str().
+ :ivar missing: The names of the missing parameters.
+ """
+
+ fmt = (
+ 'The following required parameters are missing for '
+ '{object_name}: {missing}'
+ )
+
+
+class ValidationError(BotoCoreError):
+ """
+ An exception occurred validating parameters.
+
+ Subclasses must accept a ``value`` and ``param``
+ argument in their ``__init__``.
+
+ :ivar value: The value that was being validated.
+ :ivar param: The parameter that failed validation.
+ :ivar type_name: The name of the underlying type.
+ """
+
+ fmt = "Invalid value ('{value}') for param {param} " "of type {type_name} "
+
+
+class ParamValidationError(BotoCoreError):
+ fmt = 'Parameter validation failed:\n{report}'
+
+
+# These exceptions subclass from ValidationError so that code
+# can just 'except ValidationError' to catch any possibly validation
+# error.
+class UnknownKeyError(ValidationError):
+ """
+ Unknown key in a struct parameter.
+
+ :ivar value: The value that was being checked.
+ :ivar param: The name of the parameter.
+ :ivar choices: The valid choices the value can be.
+ """
+
+ fmt = (
+ "Unknown key '{value}' for param '{param}'. Must be one "
+ "of: {choices}"
+ )
+
+
+class RangeError(ValidationError):
+ """
+ A parameter value was out of the valid range.
+
+ :ivar value: The value that was being checked.
+ :ivar param: The parameter that failed validation.
+ :ivar min_value: The specified minimum value.
+ :ivar max_value: The specified maximum value.
+ """
+
+ fmt = (
+ 'Value out of range for param {param}: '
+ '{min_value} <= {value} <= {max_value}'
+ )
+
+
+class UnknownParameterError(ValidationError):
+ """
+ Unknown top level parameter.
+
+ :ivar name: The name of the unknown parameter.
+ :ivar operation: The name of the operation.
+ :ivar choices: The valid choices the parameter name can be.
+ """
+
+ fmt = (
+ "Unknown parameter '{name}' for operation {operation}. Must be one "
+ "of: {choices}"
+ )
+
+
+class InvalidRegionError(ValidationError, ValueError):
+ """
+ Invalid region_name provided to client or resource.
+
+ :ivar region_name: region_name that was being validated.
+ """
+
+ fmt = "Provided region_name '{region_name}' doesn't match a supported format."
+
+
+class AliasConflictParameterError(ValidationError):
+ """
+ Error when an alias is provided for a parameter as well as the original.
+
+ :ivar original: The name of the original parameter.
+ :ivar alias: The name of the alias
+ :ivar operation: The name of the operation.
+ """
+
+ fmt = (
+ "Parameter '{original}' and its alias '{alias}' were provided "
+ "for operation {operation}. Only one of them may be used."
+ )
+
+
+class UnknownServiceStyle(BotoCoreError):
+ """
+ Unknown style of service invocation.
+
+ :ivar service_style: The style requested.
+ """
+
+ fmt = 'The service style ({service_style}) is not understood.'
+
+
+class PaginationError(BotoCoreError):
+ fmt = 'Error during pagination: {message}'
+
+
+class OperationNotPageableError(BotoCoreError):
+ fmt = 'Operation cannot be paginated: {operation_name}'
+
+
+class ChecksumError(BotoCoreError):
+ """The expected checksum did not match the calculated checksum."""
+
+ fmt = (
+ 'Checksum {checksum_type} failed, expected checksum '
+ '{expected_checksum} did not match calculated checksum '
+ '{actual_checksum}.'
+ )
+
+
+class UnseekableStreamError(BotoCoreError):
+ """Need to seek a stream, but stream does not support seeking."""
+
+ fmt = (
+ 'Need to rewind the stream {stream_object}, but stream '
+ 'is not seekable.'
+ )
+
+
+class WaiterError(BotoCoreError):
+ """Waiter failed to reach desired state."""
+
+ fmt = 'Waiter {name} failed: {reason}'
+
+ def __init__(self, name, reason, last_response):
+ super().__init__(name=name, reason=reason)
+ self.last_response = last_response
+
+
+class IncompleteReadError(BotoCoreError):
+ """HTTP response did not return expected number of bytes."""
+
+ fmt = (
+ '{actual_bytes} read, but total bytes ' 'expected is {expected_bytes}.'
+ )
+
+
+class InvalidExpressionError(BotoCoreError):
+ """Expression is either invalid or too complex."""
+
+ fmt = 'Invalid expression {expression}: Only dotted lookups are supported.'
+
+
+class UnknownCredentialError(BotoCoreError):
+ """Tried to insert before/after an unregistered credential type."""
+
+ fmt = 'Credential named {name} not found.'
+
+
+class WaiterConfigError(BotoCoreError):
+ """Error when processing waiter configuration."""
+
+ fmt = 'Error processing waiter config: {error_msg}'
+
+
+class UnknownClientMethodError(BotoCoreError):
+ """Error when trying to access a method on a client that does not exist."""
+
+ fmt = 'Client does not have method: {method_name}'
+
+
+class UnsupportedSignatureVersionError(BotoCoreError):
+ """Error when trying to use an unsupported Signature Version."""
+
+ fmt = 'Signature version(s) are not supported: {signature_version}'
+
+
+class ClientError(Exception):
+ MSG_TEMPLATE = (
+ 'An error occurred ({error_code}) when calling the {operation_name} '
+ 'operation{retry_info}: {error_message}'
+ )
+
+ def __init__(self, error_response, operation_name):
+ retry_info = self._get_retry_info(error_response)
+ error = error_response.get('Error', {})
+ msg = self.MSG_TEMPLATE.format(
+ error_code=error.get('Code', 'Unknown'),
+ error_message=error.get('Message', 'Unknown'),
+ operation_name=operation_name,
+ retry_info=retry_info,
+ )
+ super().__init__(msg)
+ self.response = error_response
+ self.operation_name = operation_name
+
+ def _get_retry_info(self, response):
+ retry_info = ''
+ if 'ResponseMetadata' in response:
+ metadata = response['ResponseMetadata']
+ if metadata.get('MaxAttemptsReached', False):
+ if 'RetryAttempts' in metadata:
+ retry_info = (
+ f" (reached max retries: {metadata['RetryAttempts']})"
+ )
+ return retry_info
+
+ def __reduce__(self):
+ # Subclasses of ClientError's are dynamically generated and
+ # cannot be pickled unless they are attributes of a
+ # module. So at the very least return a ClientError back.
+ return ClientError, (self.response, self.operation_name)
+
+
+class EventStreamError(ClientError):
+ pass
+
+
+class UnsupportedTLSVersionWarning(Warning):
+ """Warn when an openssl version that uses TLS 1.2 is required"""
+
+ pass
+
+
+class ImminentRemovalWarning(Warning):
+ pass
+
+
+class InvalidDNSNameError(BotoCoreError):
+ """Error when virtual host path is forced on a non-DNS compatible bucket"""
+
+ fmt = (
+ 'Bucket named {bucket_name} is not DNS compatible. Virtual '
+ 'hosted-style addressing cannot be used. The addressing style '
+ 'can be configured by removing the addressing_style value '
+ 'or setting that value to \'path\' or \'auto\' in the AWS Config '
+ 'file or in the botocore.client.Config object.'
+ )
+
+
+class InvalidS3AddressingStyleError(BotoCoreError):
+ """Error when an invalid path style is specified"""
+
+ fmt = (
+ 'S3 addressing style {s3_addressing_style} is invalid. Valid options '
+ 'are: \'auto\', \'virtual\', and \'path\''
+ )
+
+
+class UnsupportedS3ArnError(BotoCoreError):
+ """Error when S3 ARN provided to Bucket parameter is not supported"""
+
+ fmt = (
+ 'S3 ARN {arn} provided to "Bucket" parameter is invalid. Only '
+ 'ARNs for S3 access-points are supported.'
+ )
+
+
+class UnsupportedS3ControlArnError(BotoCoreError):
+ """Error when S3 ARN provided to S3 control parameter is not supported"""
+
+ fmt = 'S3 ARN "{arn}" provided is invalid for this operation. {msg}'
+
+
+class InvalidHostLabelError(BotoCoreError):
+ """Error when an invalid host label would be bound to an endpoint"""
+
+ fmt = (
+ 'Invalid host label to be bound to the hostname of the endpoint: '
+ '"{label}".'
+ )
+
+
+class UnsupportedOutpostResourceError(BotoCoreError):
+ """Error when S3 Outpost ARN provided to Bucket parameter is incomplete"""
+
+ fmt = (
+ 'S3 Outpost ARN resource "{resource_name}" provided to "Bucket" '
+ 'parameter is invalid. Only ARNs for S3 Outpost arns with an '
+ 'access-point sub-resource are supported.'
+ )
+
+
+class UnsupportedS3ConfigurationError(BotoCoreError):
+ """Error when an unsupported configuration is used with access-points"""
+
+ fmt = 'Unsupported configuration when using S3: {msg}'
+
+
+class UnsupportedS3AccesspointConfigurationError(BotoCoreError):
+ """Error when an unsupported configuration is used with access-points"""
+
+ fmt = 'Unsupported configuration when using S3 access-points: {msg}'
+
+
+class InvalidEndpointDiscoveryConfigurationError(BotoCoreError):
+ """Error when invalid value supplied for endpoint_discovery_enabled"""
+
+ fmt = (
+ 'Unsupported configuration value for endpoint_discovery_enabled. '
+ 'Expected one of ("true", "false", "auto") but got {config_value}.'
+ )
+
+
+class UnsupportedS3ControlConfigurationError(BotoCoreError):
+ """Error when an unsupported configuration is used with S3 Control"""
+
+ fmt = 'Unsupported configuration when using S3 Control: {msg}'
+
+
+class InvalidRetryConfigurationError(BotoCoreError):
+ """Error when invalid retry configuration is specified"""
+
+ fmt = (
+ 'Cannot provide retry configuration for "{retry_config_option}". '
+ 'Valid retry configuration options are: {valid_options}'
+ )
+
+
+class InvalidMaxRetryAttemptsError(InvalidRetryConfigurationError):
+ """Error when invalid retry configuration is specified"""
+
+ fmt = (
+ 'Value provided to "max_attempts": {provided_max_attempts} must '
+ 'be an integer greater than or equal to {min_value}.'
+ )
+
+
+class InvalidRetryModeError(InvalidRetryConfigurationError):
+ """Error when invalid retry mode configuration is specified"""
+
+ fmt = (
+ 'Invalid value provided to "mode": "{provided_retry_mode}" must '
+ 'be one of: {valid_modes}'
+ )
+
+
+class InvalidS3UsEast1RegionalEndpointConfigError(BotoCoreError):
+ """Error for invalid s3 us-east-1 regional endpoints configuration"""
+
+ fmt = (
+ 'S3 us-east-1 regional endpoint option '
+ '{s3_us_east_1_regional_endpoint_config} is '
+ 'invalid. Valid options are: "legacy", "regional"'
+ )
+
+
+class InvalidSTSRegionalEndpointsConfigError(BotoCoreError):
+ """Error when invalid sts regional endpoints configuration is specified"""
+
+ fmt = (
+ 'STS regional endpoints option {sts_regional_endpoints_config} is '
+ 'invalid. Valid options are: "legacy", "regional"'
+ )
+
+
+class StubResponseError(BotoCoreError):
+ fmt = (
+ 'Error getting response stub for operation {operation_name}: {reason}'
+ )
+
+
+class StubAssertionError(StubResponseError, AssertionError):
+ pass
+
+
+class UnStubbedResponseError(StubResponseError):
+ pass
+
+
+class InvalidConfigError(BotoCoreError):
+ fmt = '{error_msg}'
+
+
+class InfiniteLoopConfigError(InvalidConfigError):
+ fmt = (
+ 'Infinite loop in credential configuration detected. Attempting to '
+ 'load from profile {source_profile} which has already been visited. '
+ 'Visited profiles: {visited_profiles}'
+ )
+
+
+class RefreshWithMFAUnsupportedError(BotoCoreError):
+ fmt = 'Cannot refresh credentials: MFA token required.'
+
+
+class MD5UnavailableError(BotoCoreError):
+ fmt = "This system does not support MD5 generation."
+
+
+class MissingDependencyException(BotoCoreError):
+ fmt = "Missing Dependency: {msg}"
+
+
+class MetadataRetrievalError(BotoCoreError):
+ fmt = "Error retrieving metadata: {error_msg}"
+
+
+class UndefinedModelAttributeError(Exception):
+ pass
+
+
+class MissingServiceIdError(UndefinedModelAttributeError):
+ fmt = (
+ "The model being used for the service {service_name} is missing the "
+ "serviceId metadata property, which is required."
+ )
+
+ def __init__(self, **kwargs):
+ msg = self.fmt.format(**kwargs)
+ Exception.__init__(self, msg)
+ self.kwargs = kwargs
+
+
+class SSOError(BotoCoreError):
+ fmt = (
+ "An unspecified error happened when resolving AWS credentials or an "
+ "access token from SSO."
+ )
+
+
+class SSOTokenLoadError(SSOError):
+ fmt = "Error loading SSO Token: {error_msg}"
+
+
+class UnauthorizedSSOTokenError(SSOError):
+ fmt = (
+ "The SSO session associated with this profile has expired or is "
+ "otherwise invalid. To refresh this SSO session run aws sso login "
+ "with the corresponding profile."
+ )
+
+
+class CapacityNotAvailableError(BotoCoreError):
+ fmt = 'Insufficient request capacity available.'
+
+
+class InvalidProxiesConfigError(BotoCoreError):
+ fmt = 'Invalid configuration value(s) provided for proxies_config.'
+
+
+class InvalidDefaultsMode(BotoCoreError):
+ fmt = (
+ 'Client configured with invalid defaults mode: {mode}. '
+ 'Valid defaults modes include: {valid_modes}.'
+ )
+
+
+class AwsChunkedWrapperError(BotoCoreError):
+ fmt = '{error_msg}'
+
+
+class FlexibleChecksumError(BotoCoreError):
+ fmt = '{error_msg}'
+
+
+class InvalidEndpointConfigurationError(BotoCoreError):
+ fmt = 'Invalid endpoint configuration: {msg}'
+
+
+class EndpointProviderError(BotoCoreError):
+ """Base error for the EndpointProvider class"""
+
+ fmt = '{msg}'
+
+
+class EndpointResolutionError(EndpointProviderError):
+ """Error when input parameters resolve to an error rule"""
+
+ fmt = '{msg}'
+
+
+class UnknownEndpointResolutionBuiltInName(EndpointProviderError):
+ fmt = 'Unknown builtin variable name: {name}'
+
+
+class InvalidChecksumConfigError(BotoCoreError):
+ """Error when an invalid checksum config value is supplied."""
+
+ fmt = (
+ 'Unsupported configuration value for {config_key}. '
+ 'Expected one of {valid_options} but got {config_value}.'
+ )
+
+
+class UnsupportedServiceProtocolsError(BotoCoreError):
+ """Error when a service does not use any protocol supported by botocore."""
+
+ fmt = (
+ 'Botocore supports {botocore_supported_protocols}, but service {service} only '
+ 'supports {service_supported_protocols}.'
+ )
diff --git a/.venv/lib/python3.12/site-packages/botocore/handlers.py b/.venv/lib/python3.12/site-packages/botocore/handlers.py
new file mode 100644
index 00000000..29a8680a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/handlers.py
@@ -0,0 +1,1586 @@
+# Copyright 2012-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+
+"""Builtin event handlers.
+
+This module contains builtin handlers for events emitted by botocore.
+"""
+
+import base64
+import copy
+import logging
+import os
+import re
+import uuid
+import warnings
+from io import BytesIO
+
+import botocore
+import botocore.auth
+from botocore import utils
+from botocore.compat import (
+ ETree,
+ OrderedDict,
+ XMLParseError,
+ ensure_bytes,
+ get_md5,
+ json,
+ quote,
+ unquote,
+ unquote_str,
+ urlsplit,
+ urlunsplit,
+)
+from botocore.docs.utils import (
+ AppendParamDocumentation,
+ AutoPopulatedParam,
+ HideParamFromOperations,
+)
+from botocore.endpoint_provider import VALID_HOST_LABEL_RE
+from botocore.exceptions import (
+ AliasConflictParameterError,
+ ParamValidationError,
+ UnsupportedTLSVersionWarning,
+)
+from botocore.regions import EndpointResolverBuiltins
+from botocore.signers import (
+ add_dsql_generate_db_auth_token_methods,
+ add_generate_db_auth_token,
+ add_generate_presigned_post,
+ add_generate_presigned_url,
+)
+from botocore.utils import (
+ SAFE_CHARS,
+ ArnParser,
+ percent_encode,
+ switch_host_with_param,
+)
+
+# Keep these imported. There's pre-existing code that uses them.
+from botocore import retryhandler # noqa
+from botocore import translate # noqa
+from botocore.compat import MD5_AVAILABLE # noqa
+from botocore.exceptions import MissingServiceIdError # noqa
+from botocore.utils import hyphenize_service_id # noqa
+from botocore.utils import is_global_accesspoint # noqa
+from botocore.utils import SERVICE_NAME_ALIASES # noqa
+
+
+logger = logging.getLogger(__name__)
+
+REGISTER_FIRST = object()
+REGISTER_LAST = object()
+# From the S3 docs:
+# The rules for bucket names in the US Standard region allow bucket names
+# to be as long as 255 characters, and bucket names can contain any
+# combination of uppercase letters, lowercase letters, numbers, periods
+# (.), hyphens (-), and underscores (_).
+VALID_BUCKET = re.compile(r'^[a-zA-Z0-9.\-_]{1,255}$')
+_ACCESSPOINT_ARN = (
+ r'^arn:(aws).*:(s3|s3-object-lambda):[a-z\-0-9]*:[0-9]{12}:accesspoint[/:]'
+ r'[a-zA-Z0-9\-.]{1,63}$'
+)
+_OUTPOST_ARN = (
+ r'^arn:(aws).*:s3-outposts:[a-z\-0-9]+:[0-9]{12}:outpost[/:]'
+ r'[a-zA-Z0-9\-]{1,63}[/:]accesspoint[/:][a-zA-Z0-9\-]{1,63}$'
+)
+VALID_S3_ARN = re.compile('|'.join([_ACCESSPOINT_ARN, _OUTPOST_ARN]))
+# signing names used for the services s3 and s3-control, for example in
+# botocore/data/s3/2006-03-01/endpoints-rule-set-1.json
+S3_SIGNING_NAMES = ('s3', 's3-outposts', 's3-object-lambda', 's3express')
+VERSION_ID_SUFFIX = re.compile(r'\?versionId=[^\s]+$')
+
+
+def handle_service_name_alias(service_name, **kwargs):
+ return SERVICE_NAME_ALIASES.get(service_name, service_name)
+
+
+def add_recursion_detection_header(params, **kwargs):
+ has_lambda_name = 'AWS_LAMBDA_FUNCTION_NAME' in os.environ
+ trace_id = os.environ.get('_X_AMZN_TRACE_ID')
+ if has_lambda_name and trace_id:
+ headers = params['headers']
+ if 'X-Amzn-Trace-Id' not in headers:
+ headers['X-Amzn-Trace-Id'] = quote(trace_id, safe='-=;:+&[]{}"\',')
+
+
+def escape_xml_payload(params, **kwargs):
+ # Replace \r and \n with the escaped sequence over the whole XML document
+ # to avoid linebreak normalization modifying customer input when the
+ # document is parsed. Ideally, we would do this in ElementTree.tostring,
+ # but it doesn't allow us to override entity escaping for text fields. For
+ # this operation \r and \n can only appear in the XML document if they were
+ # passed as part of the customer input.
+ body = params['body']
+ if b'\r' in body:
+ body = body.replace(b'\r', b'&#xD;')
+ if b'\n' in body:
+ body = body.replace(b'\n', b'&#xA;')
+
+ params['body'] = body
+
+
+def check_for_200_error(response, **kwargs):
+ """This function has been deprecated, but is kept for backwards compatibility."""
+ # From: http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html
+ # There are two opportunities for a copy request to return an error. One
+ # can occur when Amazon S3 receives the copy request and the other can
+ # occur while Amazon S3 is copying the files. If the error occurs before
+ # the copy operation starts, you receive a standard Amazon S3 error. If the
+ # error occurs during the copy operation, the error response is embedded in
+ # the 200 OK response. This means that a 200 OK response can contain either
+ # a success or an error. Make sure to design your application to parse the
+ # contents of the response and handle it appropriately.
+ #
+ # So this handler checks for this case. Even though the server sends a
+ # 200 response, conceptually this should be handled exactly like a
+ # 500 response (with respect to raising exceptions, retries, etc.)
+ # We're connected *before* all the other retry logic handlers, so as long
+ # as we switch the error code to 500, we'll retry the error as expected.
+ if response is None:
+ # A None response can happen if an exception is raised while
+ # trying to retrieve the response. See Endpoint._get_response().
+ return
+ http_response, parsed = response
+ if _looks_like_special_case_error(
+ http_response.status_code, http_response.content
+ ):
+ logger.debug(
+ "Error found for response with 200 status code, "
+ "errors: %s, changing status code to "
+ "500.",
+ parsed,
+ )
+ http_response.status_code = 500
+
+
+def _looks_like_special_case_error(status_code, body):
+ if status_code == 200 and body:
+ try:
+ parser = ETree.XMLParser(
+ target=ETree.TreeBuilder(), encoding='utf-8'
+ )
+ parser.feed(body)
+ root = parser.close()
+ except XMLParseError:
+ # In cases of network disruptions, we may end up with a partial
+ # streamed response from S3. We need to treat these cases as
+ # 500 Service Errors and try again.
+ return True
+ if root.tag == 'Error':
+ return True
+ return False
+
+
+def set_operation_specific_signer(context, signing_name, **kwargs):
+ """Choose the operation-specific signer.
+
+ Individual operations may have a different auth type than the service as a
+ whole. This will most often manifest as operations that should not be
+ authenticated at all, but can include other auth modes such as sigv4
+ without body signing.
+ """
+ auth_type = context.get('auth_type')
+
+ # Auth type will be None if the operation doesn't have a configured auth
+ # type.
+ if not auth_type:
+ return
+
+ # Auth type will be the string value 'none' if the operation should not
+ # be signed at all.
+ if auth_type == 'none':
+ return botocore.UNSIGNED
+
+ if auth_type == 'bearer':
+ return 'bearer'
+
+ # If the operation needs an unsigned body, we set additional context
+ # allowing the signer to be aware of this.
+ if context.get('unsigned_payload') or auth_type == 'v4-unsigned-body':
+ context['payload_signing_enabled'] = False
+
+ if auth_type.startswith('v4'):
+ if auth_type == 'v4-s3express':
+ return auth_type
+
+ if auth_type == 'v4a':
+ # If sigv4a is chosen, we must add additional signing config for
+ # global signature.
+ region = _resolve_sigv4a_region(context)
+ signing = {'region': region, 'signing_name': signing_name}
+ if 'signing' in context:
+ context['signing'].update(signing)
+ else:
+ context['signing'] = signing
+ signature_version = 'v4a'
+ else:
+ signature_version = 'v4'
+
+ # Signing names used by s3 and s3-control use customized signers "s3v4"
+ # and "s3v4a".
+ if signing_name in S3_SIGNING_NAMES:
+ signature_version = f's3{signature_version}'
+
+ return signature_version
+
+
+def _resolve_sigv4a_region(context):
+ region = None
+ if 'client_config' in context:
+ region = context['client_config'].sigv4a_signing_region_set
+ if not region and context.get('signing', {}).get('region'):
+ region = context['signing']['region']
+ return region or '*'
+
+
+def decode_console_output(parsed, **kwargs):
+ if 'Output' in parsed:
+ try:
+ # We're using 'replace' for errors because it is
+ # possible that console output contains non string
+ # chars we can't utf-8 decode.
+ value = base64.b64decode(
+ bytes(parsed['Output'], 'latin-1')
+ ).decode('utf-8', 'replace')
+ parsed['Output'] = value
+ except (ValueError, TypeError, AttributeError):
+ logger.debug('Error decoding base64', exc_info=True)
+
+
+def generate_idempotent_uuid(params, model, **kwargs):
+ for name in model.idempotent_members:
+ if name not in params:
+ params[name] = str(uuid.uuid4())
+ logger.debug(
+ f"injecting idempotency token ({params[name]}) into param '{name}'."
+ )
+
+
+def decode_quoted_jsondoc(value):
+ try:
+ value = json.loads(unquote(value))
+ except (ValueError, TypeError):
+ logger.debug('Error loading quoted JSON', exc_info=True)
+ return value
+
+
+def json_decode_template_body(parsed, **kwargs):
+ if 'TemplateBody' in parsed:
+ try:
+ value = json.loads(
+ parsed['TemplateBody'], object_pairs_hook=OrderedDict
+ )
+ parsed['TemplateBody'] = value
+ except (ValueError, TypeError):
+ logger.debug('error loading JSON', exc_info=True)
+
+
+def validate_bucket_name(params, **kwargs):
+ if 'Bucket' not in params:
+ return
+ bucket = params['Bucket']
+ if not VALID_BUCKET.search(bucket) and not VALID_S3_ARN.search(bucket):
+ error_msg = (
+ f'Invalid bucket name "{bucket}": Bucket name must match '
+ f'the regex "{VALID_BUCKET.pattern}" or be an ARN matching '
+ f'the regex "{VALID_S3_ARN.pattern}"'
+ )
+ raise ParamValidationError(report=error_msg)
+
+
+def sse_md5(params, **kwargs):
+ """
+ S3 server-side encryption requires the encryption key to be sent to the
+ server base64 encoded, as well as a base64-encoded MD5 hash of the
+ encryption key. This handler does both if the MD5 has not been set by
+ the caller.
+ """
+ _sse_md5(params, 'SSECustomer')
+
+
+def copy_source_sse_md5(params, **kwargs):
+ """
+ S3 server-side encryption requires the encryption key to be sent to the
+ server base64 encoded, as well as a base64-encoded MD5 hash of the
+ encryption key. This handler does both if the MD5 has not been set by
+ the caller specifically if the parameter is for the copy-source sse-c key.
+ """
+ _sse_md5(params, 'CopySourceSSECustomer')
+
+
+def _sse_md5(params, sse_member_prefix='SSECustomer'):
+ if not _needs_s3_sse_customization(params, sse_member_prefix):
+ return
+
+ sse_key_member = sse_member_prefix + 'Key'
+ sse_md5_member = sse_member_prefix + 'KeyMD5'
+ key_as_bytes = params[sse_key_member]
+ if isinstance(key_as_bytes, str):
+ key_as_bytes = key_as_bytes.encode('utf-8')
+ key_md5_str = base64.b64encode(get_md5(key_as_bytes).digest()).decode(
+ 'utf-8'
+ )
+ key_b64_encoded = base64.b64encode(key_as_bytes).decode('utf-8')
+ params[sse_key_member] = key_b64_encoded
+ params[sse_md5_member] = key_md5_str
+
+
+def _needs_s3_sse_customization(params, sse_member_prefix):
+ return (
+ params.get(sse_member_prefix + 'Key') is not None
+ and sse_member_prefix + 'KeyMD5' not in params
+ )
+
+
+def disable_signing(**kwargs):
+ """
+ This handler disables request signing by setting the signer
+ name to a special sentinel value.
+ """
+ return botocore.UNSIGNED
+
+
+def add_expect_header(model, params, **kwargs):
+ if model.http.get('method', '') not in ['PUT', 'POST']:
+ return
+ if 'body' in params:
+ body = params['body']
+ if hasattr(body, 'read'):
+ check_body = utils.ensure_boolean(
+ os.environ.get(
+ 'BOTO_EXPERIMENTAL__NO_EMPTY_CONTINUE',
+ False,
+ )
+ )
+ if check_body and utils.determine_content_length(body) == 0:
+ return
+ # Any file like object will use an expect 100-continue
+ # header regardless of size.
+ logger.debug("Adding expect 100 continue header to request.")
+ params['headers']['Expect'] = '100-continue'
+
+
+class DeprecatedServiceDocumenter:
+ def __init__(self, replacement_service_name):
+ self._replacement_service_name = replacement_service_name
+
+ def inject_deprecation_notice(self, section, event_name, **kwargs):
+ section.style.start_important()
+ section.write('This service client is deprecated. Please use ')
+ section.style.ref(
+ self._replacement_service_name,
+ self._replacement_service_name,
+ )
+ section.write(' instead.')
+ section.style.end_important()
+
+
+def document_copy_source_form(section, event_name, **kwargs):
+ if 'request-example' in event_name:
+ parent = section.get_section('structure-value')
+ param_line = parent.get_section('CopySource')
+ value_portion = param_line.get_section('member-value')
+ value_portion.clear_text()
+ value_portion.write(
+ "'string' or {'Bucket': 'string', "
+ "'Key': 'string', 'VersionId': 'string'}"
+ )
+ elif 'request-params' in event_name:
+ param_section = section.get_section('CopySource')
+ type_section = param_section.get_section('param-type')
+ type_section.clear_text()
+ type_section.write(':type CopySource: str or dict')
+ doc_section = param_section.get_section('param-documentation')
+ doc_section.clear_text()
+ doc_section.write(
+ "The name of the source bucket, key name of the source object, "
+ "and optional version ID of the source object. You can either "
+ "provide this value as a string or a dictionary. The "
+ "string form is {bucket}/{key} or "
+ "{bucket}/{key}?versionId={versionId} if you want to copy a "
+ "specific version. You can also provide this value as a "
+ "dictionary. The dictionary format is recommended over "
+ "the string format because it is more explicit. The dictionary "
+ "format is: {'Bucket': 'bucket', 'Key': 'key', 'VersionId': 'id'}."
+ " Note that the VersionId key is optional and may be omitted."
+ " To specify an S3 access point, provide the access point"
+ " ARN for the ``Bucket`` key in the copy source dictionary. If you"
+ " want to provide the copy source for an S3 access point as a"
+ " string instead of a dictionary, the ARN provided must be the"
+ " full S3 access point object ARN"
+ " (i.e. {accesspoint_arn}/object/{key})"
+ )
+
+
+def handle_copy_source_param(params, **kwargs):
+ """Convert CopySource param for CopyObject/UploadPartCopy.
+
+ This handler will deal with two cases:
+
+ * CopySource provided as a string. We'll make a best effort
+ to URL encode the key name as required. This will require
+ parsing the bucket and version id from the CopySource value
+ and only encoding the key.
+ * CopySource provided as a dict. In this case we're
+ explicitly given the Bucket, Key, and VersionId so we're
+ able to encode the key and ensure this value is serialized
+ and correctly sent to S3.
+
+ """
+ source = params.get('CopySource')
+ if source is None:
+ # The call will eventually fail but we'll let the
+ # param validator take care of this. It will
+ # give a better error message.
+ return
+ if isinstance(source, str):
+ params['CopySource'] = _quote_source_header(source)
+ elif isinstance(source, dict):
+ params['CopySource'] = _quote_source_header_from_dict(source)
+
+
+def _quote_source_header_from_dict(source_dict):
+ try:
+ bucket = source_dict['Bucket']
+ key = source_dict['Key']
+ version_id = source_dict.get('VersionId')
+ if VALID_S3_ARN.search(bucket):
+ final = f'{bucket}/object/{key}'
+ else:
+ final = f'{bucket}/{key}'
+ except KeyError as e:
+ raise ParamValidationError(
+ report=f'Missing required parameter: {str(e)}'
+ )
+ final = percent_encode(final, safe=SAFE_CHARS + '/')
+ if version_id is not None:
+ final += f'?versionId={version_id}'
+ return final
+
+
+def _quote_source_header(value):
+ result = VERSION_ID_SUFFIX.search(value)
+ if result is None:
+ return percent_encode(value, safe=SAFE_CHARS + '/')
+ else:
+ first, version_id = value[: result.start()], value[result.start() :]
+ return percent_encode(first, safe=SAFE_CHARS + '/') + version_id
+
+
+def _get_cross_region_presigned_url(
+ request_signer, request_dict, model, source_region, destination_region
+):
+ # The better way to do this is to actually get the
+ # endpoint_resolver and get the endpoint_url given the
+ # source region. In this specific case, we know that
+ # we can safely replace the dest region with the source
+ # region because of the supported EC2 regions, but in
+ # general this is not a safe assumption to make.
+ # I think eventually we should try to plumb through something
+ # that allows us to resolve endpoints from regions.
+ request_dict_copy = copy.deepcopy(request_dict)
+ request_dict_copy['body']['DestinationRegion'] = destination_region
+ request_dict_copy['url'] = request_dict['url'].replace(
+ destination_region, source_region
+ )
+ request_dict_copy['method'] = 'GET'
+ request_dict_copy['headers'] = {}
+ return request_signer.generate_presigned_url(
+ request_dict_copy, region_name=source_region, operation_name=model.name
+ )
+
+
+def _get_presigned_url_source_and_destination_regions(request_signer, params):
+ # Gets the source and destination regions to be used
+ destination_region = request_signer._region_name
+ source_region = params.get('SourceRegion')
+ return source_region, destination_region
+
+
+def inject_presigned_url_ec2(params, request_signer, model, **kwargs):
+ # The customer can still provide this, so we should pass if they do.
+ if 'PresignedUrl' in params['body']:
+ return
+ src, dest = _get_presigned_url_source_and_destination_regions(
+ request_signer, params['body']
+ )
+ url = _get_cross_region_presigned_url(
+ request_signer, params, model, src, dest
+ )
+ params['body']['PresignedUrl'] = url
+ # EC2 Requires that the destination region be sent over the wire in
+ # addition to the source region.
+ params['body']['DestinationRegion'] = dest
+
+
+def inject_presigned_url_rds(params, request_signer, model, **kwargs):
+ # SourceRegion is not required for RDS operations, so it's possible that
+ # it isn't set. In that case it's probably a local copy so we don't need
+ # to do anything else.
+ if 'SourceRegion' not in params['body']:
+ return
+
+ src, dest = _get_presigned_url_source_and_destination_regions(
+ request_signer, params['body']
+ )
+
+ # Since SourceRegion isn't actually modeled for RDS, it needs to be
+ # removed from the request params before we send the actual request.
+ del params['body']['SourceRegion']
+
+ if 'PreSignedUrl' in params['body']:
+ return
+
+ url = _get_cross_region_presigned_url(
+ request_signer, params, model, src, dest
+ )
+ params['body']['PreSignedUrl'] = url
+
+
+def json_decode_policies(parsed, model, **kwargs):
+ # Any time an IAM operation returns a policy document
+ # it is a string that is json that has been urlencoded,
+ # i.e urlencode(json.dumps(policy_document)).
+ # To give users something more useful, we will urldecode
+ # this value and json.loads() the result so that they have
+ # the policy document as a dictionary.
+ output_shape = model.output_shape
+ if output_shape is not None:
+ _decode_policy_types(parsed, model.output_shape)
+
+
+def _decode_policy_types(parsed, shape):
+ # IAM consistently uses the policyDocumentType shape to indicate
+ # strings that have policy documents.
+ shape_name = 'policyDocumentType'
+ if shape.type_name == 'structure':
+ for member_name, member_shape in shape.members.items():
+ if (
+ member_shape.type_name == 'string'
+ and member_shape.name == shape_name
+ and member_name in parsed
+ ):
+ parsed[member_name] = decode_quoted_jsondoc(
+ parsed[member_name]
+ )
+ elif member_name in parsed:
+ _decode_policy_types(parsed[member_name], member_shape)
+ if shape.type_name == 'list':
+ shape_member = shape.member
+ for item in parsed:
+ _decode_policy_types(item, shape_member)
+
+
+def parse_get_bucket_location(parsed, http_response, **kwargs):
+ # s3.GetBucketLocation cannot be modeled properly. To
+ # account for this we just manually parse the XML document.
+ # The "parsed" passed in only has the ResponseMetadata
+ # filled out. This handler will fill in the LocationConstraint
+ # value.
+ if http_response.raw is None:
+ return
+ response_body = http_response.content
+ parser = ETree.XMLParser(target=ETree.TreeBuilder(), encoding='utf-8')
+ parser.feed(response_body)
+ root = parser.close()
+ region = root.text
+ parsed['LocationConstraint'] = region
+
+
+def base64_encode_user_data(params, **kwargs):
+ if 'UserData' in params:
+ if isinstance(params['UserData'], str):
+ # Encode it to bytes if it is text.
+ params['UserData'] = params['UserData'].encode('utf-8')
+ params['UserData'] = base64.b64encode(params['UserData']).decode(
+ 'utf-8'
+ )
+
+
+def document_base64_encoding(param):
+ description = (
+ '**This value will be base64 encoded automatically. Do '
+ 'not base64 encode this value prior to performing the '
+ 'operation.**'
+ )
+ append = AppendParamDocumentation(param, description)
+ return append.append_documentation
+
+
+def validate_ascii_metadata(params, **kwargs):
+ """Verify S3 Metadata only contains ascii characters.
+
+ From: http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html
+
+ "Amazon S3 stores user-defined metadata in lowercase. Each name, value pair
+ must conform to US-ASCII when using REST and UTF-8 when using SOAP or
+ browser-based uploads via POST."
+
+ """
+ metadata = params.get('Metadata')
+ if not metadata or not isinstance(metadata, dict):
+ # We have to at least type check the metadata as a dict type
+ # because this handler is called before param validation.
+ # We'll go ahead and return because the param validator will
+ # give a descriptive error message for us.
+ # We might need a post-param validation event.
+ return
+ for key, value in metadata.items():
+ try:
+ key.encode('ascii')
+ value.encode('ascii')
+ except UnicodeEncodeError:
+ error_msg = (
+ 'Non ascii characters found in S3 metadata '
+ f'for key "{key}", value: "{value}". \nS3 metadata can only '
+ 'contain ASCII characters. '
+ )
+ raise ParamValidationError(report=error_msg)
+
+
+def fix_route53_ids(params, model, **kwargs):
+ """
+ Check for and split apart Route53 resource IDs, setting
+ only the last piece. This allows the output of one operation
+ (e.g. ``'foo/1234'``) to be used as input in another
+ operation (e.g. it expects just ``'1234'``).
+ """
+ input_shape = model.input_shape
+ if not input_shape or not hasattr(input_shape, 'members'):
+ return
+
+ members = [
+ name
+ for (name, shape) in input_shape.members.items()
+ if shape.name in ['ResourceId', 'DelegationSetId', 'ChangeId']
+ ]
+
+ for name in members:
+ if name in params:
+ orig_value = params[name]
+ params[name] = orig_value.split('/')[-1]
+ logger.debug('%s %s -> %s', name, orig_value, params[name])
+
+
+def inject_account_id(params, **kwargs):
+ if params.get('accountId') is None:
+ # Glacier requires accountId, but allows you
+ # to specify '-' for the current owners account.
+ # We add this default value if the user does not
+ # provide the accountId as a convenience.
+ params['accountId'] = '-'
+
+
+def add_glacier_version(model, params, **kwargs):
+ request_dict = params
+ request_dict['headers']['x-amz-glacier-version'] = model.metadata[
+ 'apiVersion'
+ ]
+
+
+def add_accept_header(model, params, **kwargs):
+ if params['headers'].get('Accept', None) is None:
+ request_dict = params
+ request_dict['headers']['Accept'] = 'application/json'
+
+
+def add_glacier_checksums(params, **kwargs):
+ """Add glacier checksums to the http request.
+
+ This will add two headers to the http request:
+
+ * x-amz-content-sha256
+ * x-amz-sha256-tree-hash
+
+ These values will only be added if they are not present
+ in the HTTP request.
+
+ """
+ request_dict = params
+ headers = request_dict['headers']
+ body = request_dict['body']
+ if isinstance(body, bytes):
+ # If the user provided a bytes type instead of a file
+ # like object, we're temporarily create a BytesIO object
+ # so we can use the util functions to calculate the
+ # checksums which assume file like objects. Note that
+ # we're not actually changing the body in the request_dict.
+ body = BytesIO(body)
+ starting_position = body.tell()
+ if 'x-amz-content-sha256' not in headers:
+ headers['x-amz-content-sha256'] = utils.calculate_sha256(
+ body, as_hex=True
+ )
+ body.seek(starting_position)
+ if 'x-amz-sha256-tree-hash' not in headers:
+ headers['x-amz-sha256-tree-hash'] = utils.calculate_tree_hash(body)
+ body.seek(starting_position)
+
+
+def document_glacier_tree_hash_checksum():
+ doc = '''
+ This is a required field.
+
+ Ideally you will want to compute this value with checksums from
+ previous uploaded parts, using the algorithm described in
+ `Glacier documentation <http://docs.aws.amazon.com/amazonglacier/latest/dev/checksum-calculations.html>`_.
+
+ But if you prefer, you can also use botocore.utils.calculate_tree_hash()
+ to compute it from raw file by::
+
+ checksum = calculate_tree_hash(open('your_file.txt', 'rb'))
+
+ '''
+ return AppendParamDocumentation('checksum', doc).append_documentation
+
+
+def document_cloudformation_get_template_return_type(
+ section, event_name, **kwargs
+):
+ if 'response-params' in event_name:
+ template_body_section = section.get_section('TemplateBody')
+ type_section = template_body_section.get_section('param-type')
+ type_section.clear_text()
+ type_section.write('(*dict*) --')
+ elif 'response-example' in event_name:
+ parent = section.get_section('structure-value')
+ param_line = parent.get_section('TemplateBody')
+ value_portion = param_line.get_section('member-value')
+ value_portion.clear_text()
+ value_portion.write('{}')
+
+
+def switch_host_machinelearning(request, **kwargs):
+ switch_host_with_param(request, 'PredictEndpoint')
+
+
+def check_openssl_supports_tls_version_1_2(**kwargs):
+ import ssl
+
+ try:
+ openssl_version_tuple = ssl.OPENSSL_VERSION_INFO
+ if openssl_version_tuple < (1, 0, 1):
+ warnings.warn(
+ f'Currently installed openssl version: {ssl.OPENSSL_VERSION} does not '
+ 'support TLS 1.2, which is required for use of iot-data. '
+ 'Please use python installed with openssl version 1.0.1 or '
+ 'higher.',
+ UnsupportedTLSVersionWarning,
+ )
+ # We cannot check the openssl version on python2.6, so we should just
+ # pass on this conveniency check.
+ except AttributeError:
+ pass
+
+
+def change_get_to_post(request, **kwargs):
+ # This is useful when we need to change a potentially large GET request
+ # into a POST with x-www-form-urlencoded encoding.
+ if request.method == 'GET' and '?' in request.url:
+ request.headers['Content-Type'] = 'application/x-www-form-urlencoded'
+ request.method = 'POST'
+ request.url, request.data = request.url.split('?', 1)
+
+
+def set_list_objects_encoding_type_url(params, context, **kwargs):
+ if 'EncodingType' not in params:
+ # We set this context so that we know it wasn't the customer that
+ # requested the encoding.
+ context['encoding_type_auto_set'] = True
+ params['EncodingType'] = 'url'
+
+
+def decode_list_object(parsed, context, **kwargs):
+ # This is needed because we are passing url as the encoding type. Since the
+ # paginator is based on the key, we need to handle it before it can be
+ # round tripped.
+ #
+ # From the documentation: If you specify encoding-type request parameter,
+ # Amazon S3 includes this element in the response, and returns encoded key
+ # name values in the following response elements:
+ # Delimiter, Marker, Prefix, NextMarker, Key.
+ _decode_list_object(
+ top_level_keys=['Delimiter', 'Marker', 'NextMarker'],
+ nested_keys=[('Contents', 'Key'), ('CommonPrefixes', 'Prefix')],
+ parsed=parsed,
+ context=context,
+ )
+
+
+def decode_list_object_v2(parsed, context, **kwargs):
+ # From the documentation: If you specify encoding-type request parameter,
+ # Amazon S3 includes this element in the response, and returns encoded key
+ # name values in the following response elements:
+ # Delimiter, Prefix, ContinuationToken, Key, and StartAfter.
+ _decode_list_object(
+ top_level_keys=['Delimiter', 'Prefix', 'StartAfter'],
+ nested_keys=[('Contents', 'Key'), ('CommonPrefixes', 'Prefix')],
+ parsed=parsed,
+ context=context,
+ )
+
+
+def decode_list_object_versions(parsed, context, **kwargs):
+ # From the documentation: If you specify encoding-type request parameter,
+ # Amazon S3 includes this element in the response, and returns encoded key
+ # name values in the following response elements:
+ # KeyMarker, NextKeyMarker, Prefix, Key, and Delimiter.
+ _decode_list_object(
+ top_level_keys=[
+ 'KeyMarker',
+ 'NextKeyMarker',
+ 'Prefix',
+ 'Delimiter',
+ ],
+ nested_keys=[
+ ('Versions', 'Key'),
+ ('DeleteMarkers', 'Key'),
+ ('CommonPrefixes', 'Prefix'),
+ ],
+ parsed=parsed,
+ context=context,
+ )
+
+
+def _decode_list_object(top_level_keys, nested_keys, parsed, context):
+ if parsed.get('EncodingType') == 'url' and context.get(
+ 'encoding_type_auto_set'
+ ):
+ # URL decode top-level keys in the response if present.
+ for key in top_level_keys:
+ if key in parsed:
+ parsed[key] = unquote_str(parsed[key])
+ # URL decode nested keys from the response if present.
+ for top_key, child_key in nested_keys:
+ if top_key in parsed:
+ for member in parsed[top_key]:
+ member[child_key] = unquote_str(member[child_key])
+
+
+def convert_body_to_file_like_object(params, **kwargs):
+ if 'Body' in params:
+ if isinstance(params['Body'], str):
+ params['Body'] = BytesIO(ensure_bytes(params['Body']))
+ elif isinstance(params['Body'], bytes):
+ params['Body'] = BytesIO(params['Body'])
+
+
+def _add_parameter_aliases(handler_list):
+ # Mapping of original parameter to parameter alias.
+ # The key is <service>.<operation>.parameter
+ # The first part of the key is used for event registration.
+ # The last part is the original parameter name and the value is the
+ # alias to expose in documentation.
+ aliases = {
+ 'ec2.*.Filter': 'Filters',
+ 'logs.CreateExportTask.from': 'fromTime',
+ 'cloudsearchdomain.Search.return': 'returnFields',
+ }
+
+ for original, new_name in aliases.items():
+ event_portion, original_name = original.rsplit('.', 1)
+ parameter_alias = ParameterAlias(original_name, new_name)
+
+ # Add the handlers to the list of handlers.
+ # One handler is to handle when users provide the alias.
+ # The other handler is to update the documentation to show only
+ # the alias.
+ parameter_build_event_handler_tuple = (
+ 'before-parameter-build.' + event_portion,
+ parameter_alias.alias_parameter_in_call,
+ REGISTER_FIRST,
+ )
+ docs_event_handler_tuple = (
+ 'docs.*.' + event_portion + '.complete-section',
+ parameter_alias.alias_parameter_in_documentation,
+ )
+ handler_list.append(parameter_build_event_handler_tuple)
+ handler_list.append(docs_event_handler_tuple)
+
+
+class ParameterAlias:
+ def __init__(self, original_name, alias_name):
+ self._original_name = original_name
+ self._alias_name = alias_name
+
+ def alias_parameter_in_call(self, params, model, **kwargs):
+ if model.input_shape:
+ # Only consider accepting the alias if it is modeled in the
+ # input shape.
+ if self._original_name in model.input_shape.members:
+ if self._alias_name in params:
+ if self._original_name in params:
+ raise AliasConflictParameterError(
+ original=self._original_name,
+ alias=self._alias_name,
+ operation=model.name,
+ )
+ # Remove the alias parameter value and use the old name
+ # instead.
+ params[self._original_name] = params.pop(self._alias_name)
+
+ def alias_parameter_in_documentation(self, event_name, section, **kwargs):
+ if event_name.startswith('docs.request-params'):
+ if self._original_name not in section.available_sections:
+ return
+ # Replace the name for parameter type
+ param_section = section.get_section(self._original_name)
+ param_type_section = param_section.get_section('param-type')
+ self._replace_content(param_type_section)
+
+ # Replace the name for the parameter description
+ param_name_section = param_section.get_section('param-name')
+ self._replace_content(param_name_section)
+ elif event_name.startswith('docs.request-example'):
+ section = section.get_section('structure-value')
+ if self._original_name not in section.available_sections:
+ return
+ # Replace the name for the example
+ param_section = section.get_section(self._original_name)
+ self._replace_content(param_section)
+
+ def _replace_content(self, section):
+ content = section.getvalue().decode('utf-8')
+ updated_content = content.replace(
+ self._original_name, self._alias_name
+ )
+ section.clear_text()
+ section.write(updated_content)
+
+
+class ClientMethodAlias:
+ def __init__(self, actual_name):
+ """Aliases a non-extant method to an existing method.
+
+ :param actual_name: The name of the method that actually exists on
+ the client.
+ """
+ self._actual = actual_name
+
+ def __call__(self, client, **kwargs):
+ return getattr(client, self._actual)
+
+
+# TODO: Remove this class as it is no longer used
+class HeaderToHostHoister:
+ """Takes a header and moves it to the front of the hoststring."""
+
+ _VALID_HOSTNAME = re.compile(r'(?!-)[a-z\d-]{1,63}(?<!-)$', re.IGNORECASE)
+
+ def __init__(self, header_name):
+ self._header_name = header_name
+
+ def hoist(self, params, **kwargs):
+ """Hoist a header to the hostname.
+
+ Hoist a header to the beginning of the hostname with a suffix "." after
+ it. The original header should be removed from the header map. This
+ method is intended to be used as a target for the before-call event.
+ """
+ if self._header_name not in params['headers']:
+ return
+ header_value = params['headers'][self._header_name]
+ self._ensure_header_is_valid_host(header_value)
+ original_url = params['url']
+ new_url = self._prepend_to_host(original_url, header_value)
+ params['url'] = new_url
+
+ def _ensure_header_is_valid_host(self, header):
+ match = self._VALID_HOSTNAME.match(header)
+ if not match:
+ raise ParamValidationError(
+ report=(
+ 'Hostnames must contain only - and alphanumeric characters, '
+ 'and between 1 and 63 characters long.'
+ )
+ )
+
+ def _prepend_to_host(self, url, prefix):
+ url_components = urlsplit(url)
+ parts = url_components.netloc.split('.')
+ parts = [prefix] + parts
+ new_netloc = '.'.join(parts)
+ new_components = (
+ url_components.scheme,
+ new_netloc,
+ url_components.path,
+ url_components.query,
+ '',
+ )
+ new_url = urlunsplit(new_components)
+ return new_url
+
+
+def inject_api_version_header_if_needed(model, params, **kwargs):
+ if not model.is_endpoint_discovery_operation:
+ return
+ params['headers']['x-amz-api-version'] = model.service_model.api_version
+
+
+def remove_lex_v2_start_conversation(class_attributes, **kwargs):
+ """Operation requires h2 which is currently unsupported in Python"""
+ if 'start_conversation' in class_attributes:
+ del class_attributes['start_conversation']
+
+
+def remove_qbusiness_chat(class_attributes, **kwargs):
+ """Operation requires h2 which is currently unsupported in Python"""
+ if 'chat' in class_attributes:
+ del class_attributes['chat']
+
+
+def add_retry_headers(request, **kwargs):
+ retries_context = request.context.get('retries')
+ if not retries_context:
+ return
+ headers = request.headers
+ headers['amz-sdk-invocation-id'] = retries_context['invocation-id']
+ sdk_retry_keys = ('ttl', 'attempt', 'max')
+ sdk_request_headers = [
+ f'{key}={retries_context[key]}'
+ for key in sdk_retry_keys
+ if key in retries_context
+ ]
+ headers['amz-sdk-request'] = '; '.join(sdk_request_headers)
+
+
+def remove_bucket_from_url_paths_from_model(params, model, context, **kwargs):
+ """Strips leading `{Bucket}/` from any operations that have it.
+
+ The original value is retained in a separate "authPath" field. This is
+ used in the HmacV1Auth signer. See HmacV1Auth.canonical_resource in
+ botocore/auth.py for details.
+
+ This change is applied to the operation model during the first time the
+ operation is invoked and then stays in effect for the lifetime of the
+ client object.
+
+ When the ruleset based endpoint resolver is in effect, both the endpoint
+ ruleset AND the service model place the bucket name in the final URL.
+ The result is an invalid URL. This handler modifies the operation model to
+ no longer place the bucket name. Previous versions of botocore fixed the
+ URL after the fact when necessary. Since the introduction of ruleset based
+ endpoint resolution, the problem exists in ALL URLs that contain a bucket
+ name and can therefore be addressed before the URL gets assembled.
+ """
+ req_uri = model.http['requestUri']
+ bucket_path = '/{Bucket}'
+ if req_uri.startswith(bucket_path):
+ model.http['requestUri'] = req_uri[len(bucket_path) :]
+ # Strip query off the requestUri before using as authPath. The
+ # HmacV1Auth signer will append query params to the authPath during
+ # signing.
+ req_uri = req_uri.split('?')[0]
+ # If the request URI is ONLY a bucket, the auth_path must be
+ # terminated with a '/' character to generate a signature that the
+ # server will accept.
+ needs_slash = req_uri == bucket_path
+ model.http['authPath'] = f'{req_uri}/' if needs_slash else req_uri
+
+
+def remove_accid_host_prefix_from_model(params, model, context, **kwargs):
+ """Removes the `{AccountId}.` prefix from the operation model.
+
+ This change is applied to the operation model during the first time the
+ operation is invoked and then stays in effect for the lifetime of the
+ client object.
+
+ When the ruleset based endpoint resolver is in effect, both the endpoint
+ ruleset AND the service model place the {AccountId}. prefix in the URL.
+ The result is an invalid endpoint. This handler modifies the operation
+ model to remove the `endpoint.hostPrefix` field while leaving the
+ `RequiresAccountId` static context parameter in place.
+ """
+ has_ctx_param = any(
+ ctx_param.name == 'RequiresAccountId' and ctx_param.value is True
+ for ctx_param in model.static_context_parameters
+ )
+ if (
+ model.endpoint is not None
+ and model.endpoint.get('hostPrefix') == '{AccountId}.'
+ and has_ctx_param
+ ):
+ del model.endpoint['hostPrefix']
+
+
+def remove_arn_from_signing_path(request, **kwargs):
+ auth_path = request.auth_path
+ if isinstance(auth_path, str) and auth_path.startswith('/arn%3A'):
+ auth_path_parts = auth_path.split('/')
+ if len(auth_path_parts) > 1 and ArnParser.is_arn(
+ unquote(auth_path_parts[1])
+ ):
+ request.auth_path = '/'.join(['', *auth_path_parts[2:]])
+
+
+def customize_endpoint_resolver_builtins(
+ builtins, model, params, context, **kwargs
+):
+ """Modify builtin parameter values for endpoint resolver
+
+ Modifies the builtins dict in place. Changes are in effect for one call.
+ The corresponding event is emitted only if at least one builtin parameter
+ value is required for endpoint resolution for the operation.
+ """
+ bucket_name = params.get('Bucket')
+ bucket_is_arn = bucket_name is not None and ArnParser.is_arn(bucket_name)
+ # In some situations the host will return AuthorizationHeaderMalformed
+ # when the signing region of a sigv4 request is not the bucket's
+ # region (which is likely unknown by the user of GetBucketLocation).
+ # Avoid this by always using path-style addressing.
+ if model.name == 'GetBucketLocation':
+ builtins[EndpointResolverBuiltins.AWS_S3_FORCE_PATH_STYLE] = True
+ # All situations where the bucket name is an ARN are not compatible
+ # with path style addressing.
+ elif bucket_is_arn:
+ builtins[EndpointResolverBuiltins.AWS_S3_FORCE_PATH_STYLE] = False
+
+ # Bucket names that are invalid host labels require path-style addressing.
+ # If path-style addressing was specifically requested, the default builtin
+ # value is already set.
+ path_style_required = (
+ bucket_name is not None and not VALID_HOST_LABEL_RE.match(bucket_name)
+ )
+ path_style_requested = builtins[
+ EndpointResolverBuiltins.AWS_S3_FORCE_PATH_STYLE
+ ]
+
+ # Path-style addressing is incompatible with the global endpoint for
+ # presigned URLs. If the bucket name is an ARN, the ARN's region should be
+ # used in the endpoint.
+ if (
+ context.get('use_global_endpoint')
+ and not path_style_required
+ and not path_style_requested
+ and not bucket_is_arn
+ and not utils.is_s3express_bucket(bucket_name)
+ ):
+ builtins[EndpointResolverBuiltins.AWS_REGION] = 'aws-global'
+ builtins[EndpointResolverBuiltins.AWS_S3_USE_GLOBAL_ENDPOINT] = True
+
+
+def remove_content_type_header_for_presigning(request, **kwargs):
+ if (
+ request.context.get('is_presign_request') is True
+ and 'Content-Type' in request.headers
+ ):
+ del request.headers['Content-Type']
+
+
+def handle_expires_header(
+ operation_model, response_dict, customized_response_dict, **kwargs
+):
+ if _has_expires_shape(operation_model.output_shape):
+ if expires_value := response_dict.get('headers', {}).get('Expires'):
+ customized_response_dict['ExpiresString'] = expires_value
+ try:
+ utils.parse_timestamp(expires_value)
+ except (ValueError, RuntimeError):
+ logger.warning(
+ f'Failed to parse the "Expires" member as a timestamp: {expires_value}. '
+ f'The unparsed value is available in the response under "ExpiresString".'
+ )
+ del response_dict['headers']['Expires']
+
+
+def _has_expires_shape(shape):
+ if not shape:
+ return False
+ return any(
+ member_shape.name == 'Expires'
+ and member_shape.serialization.get('name') == 'Expires'
+ for member_shape in shape.members.values()
+ )
+
+
+def document_expires_shape(section, event_name, **kwargs):
+ # Updates the documentation for S3 operations that include the 'Expires' member
+ # in their response structure. Documents a synthetic member 'ExpiresString' and
+ # includes a deprecation notice for 'Expires'.
+ if 'response-example' in event_name:
+ if not section.has_section('structure-value'):
+ return
+ parent = section.get_section('structure-value')
+ if not parent.has_section('Expires'):
+ return
+ param_line = parent.get_section('Expires')
+ param_line.add_new_section('ExpiresString')
+ new_param_line = param_line.get_section('ExpiresString')
+ new_param_line.write("'ExpiresString': 'string',")
+ new_param_line.style.new_line()
+ elif 'response-params' in event_name:
+ if not section.has_section('Expires'):
+ return
+ param_section = section.get_section('Expires')
+ # Add a deprecation notice for the "Expires" param
+ doc_section = param_section.get_section('param-documentation')
+ doc_section.style.start_note()
+ doc_section.write(
+ 'This member has been deprecated. Please use ``ExpiresString`` instead.'
+ )
+ doc_section.style.end_note()
+ # Document the "ExpiresString" param
+ new_param_section = param_section.add_new_section('ExpiresString')
+ new_param_section.style.new_paragraph()
+ new_param_section.write('- **ExpiresString** *(string) --*')
+ new_param_section.style.indent()
+ new_param_section.style.new_paragraph()
+ new_param_section.write(
+ 'The raw, unparsed value of the ``Expires`` field.'
+ )
+
+
+def _handle_200_error(operation_model, response_dict, **kwargs):
+ # S3 can return a 200 response with an error embedded in the body.
+ # Convert the 200 to a 500 for retry resolution in ``_update_status_code``.
+ if not _should_handle_200_error(operation_model, response_dict):
+ # Operations with streaming response blobs are excluded as they
+ # can't be reliably distinguished from an S3 error.
+ return
+ if _looks_like_special_case_error(
+ response_dict['status_code'], response_dict['body']
+ ):
+ response_dict['status_code'] = 500
+ logger.debug(
+ f"Error found for response with 200 status code: {response_dict['body']}."
+ )
+
+
+def _should_handle_200_error(operation_model, response_dict):
+ output_shape = operation_model.output_shape
+ if (
+ not response_dict
+ or operation_model.has_event_stream_output
+ or not output_shape
+ ):
+ return False
+ payload = output_shape.serialization.get('payload')
+ if payload is not None:
+ payload_shape = output_shape.members[payload]
+ if payload_shape.type_name in ('blob', 'string'):
+ return False
+ return True
+
+
+def _update_status_code(response, **kwargs):
+ # Update the http_response status code when the parsed response has been
+ # modified in a handler. This enables retries for cases like ``_handle_200_error``.
+ if response is None:
+ return
+ http_response, parsed = response
+ parsed_status_code = parsed.get('ResponseMetadata', {}).get(
+ 'HTTPStatusCode', http_response.status_code
+ )
+ if http_response.status_code != parsed_status_code:
+ http_response.status_code = parsed_status_code
+
+
+def add_query_compatibility_header(model, params, **kwargs):
+ if not model.service_model.is_query_compatible:
+ return
+ params['headers']['x-amzn-query-mode'] = 'true'
+
+
+def _handle_request_validation_mode_member(params, model, **kwargs):
+ client_config = kwargs.get("context", {}).get("client_config")
+ if client_config is None:
+ return
+ response_checksum_validation = client_config.response_checksum_validation
+ http_checksum = model.http_checksum
+ mode_member = http_checksum.get("requestValidationModeMember")
+ if (
+ mode_member is not None
+ and response_checksum_validation == "when_supported"
+ ):
+ params.setdefault(mode_member, "ENABLED")
+
+
+def _set_extra_headers_for_unsigned_request(
+ request, signature_version, **kwargs
+):
+ # When sending a checksum in the trailer of an unsigned chunked request, S3
+ # requires us to set the "X-Amz-Content-SHA256" header to "STREAMING-UNSIGNED-PAYLOAD-TRAILER".
+ checksum_context = request.context.get("checksum", {})
+ algorithm = checksum_context.get("request_algorithm", {})
+ in_trailer = algorithm.get("in") == "trailer"
+ headers = request.headers
+ if signature_version == botocore.UNSIGNED and in_trailer:
+ headers["X-Amz-Content-SHA256"] = "STREAMING-UNSIGNED-PAYLOAD-TRAILER"
+
+
+# This is a list of (event_name, handler).
+# When a Session is created, everything in this list will be
+# automatically registered with that Session.
+
+BUILTIN_HANDLERS = [
+ ('choose-service-name', handle_service_name_alias),
+ (
+ 'getattr.mturk.list_hi_ts_for_qualification_type',
+ ClientMethodAlias('list_hits_for_qualification_type'),
+ ),
+ (
+ 'before-parameter-build.s3.UploadPart',
+ convert_body_to_file_like_object,
+ REGISTER_LAST,
+ ),
+ (
+ 'before-parameter-build.s3.PutObject',
+ convert_body_to_file_like_object,
+ REGISTER_LAST,
+ ),
+ ('creating-client-class', add_generate_presigned_url),
+ ('creating-client-class.s3', add_generate_presigned_post),
+ ('creating-client-class.iot-data', check_openssl_supports_tls_version_1_2),
+ ('creating-client-class.lex-runtime-v2', remove_lex_v2_start_conversation),
+ ('creating-client-class.qbusiness', remove_qbusiness_chat),
+ ('after-call.iam', json_decode_policies),
+ ('after-call.ec2.GetConsoleOutput', decode_console_output),
+ ('after-call.cloudformation.GetTemplate', json_decode_template_body),
+ ('after-call.s3.GetBucketLocation', parse_get_bucket_location),
+ ('before-parse.s3.*', handle_expires_header),
+ ('before-parse.s3.*', _handle_200_error, REGISTER_FIRST),
+ ('before-parameter-build', generate_idempotent_uuid),
+ ('before-parameter-build', _handle_request_validation_mode_member),
+ ('before-parameter-build.s3', validate_bucket_name),
+ ('before-parameter-build.s3', remove_bucket_from_url_paths_from_model),
+ (
+ 'before-parameter-build.s3.ListObjects',
+ set_list_objects_encoding_type_url,
+ ),
+ (
+ 'before-parameter-build.s3.ListObjectsV2',
+ set_list_objects_encoding_type_url,
+ ),
+ (
+ 'before-parameter-build.s3.ListObjectVersions',
+ set_list_objects_encoding_type_url,
+ ),
+ ('before-parameter-build.s3.CopyObject', handle_copy_source_param),
+ ('before-parameter-build.s3.UploadPartCopy', handle_copy_source_param),
+ ('before-parameter-build.s3.CopyObject', validate_ascii_metadata),
+ ('before-parameter-build.s3.PutObject', validate_ascii_metadata),
+ (
+ 'before-parameter-build.s3.CreateMultipartUpload',
+ validate_ascii_metadata,
+ ),
+ ('before-parameter-build.s3-control', remove_accid_host_prefix_from_model),
+ ('docs.*.s3.CopyObject.complete-section', document_copy_source_form),
+ ('docs.*.s3.UploadPartCopy.complete-section', document_copy_source_form),
+ ('docs.response-example.s3.*.complete-section', document_expires_shape),
+ ('docs.response-params.s3.*.complete-section', document_expires_shape),
+ ('before-endpoint-resolution.s3', customize_endpoint_resolver_builtins),
+ ('before-call', add_recursion_detection_header),
+ ('before-call', add_query_compatibility_header),
+ ('before-call.s3', add_expect_header),
+ ('before-call.glacier', add_glacier_version),
+ ('before-call.apigateway', add_accept_header),
+ ('before-call.s3.DeleteObjects', escape_xml_payload),
+ ('before-call.s3.PutBucketLifecycleConfiguration', escape_xml_payload),
+ ('before-call.glacier.UploadArchive', add_glacier_checksums),
+ ('before-call.glacier.UploadMultipartPart', add_glacier_checksums),
+ ('before-call.ec2.CopySnapshot', inject_presigned_url_ec2),
+ ('request-created', add_retry_headers),
+ ('request-created.machinelearning.Predict', switch_host_machinelearning),
+ ('needs-retry.s3.*', _update_status_code, REGISTER_FIRST),
+ ('choose-signer.cognito-identity.GetId', disable_signing),
+ ('choose-signer.cognito-identity.GetOpenIdToken', disable_signing),
+ ('choose-signer.cognito-identity.UnlinkIdentity', disable_signing),
+ (
+ 'choose-signer.cognito-identity.GetCredentialsForIdentity',
+ disable_signing,
+ ),
+ ('choose-signer.sts.AssumeRoleWithSAML', disable_signing),
+ ('choose-signer.sts.AssumeRoleWithWebIdentity', disable_signing),
+ ('choose-signer', set_operation_specific_signer),
+ ('before-parameter-build.s3.HeadObject', sse_md5),
+ ('before-parameter-build.s3.GetObject', sse_md5),
+ ('before-parameter-build.s3.PutObject', sse_md5),
+ ('before-parameter-build.s3.CopyObject', sse_md5),
+ ('before-parameter-build.s3.CopyObject', copy_source_sse_md5),
+ ('before-parameter-build.s3.CreateMultipartUpload', sse_md5),
+ ('before-parameter-build.s3.UploadPart', sse_md5),
+ ('before-parameter-build.s3.UploadPartCopy', sse_md5),
+ ('before-parameter-build.s3.UploadPartCopy', copy_source_sse_md5),
+ ('before-parameter-build.s3.CompleteMultipartUpload', sse_md5),
+ ('before-parameter-build.s3.SelectObjectContent', sse_md5),
+ ('before-parameter-build.ec2.RunInstances', base64_encode_user_data),
+ (
+ 'before-parameter-build.autoscaling.CreateLaunchConfiguration',
+ base64_encode_user_data,
+ ),
+ ('before-parameter-build.route53', fix_route53_ids),
+ ('before-parameter-build.glacier', inject_account_id),
+ ('before-sign.s3', remove_arn_from_signing_path),
+ ('before-sign.s3', _set_extra_headers_for_unsigned_request),
+ (
+ 'before-sign.polly.SynthesizeSpeech',
+ remove_content_type_header_for_presigning,
+ ),
+ ('after-call.s3.ListObjects', decode_list_object),
+ ('after-call.s3.ListObjectsV2', decode_list_object_v2),
+ ('after-call.s3.ListObjectVersions', decode_list_object_versions),
+ # Cloudsearchdomain search operation will be sent by HTTP POST
+ ('request-created.cloudsearchdomain.Search', change_get_to_post),
+ # Glacier documentation customizations
+ (
+ 'docs.*.glacier.*.complete-section',
+ AutoPopulatedParam(
+ 'accountId',
+ 'Note: this parameter is set to "-" by'
+ 'default if no value is not specified.',
+ ).document_auto_populated_param,
+ ),
+ (
+ 'docs.*.glacier.UploadArchive.complete-section',
+ AutoPopulatedParam('checksum').document_auto_populated_param,
+ ),
+ (
+ 'docs.*.glacier.UploadMultipartPart.complete-section',
+ AutoPopulatedParam('checksum').document_auto_populated_param,
+ ),
+ (
+ 'docs.request-params.glacier.CompleteMultipartUpload.complete-section',
+ document_glacier_tree_hash_checksum(),
+ ),
+ # Cloudformation documentation customizations
+ (
+ 'docs.*.cloudformation.GetTemplate.complete-section',
+ document_cloudformation_get_template_return_type,
+ ),
+ # UserData base64 encoding documentation customizations
+ (
+ 'docs.*.ec2.RunInstances.complete-section',
+ document_base64_encoding('UserData'),
+ ),
+ (
+ 'docs.*.autoscaling.CreateLaunchConfiguration.complete-section',
+ document_base64_encoding('UserData'),
+ ),
+ # EC2 CopySnapshot documentation customizations
+ (
+ 'docs.*.ec2.CopySnapshot.complete-section',
+ AutoPopulatedParam('PresignedUrl').document_auto_populated_param,
+ ),
+ (
+ 'docs.*.ec2.CopySnapshot.complete-section',
+ AutoPopulatedParam('DestinationRegion').document_auto_populated_param,
+ ),
+ # S3 SSE documentation modifications
+ (
+ 'docs.*.s3.*.complete-section',
+ AutoPopulatedParam('SSECustomerKeyMD5').document_auto_populated_param,
+ ),
+ # S3 SSE Copy Source documentation modifications
+ (
+ 'docs.*.s3.*.complete-section',
+ AutoPopulatedParam(
+ 'CopySourceSSECustomerKeyMD5'
+ ).document_auto_populated_param,
+ ),
+ # Add base64 information to Lambda
+ (
+ 'docs.*.lambda.UpdateFunctionCode.complete-section',
+ document_base64_encoding('ZipFile'),
+ ),
+ # The following S3 operations cannot actually accept a ContentMD5
+ (
+ 'docs.*.s3.*.complete-section',
+ HideParamFromOperations(
+ 's3',
+ 'ContentMD5',
+ [
+ 'DeleteObjects',
+ 'PutBucketAcl',
+ 'PutBucketCors',
+ 'PutBucketLifecycle',
+ 'PutBucketLogging',
+ 'PutBucketNotification',
+ 'PutBucketPolicy',
+ 'PutBucketReplication',
+ 'PutBucketRequestPayment',
+ 'PutBucketTagging',
+ 'PutBucketVersioning',
+ 'PutBucketWebsite',
+ 'PutObjectAcl',
+ ],
+ ).hide_param,
+ ),
+ #############
+ # DSQL
+ #############
+ ('creating-client-class.dsql', add_dsql_generate_db_auth_token_methods),
+ #############
+ # RDS
+ #############
+ ('creating-client-class.rds', add_generate_db_auth_token),
+ ('before-call.rds.CopyDBClusterSnapshot', inject_presigned_url_rds),
+ ('before-call.rds.CreateDBCluster', inject_presigned_url_rds),
+ ('before-call.rds.CopyDBSnapshot', inject_presigned_url_rds),
+ ('before-call.rds.CreateDBInstanceReadReplica', inject_presigned_url_rds),
+ (
+ 'before-call.rds.StartDBInstanceAutomatedBackupsReplication',
+ inject_presigned_url_rds,
+ ),
+ # RDS PresignedUrl documentation customizations
+ (
+ 'docs.*.rds.CopyDBClusterSnapshot.complete-section',
+ AutoPopulatedParam('PreSignedUrl').document_auto_populated_param,
+ ),
+ (
+ 'docs.*.rds.CreateDBCluster.complete-section',
+ AutoPopulatedParam('PreSignedUrl').document_auto_populated_param,
+ ),
+ (
+ 'docs.*.rds.CopyDBSnapshot.complete-section',
+ AutoPopulatedParam('PreSignedUrl').document_auto_populated_param,
+ ),
+ (
+ 'docs.*.rds.CreateDBInstanceReadReplica.complete-section',
+ AutoPopulatedParam('PreSignedUrl').document_auto_populated_param,
+ ),
+ (
+ 'docs.*.rds.StartDBInstanceAutomatedBackupsReplication.complete-section',
+ AutoPopulatedParam('PreSignedUrl').document_auto_populated_param,
+ ),
+ #############
+ # Neptune
+ #############
+ ('before-call.neptune.CopyDBClusterSnapshot', inject_presigned_url_rds),
+ ('before-call.neptune.CreateDBCluster', inject_presigned_url_rds),
+ # Neptune PresignedUrl documentation customizations
+ (
+ 'docs.*.neptune.CopyDBClusterSnapshot.complete-section',
+ AutoPopulatedParam('PreSignedUrl').document_auto_populated_param,
+ ),
+ (
+ 'docs.*.neptune.CreateDBCluster.complete-section',
+ AutoPopulatedParam('PreSignedUrl').document_auto_populated_param,
+ ),
+ #############
+ # DocDB
+ #############
+ ('before-call.docdb.CopyDBClusterSnapshot', inject_presigned_url_rds),
+ ('before-call.docdb.CreateDBCluster', inject_presigned_url_rds),
+ # DocDB PresignedUrl documentation customizations
+ (
+ 'docs.*.docdb.CopyDBClusterSnapshot.complete-section',
+ AutoPopulatedParam('PreSignedUrl').document_auto_populated_param,
+ ),
+ (
+ 'docs.*.docdb.CreateDBCluster.complete-section',
+ AutoPopulatedParam('PreSignedUrl').document_auto_populated_param,
+ ),
+ ('before-call', inject_api_version_header_if_needed),
+]
+_add_parameter_aliases(BUILTIN_HANDLERS)
diff --git a/.venv/lib/python3.12/site-packages/botocore/history.py b/.venv/lib/python3.12/site-packages/botocore/history.py
new file mode 100644
index 00000000..59d9481d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/history.py
@@ -0,0 +1,55 @@
+# Copyright 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import logging
+
+HISTORY_RECORDER = None
+logger = logging.getLogger(__name__)
+
+
+class BaseHistoryHandler:
+ def emit(self, event_type, payload, source):
+ raise NotImplementedError('emit()')
+
+
+class HistoryRecorder:
+ def __init__(self):
+ self._enabled = False
+ self._handlers = []
+
+ def enable(self):
+ self._enabled = True
+
+ def disable(self):
+ self._enabled = False
+
+ def add_handler(self, handler):
+ self._handlers.append(handler)
+
+ def record(self, event_type, payload, source='BOTOCORE'):
+ if self._enabled and self._handlers:
+ for handler in self._handlers:
+ try:
+ handler.emit(event_type, payload, source)
+ except Exception:
+ # Never let the process die because we had a failure in
+ # a record collection handler.
+ logger.debug(
+ "Exception raised in %s.", handler, exc_info=True
+ )
+
+
+def get_global_history_recorder():
+ global HISTORY_RECORDER
+ if HISTORY_RECORDER is None:
+ HISTORY_RECORDER = HistoryRecorder()
+ return HISTORY_RECORDER
diff --git a/.venv/lib/python3.12/site-packages/botocore/hooks.py b/.venv/lib/python3.12/site-packages/botocore/hooks.py
new file mode 100644
index 00000000..583cb39c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/hooks.py
@@ -0,0 +1,660 @@
+# Copyright 2012-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import copy
+import logging
+from collections import deque, namedtuple
+
+from botocore.compat import accepts_kwargs
+from botocore.utils import EVENT_ALIASES
+
+logger = logging.getLogger(__name__)
+
+
+_NodeList = namedtuple('NodeList', ['first', 'middle', 'last'])
+_FIRST = 0
+_MIDDLE = 1
+_LAST = 2
+
+
+class NodeList(_NodeList):
+ def __copy__(self):
+ first_copy = copy.copy(self.first)
+ middle_copy = copy.copy(self.middle)
+ last_copy = copy.copy(self.last)
+ copied = NodeList(first_copy, middle_copy, last_copy)
+ return copied
+
+
+def first_non_none_response(responses, default=None):
+ """Find first non None response in a list of tuples.
+
+ This function can be used to find the first non None response from
+ handlers connected to an event. This is useful if you are interested
+ in the returned responses from event handlers. Example usage::
+
+ print(first_non_none_response([(func1, None), (func2, 'foo'),
+ (func3, 'bar')]))
+ # This will print 'foo'
+
+ :type responses: list of tuples
+ :param responses: The responses from the ``EventHooks.emit`` method.
+ This is a list of tuples, and each tuple is
+ (handler, handler_response).
+
+ :param default: If no non-None responses are found, then this default
+ value will be returned.
+
+ :return: The first non-None response in the list of tuples.
+
+ """
+ for response in responses:
+ if response[1] is not None:
+ return response[1]
+ return default
+
+
+class BaseEventHooks:
+ def emit(self, event_name, **kwargs):
+ """Call all handlers subscribed to an event.
+
+ :type event_name: str
+ :param event_name: The name of the event to emit.
+
+ :type **kwargs: dict
+ :param **kwargs: Arbitrary kwargs to pass through to the
+ subscribed handlers. The ``event_name`` will be injected
+ into the kwargs so it's not necessary to add this to **kwargs.
+
+ :rtype: list of tuples
+ :return: A list of ``(handler_func, handler_func_return_value)``
+
+ """
+ return []
+
+ def register(
+ self, event_name, handler, unique_id=None, unique_id_uses_count=False
+ ):
+ """Register an event handler for a given event.
+
+ If a ``unique_id`` is given, the handler will not be registered
+ if a handler with the ``unique_id`` has already been registered.
+
+ Handlers are called in the order they have been registered.
+ Note handlers can also be registered with ``register_first()``
+ and ``register_last()``. All handlers registered with
+ ``register_first()`` are called before handlers registered
+ with ``register()`` which are called before handlers registered
+ with ``register_last()``.
+
+ """
+ self._verify_and_register(
+ event_name,
+ handler,
+ unique_id,
+ register_method=self._register,
+ unique_id_uses_count=unique_id_uses_count,
+ )
+
+ def register_first(
+ self, event_name, handler, unique_id=None, unique_id_uses_count=False
+ ):
+ """Register an event handler to be called first for an event.
+
+ All event handlers registered with ``register_first()`` will
+ be called before handlers registered with ``register()`` and
+ ``register_last()``.
+
+ """
+ self._verify_and_register(
+ event_name,
+ handler,
+ unique_id,
+ register_method=self._register_first,
+ unique_id_uses_count=unique_id_uses_count,
+ )
+
+ def register_last(
+ self, event_name, handler, unique_id=None, unique_id_uses_count=False
+ ):
+ """Register an event handler to be called last for an event.
+
+ All event handlers registered with ``register_last()`` will be called
+ after handlers registered with ``register_first()`` and ``register()``.
+
+ """
+ self._verify_and_register(
+ event_name,
+ handler,
+ unique_id,
+ register_method=self._register_last,
+ unique_id_uses_count=unique_id_uses_count,
+ )
+
+ def _verify_and_register(
+ self,
+ event_name,
+ handler,
+ unique_id,
+ register_method,
+ unique_id_uses_count,
+ ):
+ self._verify_is_callable(handler)
+ self._verify_accept_kwargs(handler)
+ register_method(event_name, handler, unique_id, unique_id_uses_count)
+
+ def unregister(
+ self,
+ event_name,
+ handler=None,
+ unique_id=None,
+ unique_id_uses_count=False,
+ ):
+ """Unregister an event handler for a given event.
+
+ If no ``unique_id`` was given during registration, then the
+ first instance of the event handler is removed (if the event
+ handler has been registered multiple times).
+
+ """
+ pass
+
+ def _verify_is_callable(self, func):
+ if not callable(func):
+ raise ValueError(f"Event handler {func} must be callable.")
+
+ def _verify_accept_kwargs(self, func):
+ """Verifies a callable accepts kwargs
+
+ :type func: callable
+ :param func: A callable object.
+
+ :returns: True, if ``func`` accepts kwargs, otherwise False.
+
+ """
+ try:
+ if not accepts_kwargs(func):
+ raise ValueError(
+ f"Event handler {func} must accept keyword "
+ f"arguments (**kwargs)"
+ )
+ except TypeError:
+ return False
+
+
+class HierarchicalEmitter(BaseEventHooks):
+ def __init__(self):
+ # We keep a reference to the handlers for quick
+ # read only access (we never modify self._handlers).
+ # A cache of event name to handler list.
+ self._lookup_cache = {}
+ self._handlers = _PrefixTrie()
+ # This is used to ensure that unique_id's are only
+ # registered once.
+ self._unique_id_handlers = {}
+
+ def _emit(self, event_name, kwargs, stop_on_response=False):
+ """
+ Emit an event with optional keyword arguments.
+
+ :type event_name: string
+ :param event_name: Name of the event
+ :type kwargs: dict
+ :param kwargs: Arguments to be passed to the handler functions.
+ :type stop_on_response: boolean
+ :param stop_on_response: Whether to stop on the first non-None
+ response. If False, then all handlers
+ will be called. This is especially useful
+ to handlers which mutate data and then
+ want to stop propagation of the event.
+ :rtype: list
+ :return: List of (handler, response) tuples from all processed
+ handlers.
+ """
+ responses = []
+ # Invoke the event handlers from most specific
+ # to least specific, each time stripping off a dot.
+ handlers_to_call = self._lookup_cache.get(event_name)
+ if handlers_to_call is None:
+ handlers_to_call = self._handlers.prefix_search(event_name)
+ self._lookup_cache[event_name] = handlers_to_call
+ elif not handlers_to_call:
+ # Short circuit and return an empty response is we have
+ # no handlers to call. This is the common case where
+ # for the majority of signals, nothing is listening.
+ return []
+ kwargs['event_name'] = event_name
+ responses = []
+ for handler in handlers_to_call:
+ logger.debug('Event %s: calling handler %s', event_name, handler)
+ response = handler(**kwargs)
+ responses.append((handler, response))
+ if stop_on_response and response is not None:
+ return responses
+ return responses
+
+ def emit(self, event_name, **kwargs):
+ """
+ Emit an event by name with arguments passed as keyword args.
+
+ >>> responses = emitter.emit(
+ ... 'my-event.service.operation', arg1='one', arg2='two')
+
+ :rtype: list
+ :return: List of (handler, response) tuples from all processed
+ handlers.
+ """
+ return self._emit(event_name, kwargs)
+
+ def emit_until_response(self, event_name, **kwargs):
+ """
+ Emit an event by name with arguments passed as keyword args,
+ until the first non-``None`` response is received. This
+ method prevents subsequent handlers from being invoked.
+
+ >>> handler, response = emitter.emit_until_response(
+ 'my-event.service.operation', arg1='one', arg2='two')
+
+ :rtype: tuple
+ :return: The first (handler, response) tuple where the response
+ is not ``None``, otherwise (``None``, ``None``).
+ """
+ responses = self._emit(event_name, kwargs, stop_on_response=True)
+ if responses:
+ return responses[-1]
+ else:
+ return (None, None)
+
+ def _register(
+ self, event_name, handler, unique_id=None, unique_id_uses_count=False
+ ):
+ self._register_section(
+ event_name,
+ handler,
+ unique_id,
+ unique_id_uses_count,
+ section=_MIDDLE,
+ )
+
+ def _register_first(
+ self, event_name, handler, unique_id=None, unique_id_uses_count=False
+ ):
+ self._register_section(
+ event_name,
+ handler,
+ unique_id,
+ unique_id_uses_count,
+ section=_FIRST,
+ )
+
+ def _register_last(
+ self, event_name, handler, unique_id, unique_id_uses_count=False
+ ):
+ self._register_section(
+ event_name, handler, unique_id, unique_id_uses_count, section=_LAST
+ )
+
+ def _register_section(
+ self, event_name, handler, unique_id, unique_id_uses_count, section
+ ):
+ if unique_id is not None:
+ if unique_id in self._unique_id_handlers:
+ # We've already registered a handler using this unique_id
+ # so we don't need to register it again.
+ count = self._unique_id_handlers[unique_id].get('count', None)
+ if unique_id_uses_count:
+ if not count:
+ raise ValueError(
+ f"Initial registration of unique id {unique_id} was "
+ "specified to use a counter. Subsequent register "
+ "calls to unique id must specify use of a counter "
+ "as well."
+ )
+ else:
+ self._unique_id_handlers[unique_id]['count'] += 1
+ else:
+ if count:
+ raise ValueError(
+ f"Initial registration of unique id {unique_id} was "
+ "specified to not use a counter. Subsequent "
+ "register calls to unique id must specify not to "
+ "use a counter as well."
+ )
+ return
+ else:
+ # Note that the trie knows nothing about the unique
+ # id. We track uniqueness in this class via the
+ # _unique_id_handlers.
+ self._handlers.append_item(
+ event_name, handler, section=section
+ )
+ unique_id_handler_item = {'handler': handler}
+ if unique_id_uses_count:
+ unique_id_handler_item['count'] = 1
+ self._unique_id_handlers[unique_id] = unique_id_handler_item
+ else:
+ self._handlers.append_item(event_name, handler, section=section)
+ # Super simple caching strategy for now, if we change the registrations
+ # clear the cache. This has the opportunity for smarter invalidations.
+ self._lookup_cache = {}
+
+ def unregister(
+ self,
+ event_name,
+ handler=None,
+ unique_id=None,
+ unique_id_uses_count=False,
+ ):
+ if unique_id is not None:
+ try:
+ count = self._unique_id_handlers[unique_id].get('count', None)
+ except KeyError:
+ # There's no handler matching that unique_id so we have
+ # nothing to unregister.
+ return
+ if unique_id_uses_count:
+ if count is None:
+ raise ValueError(
+ f"Initial registration of unique id {unique_id} was specified to "
+ "use a counter. Subsequent unregister calls to unique "
+ "id must specify use of a counter as well."
+ )
+ elif count == 1:
+ handler = self._unique_id_handlers.pop(unique_id)[
+ 'handler'
+ ]
+ else:
+ self._unique_id_handlers[unique_id]['count'] -= 1
+ return
+ else:
+ if count:
+ raise ValueError(
+ f"Initial registration of unique id {unique_id} was specified "
+ "to not use a counter. Subsequent unregister calls "
+ "to unique id must specify not to use a counter as "
+ "well."
+ )
+ handler = self._unique_id_handlers.pop(unique_id)['handler']
+ try:
+ self._handlers.remove_item(event_name, handler)
+ self._lookup_cache = {}
+ except ValueError:
+ pass
+
+ def __copy__(self):
+ new_instance = self.__class__()
+ new_state = self.__dict__.copy()
+ new_state['_handlers'] = copy.copy(self._handlers)
+ new_state['_unique_id_handlers'] = copy.copy(self._unique_id_handlers)
+ new_instance.__dict__ = new_state
+ return new_instance
+
+
+class EventAliaser(BaseEventHooks):
+ def __init__(self, event_emitter, event_aliases=None):
+ self._event_aliases = event_aliases
+ if event_aliases is None:
+ self._event_aliases = EVENT_ALIASES
+ self._alias_name_cache = {}
+ self._emitter = event_emitter
+
+ def emit(self, event_name, **kwargs):
+ aliased_event_name = self._alias_event_name(event_name)
+ return self._emitter.emit(aliased_event_name, **kwargs)
+
+ def emit_until_response(self, event_name, **kwargs):
+ aliased_event_name = self._alias_event_name(event_name)
+ return self._emitter.emit_until_response(aliased_event_name, **kwargs)
+
+ def register(
+ self, event_name, handler, unique_id=None, unique_id_uses_count=False
+ ):
+ aliased_event_name = self._alias_event_name(event_name)
+ return self._emitter.register(
+ aliased_event_name, handler, unique_id, unique_id_uses_count
+ )
+
+ def register_first(
+ self, event_name, handler, unique_id=None, unique_id_uses_count=False
+ ):
+ aliased_event_name = self._alias_event_name(event_name)
+ return self._emitter.register_first(
+ aliased_event_name, handler, unique_id, unique_id_uses_count
+ )
+
+ def register_last(
+ self, event_name, handler, unique_id=None, unique_id_uses_count=False
+ ):
+ aliased_event_name = self._alias_event_name(event_name)
+ return self._emitter.register_last(
+ aliased_event_name, handler, unique_id, unique_id_uses_count
+ )
+
+ def unregister(
+ self,
+ event_name,
+ handler=None,
+ unique_id=None,
+ unique_id_uses_count=False,
+ ):
+ aliased_event_name = self._alias_event_name(event_name)
+ return self._emitter.unregister(
+ aliased_event_name, handler, unique_id, unique_id_uses_count
+ )
+
+ def _alias_event_name(self, event_name):
+ if event_name in self._alias_name_cache:
+ return self._alias_name_cache[event_name]
+
+ for old_part, new_part in self._event_aliases.items():
+ # We can't simply do a string replace for everything, otherwise we
+ # might end up translating substrings that we never intended to
+ # translate. When there aren't any dots in the old event name
+ # part, then we can quickly replace the item in the list if it's
+ # there.
+ event_parts = event_name.split('.')
+ if '.' not in old_part:
+ try:
+ # Theoretically a given event name could have the same part
+ # repeated, but in practice this doesn't happen
+ event_parts[event_parts.index(old_part)] = new_part
+ except ValueError:
+ continue
+
+ # If there's dots in the name, it gets more complicated. Now we
+ # have to replace multiple sections of the original event.
+ elif old_part in event_name:
+ old_parts = old_part.split('.')
+ self._replace_subsection(event_parts, old_parts, new_part)
+ else:
+ continue
+
+ new_name = '.'.join(event_parts)
+ logger.debug(
+ f"Changing event name from {event_name} to {new_name}"
+ )
+ self._alias_name_cache[event_name] = new_name
+ return new_name
+
+ self._alias_name_cache[event_name] = event_name
+ return event_name
+
+ def _replace_subsection(self, sections, old_parts, new_part):
+ for i in range(len(sections)):
+ if (
+ sections[i] == old_parts[0]
+ and sections[i : i + len(old_parts)] == old_parts
+ ):
+ sections[i : i + len(old_parts)] = [new_part]
+ return
+
+ def __copy__(self):
+ return self.__class__(
+ copy.copy(self._emitter), copy.copy(self._event_aliases)
+ )
+
+
+class _PrefixTrie:
+ """Specialized prefix trie that handles wildcards.
+
+ The prefixes in this case are based on dot separated
+ names so 'foo.bar.baz' is::
+
+ foo -> bar -> baz
+
+ Wildcard support just means that having a key such as 'foo.bar.*.baz' will
+ be matched with a call to ``get_items(key='foo.bar.ANYTHING.baz')``.
+
+ You can think of this prefix trie as the equivalent as defaultdict(list),
+ except that it can do prefix searches:
+
+ foo.bar.baz -> A
+ foo.bar -> B
+ foo -> C
+
+ Calling ``get_items('foo.bar.baz')`` will return [A + B + C], from
+ most specific to least specific.
+
+ """
+
+ def __init__(self):
+ # Each dictionary can be though of as a node, where a node
+ # has values associated with the node, and children is a link
+ # to more nodes. So 'foo.bar' would have a 'foo' node with
+ # a 'bar' node as a child of foo.
+ # {'foo': {'children': {'bar': {...}}}}.
+ self._root = {'chunk': None, 'children': {}, 'values': None}
+
+ def append_item(self, key, value, section=_MIDDLE):
+ """Add an item to a key.
+
+ If a value is already associated with that key, the new
+ value is appended to the list for the key.
+ """
+ key_parts = key.split('.')
+ current = self._root
+ for part in key_parts:
+ if part not in current['children']:
+ new_child = {'chunk': part, 'values': None, 'children': {}}
+ current['children'][part] = new_child
+ current = new_child
+ else:
+ current = current['children'][part]
+ if current['values'] is None:
+ current['values'] = NodeList([], [], [])
+ current['values'][section].append(value)
+
+ def prefix_search(self, key):
+ """Collect all items that are prefixes of key.
+
+ Prefix in this case are delineated by '.' characters so
+ 'foo.bar.baz' is a 3 chunk sequence of 3 "prefixes" (
+ "foo", "bar", and "baz").
+
+ """
+ collected = deque()
+ key_parts = key.split('.')
+ current = self._root
+ self._get_items(current, key_parts, collected, 0)
+ return collected
+
+ def _get_items(self, starting_node, key_parts, collected, starting_index):
+ stack = [(starting_node, starting_index)]
+ key_parts_len = len(key_parts)
+ # Traverse down the nodes, where at each level we add the
+ # next part from key_parts as well as the wildcard element '*'.
+ # This means for each node we see we potentially add two more
+ # elements to our stack.
+ while stack:
+ current_node, index = stack.pop()
+ if current_node['values']:
+ # We're using extendleft because we want
+ # the values associated with the node furthest
+ # from the root to come before nodes closer
+ # to the root. extendleft() also adds its items
+ # in right-left order so .extendleft([1, 2, 3])
+ # will result in final_list = [3, 2, 1], which is
+ # why we reverse the lists.
+ node_list = current_node['values']
+ complete_order = (
+ node_list.first + node_list.middle + node_list.last
+ )
+ collected.extendleft(reversed(complete_order))
+ if not index == key_parts_len:
+ children = current_node['children']
+ directs = children.get(key_parts[index])
+ wildcard = children.get('*')
+ next_index = index + 1
+ if wildcard is not None:
+ stack.append((wildcard, next_index))
+ if directs is not None:
+ stack.append((directs, next_index))
+
+ def remove_item(self, key, value):
+ """Remove an item associated with a key.
+
+ If the value is not associated with the key a ``ValueError``
+ will be raised. If the key does not exist in the trie, a
+ ``ValueError`` will be raised.
+
+ """
+ key_parts = key.split('.')
+ current = self._root
+ self._remove_item(current, key_parts, value, index=0)
+
+ def _remove_item(self, current_node, key_parts, value, index):
+ if current_node is None:
+ return
+ elif index < len(key_parts):
+ next_node = current_node['children'].get(key_parts[index])
+ if next_node is not None:
+ self._remove_item(next_node, key_parts, value, index + 1)
+ if index == len(key_parts) - 1:
+ node_list = next_node['values']
+ if value in node_list.first:
+ node_list.first.remove(value)
+ elif value in node_list.middle:
+ node_list.middle.remove(value)
+ elif value in node_list.last:
+ node_list.last.remove(value)
+ if not next_node['children'] and not next_node['values']:
+ # Then this is a leaf node with no values so
+ # we can just delete this link from the parent node.
+ # This makes subsequent search faster in the case
+ # where a key does not exist.
+ del current_node['children'][key_parts[index]]
+ else:
+ raise ValueError(f"key is not in trie: {'.'.join(key_parts)}")
+
+ def __copy__(self):
+ # The fact that we're using a nested dict under the covers
+ # is an implementation detail, and the user shouldn't have
+ # to know that they'd normally need a deepcopy so we expose
+ # __copy__ instead of __deepcopy__.
+ new_copy = self.__class__()
+ copied_attrs = self._recursive_copy(self.__dict__)
+ new_copy.__dict__ = copied_attrs
+ return new_copy
+
+ def _recursive_copy(self, node):
+ # We can't use copy.deepcopy because we actually only want to copy
+ # the structure of the trie, not the handlers themselves.
+ # Each node has a chunk, children, and values.
+ copied_node = {}
+ for key, value in node.items():
+ if isinstance(value, NodeList):
+ copied_node[key] = copy.copy(value)
+ elif isinstance(value, dict):
+ copied_node[key] = self._recursive_copy(value)
+ else:
+ copied_node[key] = value
+ return copied_node
diff --git a/.venv/lib/python3.12/site-packages/botocore/httpchecksum.py b/.venv/lib/python3.12/site-packages/botocore/httpchecksum.py
new file mode 100644
index 00000000..929e147e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/httpchecksum.py
@@ -0,0 +1,550 @@
+# Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+
+"""The interfaces in this module are not intended for public use.
+
+This module defines interfaces for applying checksums to HTTP requests within
+the context of botocore. This involves both resolving the checksum to be used
+based on client configuration and environment, as well as application of the
+checksum to the request.
+"""
+
+import base64
+import io
+import logging
+from binascii import crc32
+from hashlib import sha1, sha256
+
+from botocore.compat import HAS_CRT, has_minimum_crt_version, urlparse
+from botocore.exceptions import (
+ AwsChunkedWrapperError,
+ FlexibleChecksumError,
+ MissingDependencyException,
+)
+from botocore.model import StructureShape
+from botocore.response import StreamingBody
+from botocore.utils import (
+ conditionally_calculate_md5,
+ determine_content_length,
+ has_checksum_header,
+)
+
+if HAS_CRT:
+ from awscrt import checksums as crt_checksums
+else:
+ crt_checksums = None
+
+logger = logging.getLogger(__name__)
+
+DEFAULT_CHECKSUM_ALGORITHM = "CRC32"
+
+
+class BaseChecksum:
+ _CHUNK_SIZE = 1024 * 1024
+
+ def update(self, chunk):
+ pass
+
+ def digest(self):
+ pass
+
+ def b64digest(self):
+ bs = self.digest()
+ return base64.b64encode(bs).decode("ascii")
+
+ def _handle_fileobj(self, fileobj):
+ start_position = fileobj.tell()
+ for chunk in iter(lambda: fileobj.read(self._CHUNK_SIZE), b""):
+ self.update(chunk)
+ fileobj.seek(start_position)
+
+ def handle(self, body):
+ if isinstance(body, (bytes, bytearray)):
+ self.update(body)
+ else:
+ self._handle_fileobj(body)
+ return self.b64digest()
+
+
+class Crc32Checksum(BaseChecksum):
+ def __init__(self):
+ self._int_crc32 = 0
+
+ def update(self, chunk):
+ self._int_crc32 = crc32(chunk, self._int_crc32) & 0xFFFFFFFF
+
+ def digest(self):
+ return self._int_crc32.to_bytes(4, byteorder="big")
+
+
+class CrtCrc32Checksum(BaseChecksum):
+ # Note: This class is only used if the CRT is available
+ def __init__(self):
+ self._int_crc32 = 0
+
+ def update(self, chunk):
+ new_checksum = crt_checksums.crc32(chunk, self._int_crc32)
+ self._int_crc32 = new_checksum & 0xFFFFFFFF
+
+ def digest(self):
+ return self._int_crc32.to_bytes(4, byteorder="big")
+
+
+class CrtCrc32cChecksum(BaseChecksum):
+ # Note: This class is only used if the CRT is available
+ def __init__(self):
+ self._int_crc32c = 0
+
+ def update(self, chunk):
+ new_checksum = crt_checksums.crc32c(chunk, self._int_crc32c)
+ self._int_crc32c = new_checksum & 0xFFFFFFFF
+
+ def digest(self):
+ return self._int_crc32c.to_bytes(4, byteorder="big")
+
+
+class CrtCrc64NvmeChecksum(BaseChecksum):
+ # Note: This class is only used if the CRT is available
+ def __init__(self):
+ self._int_crc64nvme = 0
+
+ def update(self, chunk):
+ new_checksum = crt_checksums.crc64nvme(chunk, self._int_crc64nvme)
+ self._int_crc64nvme = new_checksum & 0xFFFFFFFFFFFFFFFF
+
+ def digest(self):
+ return self._int_crc64nvme.to_bytes(8, byteorder="big")
+
+
+class Sha1Checksum(BaseChecksum):
+ def __init__(self):
+ self._checksum = sha1()
+
+ def update(self, chunk):
+ self._checksum.update(chunk)
+
+ def digest(self):
+ return self._checksum.digest()
+
+
+class Sha256Checksum(BaseChecksum):
+ def __init__(self):
+ self._checksum = sha256()
+
+ def update(self, chunk):
+ self._checksum.update(chunk)
+
+ def digest(self):
+ return self._checksum.digest()
+
+
+class AwsChunkedWrapper:
+ _DEFAULT_CHUNK_SIZE = 1024 * 1024
+
+ def __init__(
+ self,
+ raw,
+ checksum_cls=None,
+ checksum_name="x-amz-checksum",
+ chunk_size=None,
+ ):
+ self._raw = raw
+ self._checksum_name = checksum_name
+ self._checksum_cls = checksum_cls
+ self._reset()
+
+ if chunk_size is None:
+ chunk_size = self._DEFAULT_CHUNK_SIZE
+ self._chunk_size = chunk_size
+
+ def _reset(self):
+ self._remaining = b""
+ self._complete = False
+ self._checksum = None
+ if self._checksum_cls:
+ self._checksum = self._checksum_cls()
+
+ def seek(self, offset, whence=0):
+ if offset != 0 or whence != 0:
+ raise AwsChunkedWrapperError(
+ error_msg="Can only seek to start of stream"
+ )
+ self._reset()
+ self._raw.seek(0)
+
+ def read(self, size=None):
+ # Normalize "read all" size values to None
+ if size is not None and size <= 0:
+ size = None
+
+ # If the underlying body is done and we have nothing left then
+ # end the stream
+ if self._complete and not self._remaining:
+ return b""
+
+ # While we're not done and want more bytes
+ want_more_bytes = size is None or size > len(self._remaining)
+ while not self._complete and want_more_bytes:
+ self._remaining += self._make_chunk()
+ want_more_bytes = size is None or size > len(self._remaining)
+
+ # If size was None, we want to return everything
+ if size is None:
+ size = len(self._remaining)
+
+ # Return a chunk up to the size asked for
+ to_return = self._remaining[:size]
+ self._remaining = self._remaining[size:]
+ return to_return
+
+ def _make_chunk(self):
+ # NOTE: Chunk size is not deterministic as read could return less. This
+ # means we cannot know the content length of the encoded aws-chunked
+ # stream ahead of time without ensuring a consistent chunk size
+ raw_chunk = self._raw.read(self._chunk_size)
+ hex_len = hex(len(raw_chunk))[2:].encode("ascii")
+ self._complete = not raw_chunk
+
+ if self._checksum:
+ self._checksum.update(raw_chunk)
+
+ if self._checksum and self._complete:
+ name = self._checksum_name.encode("ascii")
+ checksum = self._checksum.b64digest().encode("ascii")
+ return b"0\r\n%s:%s\r\n\r\n" % (name, checksum)
+
+ return b"%s\r\n%s\r\n" % (hex_len, raw_chunk)
+
+ def __iter__(self):
+ while not self._complete:
+ yield self._make_chunk()
+
+
+class StreamingChecksumBody(StreamingBody):
+ def __init__(self, raw_stream, content_length, checksum, expected):
+ super().__init__(raw_stream, content_length)
+ self._checksum = checksum
+ self._expected = expected
+
+ def read(self, amt=None):
+ chunk = super().read(amt=amt)
+ self._checksum.update(chunk)
+ if amt is None or (not chunk and amt > 0):
+ self._validate_checksum()
+ return chunk
+
+ def _validate_checksum(self):
+ if self._checksum.digest() != base64.b64decode(self._expected):
+ error_msg = (
+ f"Expected checksum {self._expected} did not match calculated "
+ f"checksum: {self._checksum.b64digest()}"
+ )
+ raise FlexibleChecksumError(error_msg=error_msg)
+
+
+def resolve_checksum_context(request, operation_model, params):
+ resolve_request_checksum_algorithm(request, operation_model, params)
+ resolve_response_checksum_algorithms(request, operation_model, params)
+
+
+def resolve_request_checksum_algorithm(
+ request,
+ operation_model,
+ params,
+ supported_algorithms=None,
+):
+ # If the header is already set by the customer, skip calculation
+ if has_checksum_header(request):
+ return
+
+ checksum_context = request["context"].get("checksum", {})
+ request_checksum_calculation = request["context"][
+ "client_config"
+ ].request_checksum_calculation
+ http_checksum = operation_model.http_checksum
+ request_checksum_required = (
+ operation_model.http_checksum_required
+ or http_checksum.get("requestChecksumRequired")
+ )
+ algorithm_member = http_checksum.get("requestAlgorithmMember")
+ if algorithm_member and algorithm_member in params:
+ # If the client has opted into using flexible checksums and the
+ # request supports it, use that instead of checksum required
+ if supported_algorithms is None:
+ supported_algorithms = _SUPPORTED_CHECKSUM_ALGORITHMS
+
+ algorithm_name = params[algorithm_member].lower()
+ if algorithm_name not in supported_algorithms:
+ if not HAS_CRT and algorithm_name in _CRT_CHECKSUM_ALGORITHMS:
+ raise MissingDependencyException(
+ msg=(
+ f"Using {algorithm_name.upper()} requires an "
+ "additional dependency. You will need to pip install "
+ "botocore[crt] before proceeding."
+ )
+ )
+ raise FlexibleChecksumError(
+ error_msg=f"Unsupported checksum algorithm: {algorithm_name}"
+ )
+ elif request_checksum_required or (
+ algorithm_member and request_checksum_calculation == "when_supported"
+ ):
+ # Don't use a default checksum for presigned requests.
+ if request["context"].get("is_presign_request"):
+ return
+ algorithm_name = DEFAULT_CHECKSUM_ALGORITHM.lower()
+ algorithm_member_header = _get_request_algorithm_member_header(
+ operation_model, request, algorithm_member
+ )
+ if algorithm_member_header is not None:
+ checksum_context["request_algorithm_header"] = {
+ "name": algorithm_member_header,
+ "value": DEFAULT_CHECKSUM_ALGORITHM,
+ }
+ else:
+ return
+
+ location_type = "header"
+ if (
+ operation_model.has_streaming_input
+ and urlparse(request["url"]).scheme == "https"
+ ):
+ if request["context"]["client_config"].signature_version != 's3':
+ # Operations with streaming input must support trailers.
+ # We only support unsigned trailer checksums currently. As this
+ # disables payload signing we'll only use trailers over TLS.
+ location_type = "trailer"
+
+ algorithm = {
+ "algorithm": algorithm_name,
+ "in": location_type,
+ "name": f"x-amz-checksum-{algorithm_name}",
+ }
+
+ checksum_context["request_algorithm"] = algorithm
+ request["context"]["checksum"] = checksum_context
+
+
+def _get_request_algorithm_member_header(
+ operation_model, request, algorithm_member
+):
+ """Get the name of the header targeted by the "requestAlgorithmMember"."""
+ operation_input_shape = operation_model.input_shape
+ if not isinstance(operation_input_shape, StructureShape):
+ return
+
+ algorithm_member_shape = operation_input_shape.members.get(
+ algorithm_member
+ )
+
+ if algorithm_member_shape:
+ return algorithm_member_shape.serialization.get("name")
+
+
+def apply_request_checksum(request):
+ checksum_context = request.get("context", {}).get("checksum", {})
+ algorithm = checksum_context.get("request_algorithm")
+
+ if not algorithm:
+ return
+
+ if algorithm == "conditional-md5":
+ # Special case to handle the http checksum required trait
+ conditionally_calculate_md5(request)
+ elif algorithm["in"] == "header":
+ _apply_request_header_checksum(request)
+ elif algorithm["in"] == "trailer":
+ _apply_request_trailer_checksum(request)
+ else:
+ raise FlexibleChecksumError(
+ error_msg="Unknown checksum variant: {}".format(algorithm["in"])
+ )
+ if "request_algorithm_header" in checksum_context:
+ request_algorithm_header = checksum_context["request_algorithm_header"]
+ request["headers"][request_algorithm_header["name"]] = (
+ request_algorithm_header["value"]
+ )
+
+
+def _apply_request_header_checksum(request):
+ checksum_context = request.get("context", {}).get("checksum", {})
+ algorithm = checksum_context.get("request_algorithm")
+ location_name = algorithm["name"]
+ if location_name in request["headers"]:
+ # If the header is already set by the customer, skip calculation
+ return
+ checksum_cls = _CHECKSUM_CLS.get(algorithm["algorithm"])
+ digest = checksum_cls().handle(request["body"])
+ request["headers"][location_name] = digest
+
+
+def _apply_request_trailer_checksum(request):
+ checksum_context = request.get("context", {}).get("checksum", {})
+ algorithm = checksum_context.get("request_algorithm")
+ location_name = algorithm["name"]
+ checksum_cls = _CHECKSUM_CLS.get(algorithm["algorithm"])
+
+ headers = request["headers"]
+ body = request["body"]
+
+ if location_name in headers:
+ # If the header is already set by the customer, skip calculation
+ return
+
+ headers["Transfer-Encoding"] = "chunked"
+ if "Content-Encoding" in headers:
+ # We need to preserve the existing content encoding and add
+ # aws-chunked as a new content encoding.
+ headers["Content-Encoding"] += ",aws-chunked"
+ else:
+ headers["Content-Encoding"] = "aws-chunked"
+ headers["X-Amz-Trailer"] = location_name
+
+ content_length = determine_content_length(body)
+ if content_length is not None:
+ # Send the decoded content length if we can determine it. Some
+ # services such as S3 may require the decoded content length
+ headers["X-Amz-Decoded-Content-Length"] = str(content_length)
+
+ if "Content-Length" in headers:
+ del headers["Content-Length"]
+ logger.debug(
+ "Removing the Content-Length header since 'chunked' is specified for Transfer-Encoding."
+ )
+
+ if isinstance(body, (bytes, bytearray)):
+ body = io.BytesIO(body)
+
+ request["body"] = AwsChunkedWrapper(
+ body,
+ checksum_cls=checksum_cls,
+ checksum_name=location_name,
+ )
+
+
+def resolve_response_checksum_algorithms(
+ request, operation_model, params, supported_algorithms=None
+):
+ http_checksum = operation_model.http_checksum
+ mode_member = http_checksum.get("requestValidationModeMember")
+ if mode_member and mode_member in params:
+ if supported_algorithms is None:
+ supported_algorithms = _SUPPORTED_CHECKSUM_ALGORITHMS
+ response_algorithms = {
+ a.lower() for a in http_checksum.get("responseAlgorithms", [])
+ }
+
+ usable_algorithms = []
+ for algorithm in _ALGORITHMS_PRIORITY_LIST:
+ if algorithm not in response_algorithms:
+ continue
+ if algorithm in supported_algorithms:
+ usable_algorithms.append(algorithm)
+
+ checksum_context = request["context"].get("checksum", {})
+ checksum_context["response_algorithms"] = usable_algorithms
+ request["context"]["checksum"] = checksum_context
+
+
+def handle_checksum_body(http_response, response, context, operation_model):
+ headers = response["headers"]
+ checksum_context = context.get("checksum", {})
+ algorithms = checksum_context.get("response_algorithms")
+
+ if not algorithms:
+ return
+
+ for algorithm in algorithms:
+ header_name = f"x-amz-checksum-{algorithm}"
+ # If the header is not found, check the next algorithm
+ if header_name not in headers:
+ continue
+
+ # If a - is in the checksum this is not valid Base64. S3 returns
+ # checksums that include a -# suffix to indicate a checksum derived
+ # from the hash of all part checksums. We cannot wrap this response
+ if "-" in headers[header_name]:
+ continue
+
+ if operation_model.has_streaming_output:
+ response["body"] = _handle_streaming_response(
+ http_response, response, algorithm
+ )
+ else:
+ response["body"] = _handle_bytes_response(
+ http_response, response, algorithm
+ )
+
+ # Expose metadata that the checksum check actually occurred
+ checksum_context = response["context"].get("checksum", {})
+ checksum_context["response_algorithm"] = algorithm
+ response["context"]["checksum"] = checksum_context
+ return
+
+ logger.debug(
+ f'Skipping checksum validation. Response did not contain one of the '
+ f'following algorithms: {algorithms}.'
+ )
+
+
+def _handle_streaming_response(http_response, response, algorithm):
+ checksum_cls = _CHECKSUM_CLS.get(algorithm)
+ header_name = f"x-amz-checksum-{algorithm}"
+ return StreamingChecksumBody(
+ http_response.raw,
+ response["headers"].get("content-length"),
+ checksum_cls(),
+ response["headers"][header_name],
+ )
+
+
+def _handle_bytes_response(http_response, response, algorithm):
+ body = http_response.content
+ header_name = f"x-amz-checksum-{algorithm}"
+ checksum_cls = _CHECKSUM_CLS.get(algorithm)
+ checksum = checksum_cls()
+ checksum.update(body)
+ expected = response["headers"][header_name]
+ if checksum.digest() != base64.b64decode(expected):
+ error_msg = (
+ f"Expected checksum {expected} did not match calculated "
+ f"checksum: {checksum.b64digest()}"
+ )
+ raise FlexibleChecksumError(error_msg=error_msg)
+ return body
+
+
+_CHECKSUM_CLS = {
+ "crc32": Crc32Checksum,
+ "sha1": Sha1Checksum,
+ "sha256": Sha256Checksum,
+}
+_CRT_CHECKSUM_ALGORITHMS = ["crc32", "crc32c", "crc64nvme"]
+if HAS_CRT:
+ # Use CRT checksum implementations if available
+ _CRT_CHECKSUM_CLS = {
+ "crc32": CrtCrc32Checksum,
+ "crc32c": CrtCrc32cChecksum,
+ }
+
+ if has_minimum_crt_version((0, 23, 4)):
+ # CRC64NVME support wasn't officially added until 0.23.4
+ _CRT_CHECKSUM_CLS["crc64nvme"] = CrtCrc64NvmeChecksum
+
+ _CHECKSUM_CLS.update(_CRT_CHECKSUM_CLS)
+ # Validate this list isn't out of sync with _CRT_CHECKSUM_CLS keys
+ assert all(
+ name in _CRT_CHECKSUM_ALGORITHMS for name in _CRT_CHECKSUM_CLS.keys()
+ )
+_SUPPORTED_CHECKSUM_ALGORITHMS = list(_CHECKSUM_CLS.keys())
+_ALGORITHMS_PRIORITY_LIST = ['crc64nvme', 'crc32c', 'crc32', 'sha1', 'sha256']
diff --git a/.venv/lib/python3.12/site-packages/botocore/httpsession.py b/.venv/lib/python3.12/site-packages/botocore/httpsession.py
new file mode 100644
index 00000000..bd8b82fa
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/httpsession.py
@@ -0,0 +1,509 @@
+import logging
+import os
+import os.path
+import socket
+import sys
+import warnings
+from base64 import b64encode
+
+from urllib3 import PoolManager, Timeout, proxy_from_url
+from urllib3.exceptions import (
+ ConnectTimeoutError as URLLib3ConnectTimeoutError,
+)
+from urllib3.exceptions import (
+ LocationParseError,
+ NewConnectionError,
+ ProtocolError,
+ ProxyError,
+)
+from urllib3.exceptions import ReadTimeoutError as URLLib3ReadTimeoutError
+from urllib3.exceptions import SSLError as URLLib3SSLError
+from urllib3.util.retry import Retry
+from urllib3.util.ssl_ import (
+ OP_NO_COMPRESSION,
+ PROTOCOL_TLS,
+ OP_NO_SSLv2,
+ OP_NO_SSLv3,
+ is_ipaddress,
+ ssl,
+)
+from urllib3.util.url import parse_url
+
+try:
+ from urllib3.util.ssl_ import OP_NO_TICKET, PROTOCOL_TLS_CLIENT
+except ImportError:
+ # Fallback directly to ssl for version of urllib3 before 1.26.
+ # They are available in the standard library starting in Python 3.6.
+ from ssl import OP_NO_TICKET, PROTOCOL_TLS_CLIENT
+
+try:
+ # pyopenssl will be removed in urllib3 2.0, we'll fall back to ssl_ at that point.
+ # This can be removed once our urllib3 floor is raised to >= 2.0.
+ with warnings.catch_warnings():
+ warnings.simplefilter("ignore", category=DeprecationWarning)
+ # Always import the original SSLContext, even if it has been patched
+ from urllib3.contrib.pyopenssl import (
+ orig_util_SSLContext as SSLContext,
+ )
+except ImportError:
+ from urllib3.util.ssl_ import SSLContext
+
+try:
+ from urllib3.util.ssl_ import DEFAULT_CIPHERS
+except ImportError:
+ # Defer to system configuration starting with
+ # urllib3 2.0. This will choose the ciphers provided by
+ # Openssl 1.1.1+ or secure system defaults.
+ DEFAULT_CIPHERS = None
+
+import botocore.awsrequest
+from botocore.compat import (
+ IPV6_ADDRZ_RE,
+ ensure_bytes,
+ filter_ssl_warnings,
+ unquote,
+ urlparse,
+)
+from botocore.exceptions import (
+ ConnectionClosedError,
+ ConnectTimeoutError,
+ EndpointConnectionError,
+ HTTPClientError,
+ InvalidProxiesConfigError,
+ ProxyConnectionError,
+ ReadTimeoutError,
+ SSLError,
+)
+
+filter_ssl_warnings()
+logger = logging.getLogger(__name__)
+DEFAULT_TIMEOUT = 60
+MAX_POOL_CONNECTIONS = 10
+DEFAULT_CA_BUNDLE = os.path.join(os.path.dirname(__file__), 'cacert.pem')
+
+try:
+ from certifi import where
+except ImportError:
+
+ def where():
+ return DEFAULT_CA_BUNDLE
+
+
+def get_cert_path(verify):
+ if verify is not True:
+ return verify
+
+ cert_path = where()
+ logger.debug(f"Certificate path: {cert_path}")
+
+ return cert_path
+
+
+def create_urllib3_context(
+ ssl_version=None, cert_reqs=None, options=None, ciphers=None
+):
+ """This function is a vendored version of the same function in urllib3
+
+ We vendor this function to ensure that the SSL contexts we construct
+ always use the std lib SSLContext instead of pyopenssl.
+ """
+ # PROTOCOL_TLS is deprecated in Python 3.10
+ if not ssl_version or ssl_version == PROTOCOL_TLS:
+ ssl_version = PROTOCOL_TLS_CLIENT
+
+ context = SSLContext(ssl_version)
+
+ if ciphers:
+ context.set_ciphers(ciphers)
+ elif DEFAULT_CIPHERS:
+ context.set_ciphers(DEFAULT_CIPHERS)
+
+ # Setting the default here, as we may have no ssl module on import
+ cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs
+
+ if options is None:
+ options = 0
+ # SSLv2 is easily broken and is considered harmful and dangerous
+ options |= OP_NO_SSLv2
+ # SSLv3 has several problems and is now dangerous
+ options |= OP_NO_SSLv3
+ # Disable compression to prevent CRIME attacks for OpenSSL 1.0+
+ # (issue urllib3#309)
+ options |= OP_NO_COMPRESSION
+ # TLSv1.2 only. Unless set explicitly, do not request tickets.
+ # This may save some bandwidth on wire, and although the ticket is encrypted,
+ # there is a risk associated with it being on wire,
+ # if the server is not rotating its ticketing keys properly.
+ options |= OP_NO_TICKET
+
+ context.options |= options
+
+ # Enable post-handshake authentication for TLS 1.3, see GH #1634. PHA is
+ # necessary for conditional client cert authentication with TLS 1.3.
+ # The attribute is None for OpenSSL <= 1.1.0 or does not exist in older
+ # versions of Python. We only enable on Python 3.7.4+ or if certificate
+ # verification is enabled to work around Python issue #37428
+ # See: https://bugs.python.org/issue37428
+ if (
+ cert_reqs == ssl.CERT_REQUIRED or sys.version_info >= (3, 7, 4)
+ ) and getattr(context, "post_handshake_auth", None) is not None:
+ context.post_handshake_auth = True
+
+ def disable_check_hostname():
+ if (
+ getattr(context, "check_hostname", None) is not None
+ ): # Platform-specific: Python 3.2
+ # We do our own verification, including fingerprints and alternative
+ # hostnames. So disable it here
+ context.check_hostname = False
+
+ # The order of the below lines setting verify_mode and check_hostname
+ # matter due to safe-guards SSLContext has to prevent an SSLContext with
+ # check_hostname=True, verify_mode=NONE/OPTIONAL. This is made even more
+ # complex because we don't know whether PROTOCOL_TLS_CLIENT will be used
+ # or not so we don't know the initial state of the freshly created SSLContext.
+ if cert_reqs == ssl.CERT_REQUIRED:
+ context.verify_mode = cert_reqs
+ disable_check_hostname()
+ else:
+ disable_check_hostname()
+ context.verify_mode = cert_reqs
+
+ # Enable logging of TLS session keys via defacto standard environment variable
+ # 'SSLKEYLOGFILE', if the feature is available (Python 3.8+). Skip empty values.
+ if hasattr(context, "keylog_filename"):
+ sslkeylogfile = os.environ.get("SSLKEYLOGFILE")
+ if sslkeylogfile and not sys.flags.ignore_environment:
+ context.keylog_filename = sslkeylogfile
+
+ return context
+
+
+def ensure_boolean(val):
+ """Ensures a boolean value if a string or boolean is provided
+
+ For strings, the value for True/False is case insensitive
+ """
+ if isinstance(val, bool):
+ return val
+ else:
+ return val.lower() == 'true'
+
+
+def mask_proxy_url(proxy_url):
+ """
+ Mask proxy url credentials.
+
+ :type proxy_url: str
+ :param proxy_url: The proxy url, i.e. https://username:password@proxy.com
+
+ :return: Masked proxy url, i.e. https://***:***@proxy.com
+ """
+ mask = '*' * 3
+ parsed_url = urlparse(proxy_url)
+ if parsed_url.username:
+ proxy_url = proxy_url.replace(parsed_url.username, mask, 1)
+ if parsed_url.password:
+ proxy_url = proxy_url.replace(parsed_url.password, mask, 1)
+ return proxy_url
+
+
+def _is_ipaddress(host):
+ """Wrap urllib3's is_ipaddress to support bracketed IPv6 addresses."""
+ return is_ipaddress(host) or bool(IPV6_ADDRZ_RE.match(host))
+
+
+class ProxyConfiguration:
+ """Represents a proxy configuration dictionary and additional settings.
+
+ This class represents a proxy configuration dictionary and provides utility
+ functions to retrieve well structured proxy urls and proxy headers from the
+ proxy configuration dictionary.
+ """
+
+ def __init__(self, proxies=None, proxies_settings=None):
+ if proxies is None:
+ proxies = {}
+ if proxies_settings is None:
+ proxies_settings = {}
+
+ self._proxies = proxies
+ self._proxies_settings = proxies_settings
+
+ def proxy_url_for(self, url):
+ """Retrieves the corresponding proxy url for a given url."""
+ parsed_url = urlparse(url)
+ proxy = self._proxies.get(parsed_url.scheme)
+ if proxy:
+ proxy = self._fix_proxy_url(proxy)
+ return proxy
+
+ def proxy_headers_for(self, proxy_url):
+ """Retrieves the corresponding proxy headers for a given proxy url."""
+ headers = {}
+ username, password = self._get_auth_from_url(proxy_url)
+ if username and password:
+ basic_auth = self._construct_basic_auth(username, password)
+ headers['Proxy-Authorization'] = basic_auth
+ return headers
+
+ @property
+ def settings(self):
+ return self._proxies_settings
+
+ def _fix_proxy_url(self, proxy_url):
+ if proxy_url.startswith('http:') or proxy_url.startswith('https:'):
+ return proxy_url
+ elif proxy_url.startswith('//'):
+ return 'http:' + proxy_url
+ else:
+ return 'http://' + proxy_url
+
+ def _construct_basic_auth(self, username, password):
+ auth_str = f'{username}:{password}'
+ encoded_str = b64encode(auth_str.encode('ascii')).strip().decode()
+ return f'Basic {encoded_str}'
+
+ def _get_auth_from_url(self, url):
+ parsed_url = urlparse(url)
+ try:
+ return unquote(parsed_url.username), unquote(parsed_url.password)
+ except (AttributeError, TypeError):
+ return None, None
+
+
+class URLLib3Session:
+ """A basic HTTP client that supports connection pooling and proxies.
+
+ This class is inspired by requests.adapters.HTTPAdapter, but has been
+ boiled down to meet the use cases needed by botocore. For the most part
+ this classes matches the functionality of HTTPAdapter in requests v2.7.0
+ (the same as our vendored version). The only major difference of note is
+ that we currently do not support sending chunked requests. While requests
+ v2.7.0 implemented this themselves, later version urllib3 support this
+ directly via a flag to urlopen so enabling it if needed should be trivial.
+ """
+
+ def __init__(
+ self,
+ verify=True,
+ proxies=None,
+ timeout=None,
+ max_pool_connections=MAX_POOL_CONNECTIONS,
+ socket_options=None,
+ client_cert=None,
+ proxies_config=None,
+ ):
+ self._verify = verify
+ self._proxy_config = ProxyConfiguration(
+ proxies=proxies, proxies_settings=proxies_config
+ )
+ self._pool_classes_by_scheme = {
+ 'http': botocore.awsrequest.AWSHTTPConnectionPool,
+ 'https': botocore.awsrequest.AWSHTTPSConnectionPool,
+ }
+ if timeout is None:
+ timeout = DEFAULT_TIMEOUT
+ if not isinstance(timeout, (int, float)):
+ timeout = Timeout(connect=timeout[0], read=timeout[1])
+
+ self._cert_file = None
+ self._key_file = None
+ if isinstance(client_cert, str):
+ self._cert_file = client_cert
+ elif isinstance(client_cert, tuple):
+ self._cert_file, self._key_file = client_cert
+
+ self._timeout = timeout
+ self._max_pool_connections = max_pool_connections
+ self._socket_options = socket_options
+ if socket_options is None:
+ self._socket_options = []
+ self._proxy_managers = {}
+ self._manager = PoolManager(**self._get_pool_manager_kwargs())
+ self._manager.pool_classes_by_scheme = self._pool_classes_by_scheme
+
+ def _proxies_kwargs(self, **kwargs):
+ proxies_settings = self._proxy_config.settings
+ proxies_kwargs = {
+ 'use_forwarding_for_https': proxies_settings.get(
+ 'proxy_use_forwarding_for_https'
+ ),
+ **kwargs,
+ }
+ return {k: v for k, v in proxies_kwargs.items() if v is not None}
+
+ def _get_pool_manager_kwargs(self, **extra_kwargs):
+ pool_manager_kwargs = {
+ 'timeout': self._timeout,
+ 'maxsize': self._max_pool_connections,
+ 'ssl_context': self._get_ssl_context(),
+ 'socket_options': self._socket_options,
+ 'cert_file': self._cert_file,
+ 'key_file': self._key_file,
+ }
+ pool_manager_kwargs.update(**extra_kwargs)
+ return pool_manager_kwargs
+
+ def _get_ssl_context(self):
+ return create_urllib3_context()
+
+ def _get_proxy_manager(self, proxy_url):
+ if proxy_url not in self._proxy_managers:
+ proxy_headers = self._proxy_config.proxy_headers_for(proxy_url)
+ proxy_ssl_context = self._setup_proxy_ssl_context(proxy_url)
+ proxy_manager_kwargs = self._get_pool_manager_kwargs(
+ proxy_headers=proxy_headers
+ )
+ proxy_manager_kwargs.update(
+ self._proxies_kwargs(proxy_ssl_context=proxy_ssl_context)
+ )
+ proxy_manager = proxy_from_url(proxy_url, **proxy_manager_kwargs)
+ proxy_manager.pool_classes_by_scheme = self._pool_classes_by_scheme
+ self._proxy_managers[proxy_url] = proxy_manager
+
+ return self._proxy_managers[proxy_url]
+
+ def _path_url(self, url):
+ parsed_url = urlparse(url)
+ path = parsed_url.path
+ if not path:
+ path = '/'
+ if parsed_url.query:
+ path = path + '?' + parsed_url.query
+ return path
+
+ def _setup_ssl_cert(self, conn, url, verify):
+ if url.lower().startswith('https') and verify:
+ conn.cert_reqs = 'CERT_REQUIRED'
+ conn.ca_certs = get_cert_path(verify)
+ else:
+ conn.cert_reqs = 'CERT_NONE'
+ conn.ca_certs = None
+
+ def _setup_proxy_ssl_context(self, proxy_url):
+ proxies_settings = self._proxy_config.settings
+ proxy_ca_bundle = proxies_settings.get('proxy_ca_bundle')
+ proxy_cert = proxies_settings.get('proxy_client_cert')
+ if proxy_ca_bundle is None and proxy_cert is None:
+ return None
+
+ context = self._get_ssl_context()
+ try:
+ url = parse_url(proxy_url)
+ # urllib3 disables this by default but we need it for proper
+ # proxy tls negotiation when proxy_url is not an IP Address
+ if not _is_ipaddress(url.host):
+ context.check_hostname = True
+ if proxy_ca_bundle is not None:
+ context.load_verify_locations(cafile=proxy_ca_bundle)
+
+ if isinstance(proxy_cert, tuple):
+ context.load_cert_chain(proxy_cert[0], keyfile=proxy_cert[1])
+ elif isinstance(proxy_cert, str):
+ context.load_cert_chain(proxy_cert)
+
+ return context
+ except (OSError, URLLib3SSLError, LocationParseError) as e:
+ raise InvalidProxiesConfigError(error=e)
+
+ def _get_connection_manager(self, url, proxy_url=None):
+ if proxy_url:
+ manager = self._get_proxy_manager(proxy_url)
+ else:
+ manager = self._manager
+ return manager
+
+ def _get_request_target(self, url, proxy_url):
+ has_proxy = proxy_url is not None
+
+ if not has_proxy:
+ return self._path_url(url)
+
+ # HTTP proxies expect the request_target to be the absolute url to know
+ # which host to establish a connection to. urllib3 also supports
+ # forwarding for HTTPS through the 'use_forwarding_for_https' parameter.
+ proxy_scheme = urlparse(proxy_url).scheme
+ using_https_forwarding_proxy = (
+ proxy_scheme == 'https'
+ and self._proxies_kwargs().get('use_forwarding_for_https', False)
+ )
+
+ if using_https_forwarding_proxy or url.startswith('http:'):
+ return url
+ else:
+ return self._path_url(url)
+
+ def _chunked(self, headers):
+ transfer_encoding = headers.get('Transfer-Encoding', b'')
+ transfer_encoding = ensure_bytes(transfer_encoding)
+ return transfer_encoding.lower() == b'chunked'
+
+ def close(self):
+ self._manager.clear()
+ for manager in self._proxy_managers.values():
+ manager.clear()
+
+ def send(self, request):
+ try:
+ proxy_url = self._proxy_config.proxy_url_for(request.url)
+ manager = self._get_connection_manager(request.url, proxy_url)
+ conn = manager.connection_from_url(request.url)
+ self._setup_ssl_cert(conn, request.url, self._verify)
+ if ensure_boolean(
+ os.environ.get('BOTO_EXPERIMENTAL__ADD_PROXY_HOST_HEADER', '')
+ ):
+ # This is currently an "experimental" feature which provides
+ # no guarantees of backwards compatibility. It may be subject
+ # to change or removal in any patch version. Anyone opting in
+ # to this feature should strictly pin botocore.
+ host = urlparse(request.url).hostname
+ conn.proxy_headers['host'] = host
+
+ request_target = self._get_request_target(request.url, proxy_url)
+ urllib_response = conn.urlopen(
+ method=request.method,
+ url=request_target,
+ body=request.body,
+ headers=request.headers,
+ retries=Retry(False),
+ assert_same_host=False,
+ preload_content=False,
+ decode_content=False,
+ chunked=self._chunked(request.headers),
+ )
+
+ http_response = botocore.awsrequest.AWSResponse(
+ request.url,
+ urllib_response.status,
+ urllib_response.headers,
+ urllib_response,
+ )
+
+ if not request.stream_output:
+ # Cause the raw stream to be exhausted immediately. We do it
+ # this way instead of using preload_content because
+ # preload_content will never buffer chunked responses
+ http_response.content
+
+ return http_response
+ except URLLib3SSLError as e:
+ raise SSLError(endpoint_url=request.url, error=e)
+ except (NewConnectionError, socket.gaierror) as e:
+ raise EndpointConnectionError(endpoint_url=request.url, error=e)
+ except ProxyError as e:
+ raise ProxyConnectionError(
+ proxy_url=mask_proxy_url(proxy_url), error=e
+ )
+ except URLLib3ConnectTimeoutError as e:
+ raise ConnectTimeoutError(endpoint_url=request.url, error=e)
+ except URLLib3ReadTimeoutError as e:
+ raise ReadTimeoutError(endpoint_url=request.url, error=e)
+ except ProtocolError as e:
+ raise ConnectionClosedError(
+ error=e, request=request, endpoint_url=request.url
+ )
+ except Exception as e:
+ message = 'Exception received when sending urllib3 HTTP request'
+ logger.debug(message, exc_info=True)
+ raise HTTPClientError(error=e)
diff --git a/.venv/lib/python3.12/site-packages/botocore/loaders.py b/.venv/lib/python3.12/site-packages/botocore/loaders.py
new file mode 100644
index 00000000..f5072a3e
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/loaders.py
@@ -0,0 +1,525 @@
+# Copyright 2012-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+"""Module for loading various model files.
+
+This module provides the classes that are used to load models used
+by botocore. This can include:
+
+ * Service models (e.g. the model for EC2, S3, DynamoDB, etc.)
+ * Service model extras which customize the service models
+ * Other models associated with a service (pagination, waiters)
+ * Non service-specific config (Endpoint data, retry config)
+
+Loading a module is broken down into several steps:
+
+ * Determining the path to load
+ * Search the data_path for files to load
+ * The mechanics of loading the file
+ * Searching for extras and applying them to the loaded file
+
+The last item is used so that other faster loading mechanism
+besides the default JSON loader can be used.
+
+The Search Path
+===============
+
+Similar to how the PATH environment variable is to finding executables
+and the PYTHONPATH environment variable is to finding python modules
+to import, the botocore loaders have the concept of a data path exposed
+through AWS_DATA_PATH.
+
+This enables end users to provide additional search paths where we
+will attempt to load models outside of the models we ship with
+botocore. When you create a ``Loader``, there are two paths
+automatically added to the model search path:
+
+ * <botocore root>/data/
+ * ~/.aws/models
+
+The first value is the path where all the model files shipped with
+botocore are located.
+
+The second path is so that users can just drop new model files in
+``~/.aws/models`` without having to mess around with the AWS_DATA_PATH.
+
+The AWS_DATA_PATH using the platform specific path separator to
+separate entries (typically ``:`` on linux and ``;`` on windows).
+
+
+Directory Layout
+================
+
+The Loader expects a particular directory layout. In order for any
+directory specified in AWS_DATA_PATH to be considered, it must have
+this structure for service models::
+
+ <root>
+ |
+ |-- servicename1
+ | |-- 2012-10-25
+ | |-- service-2.json
+ |-- ec2
+ | |-- 2014-01-01
+ | | |-- paginators-1.json
+ | | |-- service-2.json
+ | | |-- waiters-2.json
+ | |-- 2015-03-01
+ | |-- paginators-1.json
+ | |-- service-2.json
+ | |-- waiters-2.json
+ | |-- service-2.sdk-extras.json
+
+
+That is:
+
+ * The root directory contains sub directories that are the name
+ of the services.
+ * Within each service directory, there's a sub directory for each
+ available API version.
+ * Within each API version, there are model specific files, including
+ (but not limited to): service-2.json, waiters-2.json, paginators-1.json
+
+The ``-1`` and ``-2`` suffix at the end of the model files denote which version
+schema is used within the model. Even though this information is available in
+the ``version`` key within the model, this version is also part of the filename
+so that code does not need to load the JSON model in order to determine which
+version to use.
+
+The ``sdk-extras`` and similar files represent extra data that needs to be
+applied to the model after it is loaded. Data in these files might represent
+information that doesn't quite fit in the original models, but is still needed
+for the sdk. For instance, additional operation parameters might be added here
+which don't represent the actual service api.
+"""
+
+import logging
+import os
+
+from botocore import BOTOCORE_ROOT
+from botocore.compat import HAS_GZIP, OrderedDict, json
+from botocore.exceptions import DataNotFoundError, UnknownServiceError
+from botocore.utils import deep_merge
+
+_JSON_OPEN_METHODS = {
+ '.json': open,
+}
+
+
+if HAS_GZIP:
+ from gzip import open as gzip_open
+
+ _JSON_OPEN_METHODS['.json.gz'] = gzip_open
+
+
+logger = logging.getLogger(__name__)
+
+
+def instance_cache(func):
+ """Cache the result of a method on a per instance basis.
+
+ This is not a general purpose caching decorator. In order
+ for this to be used, it must be used on methods on an
+ instance, and that instance *must* provide a
+ ``self._cache`` dictionary.
+
+ """
+
+ def _wrapper(self, *args, **kwargs):
+ key = (func.__name__,) + args
+ for pair in sorted(kwargs.items()):
+ key += pair
+ if key in self._cache:
+ return self._cache[key]
+ data = func(self, *args, **kwargs)
+ self._cache[key] = data
+ return data
+
+ return _wrapper
+
+
+class JSONFileLoader:
+ """Loader JSON files.
+
+ This class can load the default format of models, which is a JSON file.
+
+ """
+
+ def exists(self, file_path):
+ """Checks if the file exists.
+
+ :type file_path: str
+ :param file_path: The full path to the file to load without
+ the '.json' extension.
+
+ :return: True if file path exists, False otherwise.
+
+ """
+ for ext in _JSON_OPEN_METHODS:
+ if os.path.isfile(file_path + ext):
+ return True
+ return False
+
+ def _load_file(self, full_path, open_method):
+ if not os.path.isfile(full_path):
+ return
+
+ # By default the file will be opened with locale encoding on Python 3.
+ # We specify "utf8" here to ensure the correct behavior.
+ with open_method(full_path, 'rb') as fp:
+ payload = fp.read().decode('utf-8')
+
+ logger.debug("Loading JSON file: %s", full_path)
+ return json.loads(payload, object_pairs_hook=OrderedDict)
+
+ def load_file(self, file_path):
+ """Attempt to load the file path.
+
+ :type file_path: str
+ :param file_path: The full path to the file to load without
+ the '.json' extension.
+
+ :return: The loaded data if it exists, otherwise None.
+
+ """
+ for ext, open_method in _JSON_OPEN_METHODS.items():
+ data = self._load_file(file_path + ext, open_method)
+ if data is not None:
+ return data
+ return None
+
+
+def create_loader(search_path_string=None):
+ """Create a Loader class.
+
+ This factory function creates a loader given a search string path.
+
+ :type search_string_path: str
+ :param search_string_path: The AWS_DATA_PATH value. A string
+ of data path values separated by the ``os.path.pathsep`` value,
+ which is typically ``:`` on POSIX platforms and ``;`` on
+ windows.
+
+ :return: A ``Loader`` instance.
+
+ """
+ if search_path_string is None:
+ return Loader()
+ paths = []
+ extra_paths = search_path_string.split(os.pathsep)
+ for path in extra_paths:
+ path = os.path.expanduser(os.path.expandvars(path))
+ paths.append(path)
+ return Loader(extra_search_paths=paths)
+
+
+class Loader:
+ """Find and load data models.
+
+ This class will handle searching for and loading data models.
+
+ The main method used here is ``load_service_model``, which is a
+ convenience method over ``load_data`` and ``determine_latest_version``.
+
+ """
+
+ FILE_LOADER_CLASS = JSONFileLoader
+ # The included models in botocore/data/ that we ship with botocore.
+ BUILTIN_DATA_PATH = os.path.join(BOTOCORE_ROOT, 'data')
+ # For convenience we automatically add ~/.aws/models to the data path.
+ CUSTOMER_DATA_PATH = os.path.join(
+ os.path.expanduser('~'), '.aws', 'models'
+ )
+ BUILTIN_EXTRAS_TYPES = ['sdk']
+
+ def __init__(
+ self,
+ extra_search_paths=None,
+ file_loader=None,
+ cache=None,
+ include_default_search_paths=True,
+ include_default_extras=True,
+ ):
+ self._cache = {}
+ if file_loader is None:
+ file_loader = self.FILE_LOADER_CLASS()
+ self.file_loader = file_loader
+ if extra_search_paths is not None:
+ self._search_paths = extra_search_paths
+ else:
+ self._search_paths = []
+ if include_default_search_paths:
+ self._search_paths.extend(
+ [self.CUSTOMER_DATA_PATH, self.BUILTIN_DATA_PATH]
+ )
+
+ self._extras_types = []
+ if include_default_extras:
+ self._extras_types.extend(self.BUILTIN_EXTRAS_TYPES)
+
+ self._extras_processor = ExtrasProcessor()
+
+ @property
+ def search_paths(self):
+ return self._search_paths
+
+ @property
+ def extras_types(self):
+ return self._extras_types
+
+ @instance_cache
+ def list_available_services(self, type_name):
+ """List all known services.
+
+ This will traverse the search path and look for all known
+ services.
+
+ :type type_name: str
+ :param type_name: The type of the service (service-2,
+ paginators-1, waiters-2, etc). This is needed because
+ the list of available services depends on the service
+ type. For example, the latest API version available for
+ a resource-1.json file may not be the latest API version
+ available for a services-2.json file.
+
+ :return: A list of all services. The list of services will
+ be sorted.
+
+ """
+ services = set()
+ for possible_path in self._potential_locations():
+ # Any directory in the search path is potentially a service.
+ # We'll collect any initial list of potential services,
+ # but we'll then need to further process these directories
+ # by searching for the corresponding type_name in each
+ # potential directory.
+ possible_services = [
+ d
+ for d in os.listdir(possible_path)
+ if os.path.isdir(os.path.join(possible_path, d))
+ ]
+ for service_name in possible_services:
+ full_dirname = os.path.join(possible_path, service_name)
+ api_versions = os.listdir(full_dirname)
+ for api_version in api_versions:
+ full_load_path = os.path.join(
+ full_dirname, api_version, type_name
+ )
+ if self.file_loader.exists(full_load_path):
+ services.add(service_name)
+ break
+ return sorted(services)
+
+ @instance_cache
+ def determine_latest_version(self, service_name, type_name):
+ """Find the latest API version available for a service.
+
+ :type service_name: str
+ :param service_name: The name of the service.
+
+ :type type_name: str
+ :param type_name: The type of the service (service-2,
+ paginators-1, waiters-2, etc). This is needed because
+ the latest API version available can depend on the service
+ type. For example, the latest API version available for
+ a resource-1.json file may not be the latest API version
+ available for a services-2.json file.
+
+ :rtype: str
+ :return: The latest API version. If the service does not exist
+ or does not have any available API data, then a
+ ``DataNotFoundError`` exception will be raised.
+
+ """
+ return max(self.list_api_versions(service_name, type_name))
+
+ @instance_cache
+ def list_api_versions(self, service_name, type_name):
+ """List all API versions available for a particular service type
+
+ :type service_name: str
+ :param service_name: The name of the service
+
+ :type type_name: str
+ :param type_name: The type name for the service (i.e service-2,
+ paginators-1, etc.)
+
+ :rtype: list
+ :return: A list of API version strings in sorted order.
+
+ """
+ known_api_versions = set()
+ for possible_path in self._potential_locations(
+ service_name, must_exist=True, is_dir=True
+ ):
+ for dirname in os.listdir(possible_path):
+ full_path = os.path.join(possible_path, dirname, type_name)
+ # Only add to the known_api_versions if the directory
+ # contains a service-2, paginators-1, etc. file corresponding
+ # to the type_name passed in.
+ if self.file_loader.exists(full_path):
+ known_api_versions.add(dirname)
+ if not known_api_versions:
+ raise DataNotFoundError(data_path=service_name)
+ return sorted(known_api_versions)
+
+ @instance_cache
+ def load_service_model(self, service_name, type_name, api_version=None):
+ """Load a botocore service model
+
+ This is the main method for loading botocore models (e.g. a service
+ model, pagination configs, waiter configs, etc.).
+
+ :type service_name: str
+ :param service_name: The name of the service (e.g ``ec2``, ``s3``).
+
+ :type type_name: str
+ :param type_name: The model type. Valid types include, but are not
+ limited to: ``service-2``, ``paginators-1``, ``waiters-2``.
+
+ :type api_version: str
+ :param api_version: The API version to load. If this is not
+ provided, then the latest API version will be used.
+
+ :type load_extras: bool
+ :param load_extras: Whether or not to load the tool extras which
+ contain additional data to be added to the model.
+
+ :raises: UnknownServiceError if there is no known service with
+ the provided service_name.
+
+ :raises: DataNotFoundError if no data could be found for the
+ service_name/type_name/api_version.
+
+ :return: The loaded data, as a python type (e.g. dict, list, etc).
+ """
+ # Wrapper around the load_data. This will calculate the path
+ # to call load_data with.
+ known_services = self.list_available_services(type_name)
+ if service_name not in known_services:
+ raise UnknownServiceError(
+ service_name=service_name,
+ known_service_names=', '.join(sorted(known_services)),
+ )
+ if api_version is None:
+ api_version = self.determine_latest_version(
+ service_name, type_name
+ )
+ full_path = os.path.join(service_name, api_version, type_name)
+ model = self.load_data(full_path)
+
+ # Load in all the extras
+ extras_data = self._find_extras(service_name, type_name, api_version)
+ self._extras_processor.process(model, extras_data)
+
+ return model
+
+ def _find_extras(self, service_name, type_name, api_version):
+ """Creates an iterator over all the extras data."""
+ for extras_type in self.extras_types:
+ extras_name = f'{type_name}.{extras_type}-extras'
+ full_path = os.path.join(service_name, api_version, extras_name)
+
+ try:
+ yield self.load_data(full_path)
+ except DataNotFoundError:
+ pass
+
+ @instance_cache
+ def load_data_with_path(self, name):
+ """Same as ``load_data`` but returns file path as second return value.
+
+ :type name: str
+ :param name: The data path, i.e ``ec2/2015-03-01/service-2``.
+
+ :return: Tuple of the loaded data and the path to the data file
+ where the data was loaded from. If no data could be found then a
+ DataNotFoundError is raised.
+ """
+ for possible_path in self._potential_locations(name):
+ found = self.file_loader.load_file(possible_path)
+ if found is not None:
+ return found, possible_path
+
+ # We didn't find anything that matched on any path.
+ raise DataNotFoundError(data_path=name)
+
+ def load_data(self, name):
+ """Load data given a data path.
+
+ This is a low level method that will search through the various
+ search paths until it's able to load a value. This is typically
+ only needed to load *non* model files (such as _endpoints and
+ _retry). If you need to load model files, you should prefer
+ ``load_service_model``. Use ``load_data_with_path`` to get the
+ data path of the data file as second return value.
+
+ :type name: str
+ :param name: The data path, i.e ``ec2/2015-03-01/service-2``.
+
+ :return: The loaded data. If no data could be found then
+ a DataNotFoundError is raised.
+ """
+ data, _ = self.load_data_with_path(name)
+ return data
+
+ def _potential_locations(self, name=None, must_exist=False, is_dir=False):
+ # Will give an iterator over the full path of potential locations
+ # according to the search path.
+ for path in self.search_paths:
+ if os.path.isdir(path):
+ full_path = path
+ if name is not None:
+ full_path = os.path.join(path, name)
+ if not must_exist:
+ yield full_path
+ else:
+ if is_dir and os.path.isdir(full_path):
+ yield full_path
+ elif os.path.exists(full_path):
+ yield full_path
+
+ def is_builtin_path(self, path):
+ """Whether a given path is within the package's data directory.
+
+ This method can be used together with load_data_with_path(name)
+ to determine if data has been loaded from a file bundled with the
+ package, as opposed to a file in a separate location.
+
+ :type path: str
+ :param path: The file path to check.
+
+ :return: Whether the given path is within the package's data directory.
+ """
+ path = os.path.expanduser(os.path.expandvars(path))
+ return path.startswith(self.BUILTIN_DATA_PATH)
+
+
+class ExtrasProcessor:
+ """Processes data from extras files into service models."""
+
+ def process(self, original_model, extra_models):
+ """Processes data from a list of loaded extras files into a model
+
+ :type original_model: dict
+ :param original_model: The service model to load all the extras into.
+
+ :type extra_models: iterable of dict
+ :param extra_models: A list of loaded extras models.
+ """
+ for extras in extra_models:
+ self._process(original_model, extras)
+
+ def _process(self, model, extra_model):
+ """Process a single extras model into a service model."""
+ if 'merge' in extra_model:
+ deep_merge(model, extra_model['merge'])
diff --git a/.venv/lib/python3.12/site-packages/botocore/model.py b/.venv/lib/python3.12/site-packages/botocore/model.py
new file mode 100644
index 00000000..263aa548
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/model.py
@@ -0,0 +1,982 @@
+# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+"""Abstractions to interact with service models."""
+
+from collections import defaultdict
+from typing import NamedTuple, Union
+
+from botocore.auth import resolve_auth_type
+from botocore.compat import OrderedDict
+from botocore.exceptions import (
+ MissingServiceIdError,
+ UndefinedModelAttributeError,
+)
+from botocore.utils import CachedProperty, hyphenize_service_id, instance_cache
+
+NOT_SET = object()
+
+
+class NoShapeFoundError(Exception):
+ pass
+
+
+class InvalidShapeError(Exception):
+ pass
+
+
+class OperationNotFoundError(Exception):
+ pass
+
+
+class InvalidShapeReferenceError(Exception):
+ pass
+
+
+class ServiceId(str):
+ def hyphenize(self):
+ return hyphenize_service_id(self)
+
+
+class Shape:
+ """Object representing a shape from the service model."""
+
+ # To simplify serialization logic, all shape params that are
+ # related to serialization are moved from the top level hash into
+ # a 'serialization' hash. This list below contains the names of all
+ # the attributes that should be moved.
+ SERIALIZED_ATTRS = [
+ 'locationName',
+ 'queryName',
+ 'flattened',
+ 'location',
+ 'payload',
+ 'streaming',
+ 'timestampFormat',
+ 'xmlNamespace',
+ 'resultWrapper',
+ 'xmlAttribute',
+ 'eventstream',
+ 'event',
+ 'eventheader',
+ 'eventpayload',
+ 'jsonvalue',
+ 'timestampFormat',
+ 'hostLabel',
+ ]
+ METADATA_ATTRS = [
+ 'required',
+ 'min',
+ 'max',
+ 'pattern',
+ 'sensitive',
+ 'enum',
+ 'idempotencyToken',
+ 'error',
+ 'exception',
+ 'endpointdiscoveryid',
+ 'retryable',
+ 'document',
+ 'union',
+ 'contextParam',
+ 'clientContextParams',
+ 'requiresLength',
+ ]
+ MAP_TYPE = OrderedDict
+
+ def __init__(self, shape_name, shape_model, shape_resolver=None):
+ """
+
+ :type shape_name: string
+ :param shape_name: The name of the shape.
+
+ :type shape_model: dict
+ :param shape_model: The shape model. This would be the value
+ associated with the key in the "shapes" dict of the
+ service model (i.e ``model['shapes'][shape_name]``)
+
+ :type shape_resolver: botocore.model.ShapeResolver
+ :param shape_resolver: A shape resolver object. This is used to
+ resolve references to other shapes. For scalar shape types
+ (string, integer, boolean, etc.), this argument is not
+ required. If a shape_resolver is not provided for a complex
+ type, then a ``ValueError`` will be raised when an attempt
+ to resolve a shape is made.
+
+ """
+ self.name = shape_name
+ self.type_name = shape_model['type']
+ self.documentation = shape_model.get('documentation', '')
+ self._shape_model = shape_model
+ if shape_resolver is None:
+ # If a shape_resolver is not provided, we create an object
+ # that will throw errors if you attempt to resolve
+ # a shape. This is actually ok for scalar shapes
+ # because they don't need to resolve shapes and shouldn't
+ # be required to provide an object they won't use.
+ shape_resolver = UnresolvableShapeMap()
+ self._shape_resolver = shape_resolver
+ self._cache = {}
+
+ @CachedProperty
+ def serialization(self):
+ """Serialization information about the shape.
+
+ This contains information that may be needed for input serialization
+ or response parsing. This can include:
+
+ * name
+ * queryName
+ * flattened
+ * location
+ * payload
+ * streaming
+ * xmlNamespace
+ * resultWrapper
+ * xmlAttribute
+ * jsonvalue
+ * timestampFormat
+
+ :rtype: dict
+ :return: Serialization information about the shape.
+
+ """
+ model = self._shape_model
+ serialization = {}
+ for attr in self.SERIALIZED_ATTRS:
+ if attr in self._shape_model:
+ serialization[attr] = model[attr]
+ # For consistency, locationName is renamed to just 'name'.
+ if 'locationName' in serialization:
+ serialization['name'] = serialization.pop('locationName')
+ return serialization
+
+ @CachedProperty
+ def metadata(self):
+ """Metadata about the shape.
+
+ This requires optional information about the shape, including:
+
+ * min
+ * max
+ * pattern
+ * enum
+ * sensitive
+ * required
+ * idempotencyToken
+ * document
+ * union
+ * contextParam
+ * clientContextParams
+ * requiresLength
+
+ :rtype: dict
+ :return: Metadata about the shape.
+
+ """
+ model = self._shape_model
+ metadata = {}
+ for attr in self.METADATA_ATTRS:
+ if attr in self._shape_model:
+ metadata[attr] = model[attr]
+ return metadata
+
+ @CachedProperty
+ def required_members(self):
+ """A list of members that are required.
+
+ A structure shape can define members that are required.
+ This value will return a list of required members. If there
+ are no required members an empty list is returned.
+
+ """
+ return self.metadata.get('required', [])
+
+ def _resolve_shape_ref(self, shape_ref):
+ return self._shape_resolver.resolve_shape_ref(shape_ref)
+
+ def __repr__(self):
+ return f"<{self.__class__.__name__}({self.name})>"
+
+ @property
+ def event_stream_name(self):
+ return None
+
+
+class StructureShape(Shape):
+ @CachedProperty
+ def members(self):
+ members = self._shape_model.get('members', self.MAP_TYPE())
+ # The members dict looks like:
+ # 'members': {
+ # 'MemberName': {'shape': 'shapeName'},
+ # 'MemberName2': {'shape': 'shapeName'},
+ # }
+ # We return a dict of member name to Shape object.
+ shape_members = self.MAP_TYPE()
+ for name, shape_ref in members.items():
+ shape_members[name] = self._resolve_shape_ref(shape_ref)
+ return shape_members
+
+ @CachedProperty
+ def event_stream_name(self):
+ for member_name, member in self.members.items():
+ if member.serialization.get('eventstream'):
+ return member_name
+ return None
+
+ @CachedProperty
+ def error_code(self):
+ if not self.metadata.get('exception', False):
+ return None
+ error_metadata = self.metadata.get("error", {})
+ code = error_metadata.get("code")
+ if code:
+ return code
+ # Use the exception name if there is no explicit code modeled
+ return self.name
+
+ @CachedProperty
+ def is_document_type(self):
+ return self.metadata.get('document', False)
+
+ @CachedProperty
+ def is_tagged_union(self):
+ return self.metadata.get('union', False)
+
+
+class ListShape(Shape):
+ @CachedProperty
+ def member(self):
+ return self._resolve_shape_ref(self._shape_model['member'])
+
+
+class MapShape(Shape):
+ @CachedProperty
+ def key(self):
+ return self._resolve_shape_ref(self._shape_model['key'])
+
+ @CachedProperty
+ def value(self):
+ return self._resolve_shape_ref(self._shape_model['value'])
+
+
+class StringShape(Shape):
+ @CachedProperty
+ def enum(self):
+ return self.metadata.get('enum', [])
+
+
+class StaticContextParameter(NamedTuple):
+ name: str
+ value: Union[bool, str]
+
+
+class ContextParameter(NamedTuple):
+ name: str
+ member_name: str
+
+
+class ClientContextParameter(NamedTuple):
+ name: str
+ type: str
+ documentation: str
+
+
+class ServiceModel:
+ """
+
+ :ivar service_description: The parsed service description dictionary.
+
+ """
+
+ def __init__(self, service_description, service_name=None):
+ """
+
+ :type service_description: dict
+ :param service_description: The service description model. This value
+ is obtained from a botocore.loader.Loader, or from directly loading
+ the file yourself::
+
+ service_description = json.load(
+ open('/path/to/service-description-model.json'))
+ model = ServiceModel(service_description)
+
+ :type service_name: str
+ :param service_name: The name of the service. Normally this is
+ the endpoint prefix defined in the service_description. However,
+ you can override this value to provide a more convenient name.
+ This is done in a few places in botocore (ses instead of email,
+ emr instead of elasticmapreduce). If this value is not provided,
+ it will default to the endpointPrefix defined in the model.
+
+ """
+ self._service_description = service_description
+ # We want clients to be able to access metadata directly.
+ self.metadata = service_description.get('metadata', {})
+ self._shape_resolver = ShapeResolver(
+ service_description.get('shapes', {})
+ )
+ self._signature_version = NOT_SET
+ self._service_name = service_name
+ self._instance_cache = {}
+
+ def shape_for(self, shape_name, member_traits=None):
+ return self._shape_resolver.get_shape_by_name(
+ shape_name, member_traits
+ )
+
+ def shape_for_error_code(self, error_code):
+ return self._error_code_cache.get(error_code, None)
+
+ @CachedProperty
+ def _error_code_cache(self):
+ error_code_cache = {}
+ for error_shape in self.error_shapes:
+ code = error_shape.error_code
+ error_code_cache[code] = error_shape
+ return error_code_cache
+
+ def resolve_shape_ref(self, shape_ref):
+ return self._shape_resolver.resolve_shape_ref(shape_ref)
+
+ @CachedProperty
+ def shape_names(self):
+ return list(self._service_description.get('shapes', {}))
+
+ @CachedProperty
+ def error_shapes(self):
+ error_shapes = []
+ for shape_name in self.shape_names:
+ error_shape = self.shape_for(shape_name)
+ if error_shape.metadata.get('exception', False):
+ error_shapes.append(error_shape)
+ return error_shapes
+
+ @instance_cache
+ def operation_model(self, operation_name):
+ try:
+ model = self._service_description['operations'][operation_name]
+ except KeyError:
+ raise OperationNotFoundError(operation_name)
+ return OperationModel(model, self, operation_name)
+
+ @CachedProperty
+ def documentation(self):
+ return self._service_description.get('documentation', '')
+
+ @CachedProperty
+ def operation_names(self):
+ return list(self._service_description.get('operations', []))
+
+ @CachedProperty
+ def service_name(self):
+ """The name of the service.
+
+ This defaults to the endpointPrefix defined in the service model.
+ However, this value can be overriden when a ``ServiceModel`` is
+ created. If a service_name was not provided when the ``ServiceModel``
+ was created and if there is no endpointPrefix defined in the
+ service model, then an ``UndefinedModelAttributeError`` exception
+ will be raised.
+
+ """
+ if self._service_name is not None:
+ return self._service_name
+ else:
+ return self.endpoint_prefix
+
+ @CachedProperty
+ def service_id(self):
+ try:
+ return ServiceId(self._get_metadata_property('serviceId'))
+ except UndefinedModelAttributeError:
+ raise MissingServiceIdError(service_name=self._service_name)
+
+ @CachedProperty
+ def signing_name(self):
+ """The name to use when computing signatures.
+
+ If the model does not define a signing name, this
+ value will be the endpoint prefix defined in the model.
+ """
+ signing_name = self.metadata.get('signingName')
+ if signing_name is None:
+ signing_name = self.endpoint_prefix
+ return signing_name
+
+ @CachedProperty
+ def api_version(self):
+ return self._get_metadata_property('apiVersion')
+
+ @CachedProperty
+ def protocol(self):
+ return self._get_metadata_property('protocol')
+
+ @CachedProperty
+ def protocols(self):
+ return self._get_metadata_property('protocols')
+
+ @CachedProperty
+ def endpoint_prefix(self):
+ return self._get_metadata_property('endpointPrefix')
+
+ @CachedProperty
+ def endpoint_discovery_operation(self):
+ for operation in self.operation_names:
+ model = self.operation_model(operation)
+ if model.is_endpoint_discovery_operation:
+ return model
+
+ @CachedProperty
+ def endpoint_discovery_required(self):
+ for operation in self.operation_names:
+ model = self.operation_model(operation)
+ if (
+ model.endpoint_discovery is not None
+ and model.endpoint_discovery.get('required')
+ ):
+ return True
+ return False
+
+ @CachedProperty
+ def client_context_parameters(self):
+ params = self._service_description.get('clientContextParams', {})
+ return [
+ ClientContextParameter(
+ name=param_name,
+ type=param_val['type'],
+ documentation=param_val['documentation'],
+ )
+ for param_name, param_val in params.items()
+ ]
+
+ def _get_metadata_property(self, name):
+ try:
+ return self.metadata[name]
+ except KeyError:
+ raise UndefinedModelAttributeError(
+ f'"{name}" not defined in the metadata of the model: {self}'
+ )
+
+ # Signature version is one of the rare properties
+ # that can be modified so a CachedProperty is not used here.
+
+ @property
+ def signature_version(self):
+ if self._signature_version is NOT_SET:
+ signature_version = self.metadata.get('signatureVersion')
+ self._signature_version = signature_version
+ return self._signature_version
+
+ @signature_version.setter
+ def signature_version(self, value):
+ self._signature_version = value
+
+ @CachedProperty
+ def is_query_compatible(self):
+ return 'awsQueryCompatible' in self.metadata
+
+ def __repr__(self):
+ return f'{self.__class__.__name__}({self.service_name})'
+
+
+class OperationModel:
+ def __init__(self, operation_model, service_model, name=None):
+ """
+
+ :type operation_model: dict
+ :param operation_model: The operation model. This comes from the
+ service model, and is the value associated with the operation
+ name in the service model (i.e ``model['operations'][op_name]``).
+
+ :type service_model: botocore.model.ServiceModel
+ :param service_model: The service model associated with the operation.
+
+ :type name: string
+ :param name: The operation name. This is the operation name exposed to
+ the users of this model. This can potentially be different from
+ the "wire_name", which is the operation name that *must* by
+ provided over the wire. For example, given::
+
+ "CreateCloudFrontOriginAccessIdentity":{
+ "name":"CreateCloudFrontOriginAccessIdentity2014_11_06",
+ ...
+ }
+
+ The ``name`` would be ``CreateCloudFrontOriginAccessIdentity``,
+ but the ``self.wire_name`` would be
+ ``CreateCloudFrontOriginAccessIdentity2014_11_06``, which is the
+ value we must send in the corresponding HTTP request.
+
+ """
+ self._operation_model = operation_model
+ self._service_model = service_model
+ self._api_name = name
+ # Clients can access '.name' to get the operation name
+ # and '.metadata' to get the top level metdata of the service.
+ self._wire_name = operation_model.get('name')
+ self.metadata = service_model.metadata
+ self.http = operation_model.get('http', {})
+
+ @CachedProperty
+ def name(self):
+ if self._api_name is not None:
+ return self._api_name
+ else:
+ return self.wire_name
+
+ @property
+ def wire_name(self):
+ """The wire name of the operation.
+
+ In many situations this is the same value as the
+ ``name``, value, but in some services, the operation name
+ exposed to the user is different from the operation name
+ we send across the wire (e.g cloudfront).
+
+ Any serialization code should use ``wire_name``.
+
+ """
+ return self._operation_model.get('name')
+
+ @property
+ def service_model(self):
+ return self._service_model
+
+ @CachedProperty
+ def documentation(self):
+ return self._operation_model.get('documentation', '')
+
+ @CachedProperty
+ def deprecated(self):
+ return self._operation_model.get('deprecated', False)
+
+ @CachedProperty
+ def endpoint_discovery(self):
+ # Explicit None default. An empty dictionary for this trait means it is
+ # enabled but not required to be used.
+ return self._operation_model.get('endpointdiscovery', None)
+
+ @CachedProperty
+ def is_endpoint_discovery_operation(self):
+ return self._operation_model.get('endpointoperation', False)
+
+ @CachedProperty
+ def input_shape(self):
+ if 'input' not in self._operation_model:
+ # Some operations do not accept any input and do not define an
+ # input shape.
+ return None
+ return self._service_model.resolve_shape_ref(
+ self._operation_model['input']
+ )
+
+ @CachedProperty
+ def output_shape(self):
+ if 'output' not in self._operation_model:
+ # Some operations do not define an output shape,
+ # in which case we return None to indicate the
+ # operation has no expected output.
+ return None
+ return self._service_model.resolve_shape_ref(
+ self._operation_model['output']
+ )
+
+ @CachedProperty
+ def idempotent_members(self):
+ input_shape = self.input_shape
+ if not input_shape:
+ return []
+
+ return [
+ name
+ for (name, shape) in input_shape.members.items()
+ if 'idempotencyToken' in shape.metadata
+ and shape.metadata['idempotencyToken']
+ ]
+
+ @CachedProperty
+ def static_context_parameters(self):
+ params = self._operation_model.get('staticContextParams', {})
+ return [
+ StaticContextParameter(name=name, value=props.get('value'))
+ for name, props in params.items()
+ ]
+
+ @CachedProperty
+ def context_parameters(self):
+ if not self.input_shape:
+ return []
+
+ return [
+ ContextParameter(
+ name=shape.metadata['contextParam']['name'],
+ member_name=name,
+ )
+ for name, shape in self.input_shape.members.items()
+ if 'contextParam' in shape.metadata
+ and 'name' in shape.metadata['contextParam']
+ ]
+
+ @CachedProperty
+ def operation_context_parameters(self):
+ return self._operation_model.get('operationContextParams', [])
+
+ @CachedProperty
+ def request_compression(self):
+ return self._operation_model.get('requestcompression')
+
+ @CachedProperty
+ def auth(self):
+ return self._operation_model.get('auth')
+
+ @CachedProperty
+ def auth_type(self):
+ return self._operation_model.get('authtype')
+
+ @CachedProperty
+ def resolved_auth_type(self):
+ if self.auth:
+ return resolve_auth_type(self.auth)
+ return self.auth_type
+
+ @CachedProperty
+ def unsigned_payload(self):
+ return self._operation_model.get('unsignedPayload')
+
+ @CachedProperty
+ def error_shapes(self):
+ shapes = self._operation_model.get("errors", [])
+ return list(self._service_model.resolve_shape_ref(s) for s in shapes)
+
+ @CachedProperty
+ def endpoint(self):
+ return self._operation_model.get('endpoint')
+
+ @CachedProperty
+ def http_checksum_required(self):
+ return self._operation_model.get('httpChecksumRequired', False)
+
+ @CachedProperty
+ def http_checksum(self):
+ return self._operation_model.get('httpChecksum', {})
+
+ @CachedProperty
+ def has_event_stream_input(self):
+ return self.get_event_stream_input() is not None
+
+ @CachedProperty
+ def has_event_stream_output(self):
+ return self.get_event_stream_output() is not None
+
+ def get_event_stream_input(self):
+ return self._get_event_stream(self.input_shape)
+
+ def get_event_stream_output(self):
+ return self._get_event_stream(self.output_shape)
+
+ def _get_event_stream(self, shape):
+ """Returns the event stream member's shape if any or None otherwise."""
+ if shape is None:
+ return None
+ event_name = shape.event_stream_name
+ if event_name:
+ return shape.members[event_name]
+ return None
+
+ @CachedProperty
+ def has_streaming_input(self):
+ return self.get_streaming_input() is not None
+
+ @CachedProperty
+ def has_streaming_output(self):
+ return self.get_streaming_output() is not None
+
+ def get_streaming_input(self):
+ return self._get_streaming_body(self.input_shape)
+
+ def get_streaming_output(self):
+ return self._get_streaming_body(self.output_shape)
+
+ def _get_streaming_body(self, shape):
+ """Returns the streaming member's shape if any; or None otherwise."""
+ if shape is None:
+ return None
+ payload = shape.serialization.get('payload')
+ if payload is not None:
+ payload_shape = shape.members[payload]
+ if payload_shape.type_name == 'blob':
+ return payload_shape
+ return None
+
+ def __repr__(self):
+ return f'{self.__class__.__name__}(name={self.name})'
+
+
+class ShapeResolver:
+ """Resolves shape references."""
+
+ # Any type not in this mapping will default to the Shape class.
+ SHAPE_CLASSES = {
+ 'structure': StructureShape,
+ 'list': ListShape,
+ 'map': MapShape,
+ 'string': StringShape,
+ }
+
+ def __init__(self, shape_map):
+ self._shape_map = shape_map
+ self._shape_cache = {}
+
+ def get_shape_by_name(self, shape_name, member_traits=None):
+ try:
+ shape_model = self._shape_map[shape_name]
+ except KeyError:
+ raise NoShapeFoundError(shape_name)
+ try:
+ shape_cls = self.SHAPE_CLASSES.get(shape_model['type'], Shape)
+ except KeyError:
+ raise InvalidShapeError(
+ f"Shape is missing required key 'type': {shape_model}"
+ )
+ if member_traits:
+ shape_model = shape_model.copy()
+ shape_model.update(member_traits)
+ result = shape_cls(shape_name, shape_model, self)
+ return result
+
+ def resolve_shape_ref(self, shape_ref):
+ # A shape_ref is a dict that has a 'shape' key that
+ # refers to a shape name as well as any additional
+ # member traits that are then merged over the shape
+ # definition. For example:
+ # {"shape": "StringType", "locationName": "Foobar"}
+ if len(shape_ref) == 1 and 'shape' in shape_ref:
+ # It's just a shape ref with no member traits, we can avoid
+ # a .copy(). This is the common case so it's specifically
+ # called out here.
+ return self.get_shape_by_name(shape_ref['shape'])
+ else:
+ member_traits = shape_ref.copy()
+ try:
+ shape_name = member_traits.pop('shape')
+ except KeyError:
+ raise InvalidShapeReferenceError(
+ f"Invalid model, missing shape reference: {shape_ref}"
+ )
+ return self.get_shape_by_name(shape_name, member_traits)
+
+
+class UnresolvableShapeMap:
+ """A ShapeResolver that will throw ValueErrors when shapes are resolved."""
+
+ def get_shape_by_name(self, shape_name, member_traits=None):
+ raise ValueError(
+ f"Attempted to lookup shape '{shape_name}', but no shape map was provided."
+ )
+
+ def resolve_shape_ref(self, shape_ref):
+ raise ValueError(
+ f"Attempted to resolve shape '{shape_ref}', but no shape "
+ f"map was provided."
+ )
+
+
+class DenormalizedStructureBuilder:
+ """Build a StructureShape from a denormalized model.
+
+ This is a convenience builder class that makes it easy to construct
+ ``StructureShape``s based on a denormalized model.
+
+ It will handle the details of creating unique shape names and creating
+ the appropriate shape map needed by the ``StructureShape`` class.
+
+ Example usage::
+
+ builder = DenormalizedStructureBuilder()
+ shape = builder.with_members({
+ 'A': {
+ 'type': 'structure',
+ 'members': {
+ 'B': {
+ 'type': 'structure',
+ 'members': {
+ 'C': {
+ 'type': 'string',
+ }
+ }
+ }
+ }
+ }
+ }).build_model()
+ # ``shape`` is now an instance of botocore.model.StructureShape
+
+ :type dict_type: class
+ :param dict_type: The dictionary type to use, allowing you to opt-in
+ to using OrderedDict or another dict type. This can
+ be particularly useful for testing when order
+ matters, such as for documentation.
+
+ """
+
+ SCALAR_TYPES = (
+ 'string',
+ 'integer',
+ 'boolean',
+ 'blob',
+ 'float',
+ 'timestamp',
+ 'long',
+ 'double',
+ 'char',
+ )
+
+ def __init__(self, name=None):
+ self.members = OrderedDict()
+ self._name_generator = ShapeNameGenerator()
+ if name is None:
+ self.name = self._name_generator.new_shape_name('structure')
+
+ def with_members(self, members):
+ """
+
+ :type members: dict
+ :param members: The denormalized members.
+
+ :return: self
+
+ """
+ self._members = members
+ return self
+
+ def build_model(self):
+ """Build the model based on the provided members.
+
+ :rtype: botocore.model.StructureShape
+ :return: The built StructureShape object.
+
+ """
+ shapes = OrderedDict()
+ denormalized = {
+ 'type': 'structure',
+ 'members': self._members,
+ }
+ self._build_model(denormalized, shapes, self.name)
+ resolver = ShapeResolver(shape_map=shapes)
+ return StructureShape(
+ shape_name=self.name,
+ shape_model=shapes[self.name],
+ shape_resolver=resolver,
+ )
+
+ def _build_model(self, model, shapes, shape_name):
+ if model['type'] == 'structure':
+ shapes[shape_name] = self._build_structure(model, shapes)
+ elif model['type'] == 'list':
+ shapes[shape_name] = self._build_list(model, shapes)
+ elif model['type'] == 'map':
+ shapes[shape_name] = self._build_map(model, shapes)
+ elif model['type'] in self.SCALAR_TYPES:
+ shapes[shape_name] = self._build_scalar(model)
+ else:
+ raise InvalidShapeError(f"Unknown shape type: {model['type']}")
+
+ def _build_structure(self, model, shapes):
+ members = OrderedDict()
+ shape = self._build_initial_shape(model)
+ shape['members'] = members
+
+ for name, member_model in model.get('members', OrderedDict()).items():
+ member_shape_name = self._get_shape_name(member_model)
+ members[name] = {'shape': member_shape_name}
+ self._build_model(member_model, shapes, member_shape_name)
+ return shape
+
+ def _build_list(self, model, shapes):
+ member_shape_name = self._get_shape_name(model)
+ shape = self._build_initial_shape(model)
+ shape['member'] = {'shape': member_shape_name}
+ self._build_model(model['member'], shapes, member_shape_name)
+ return shape
+
+ def _build_map(self, model, shapes):
+ key_shape_name = self._get_shape_name(model['key'])
+ value_shape_name = self._get_shape_name(model['value'])
+ shape = self._build_initial_shape(model)
+ shape['key'] = {'shape': key_shape_name}
+ shape['value'] = {'shape': value_shape_name}
+ self._build_model(model['key'], shapes, key_shape_name)
+ self._build_model(model['value'], shapes, value_shape_name)
+ return shape
+
+ def _build_initial_shape(self, model):
+ shape = {
+ 'type': model['type'],
+ }
+ if 'documentation' in model:
+ shape['documentation'] = model['documentation']
+ for attr in Shape.METADATA_ATTRS:
+ if attr in model:
+ shape[attr] = model[attr]
+ return shape
+
+ def _build_scalar(self, model):
+ return self._build_initial_shape(model)
+
+ def _get_shape_name(self, model):
+ if 'shape_name' in model:
+ return model['shape_name']
+ else:
+ return self._name_generator.new_shape_name(model['type'])
+
+
+class ShapeNameGenerator:
+ """Generate unique shape names for a type.
+
+ This class can be used in conjunction with the DenormalizedStructureBuilder
+ to generate unique shape names for a given type.
+
+ """
+
+ def __init__(self):
+ self._name_cache = defaultdict(int)
+
+ def new_shape_name(self, type_name):
+ """Generate a unique shape name.
+
+ This method will guarantee a unique shape name each time it is
+ called with the same type.
+
+ ::
+
+ >>> s = ShapeNameGenerator()
+ >>> s.new_shape_name('structure')
+ 'StructureType1'
+ >>> s.new_shape_name('structure')
+ 'StructureType2'
+ >>> s.new_shape_name('list')
+ 'ListType1'
+ >>> s.new_shape_name('list')
+ 'ListType2'
+
+
+ :type type_name: string
+ :param type_name: The type name (structure, list, map, string, etc.)
+
+ :rtype: string
+ :return: A unique shape name for the given type
+
+ """
+ self._name_cache[type_name] += 1
+ current_index = self._name_cache[type_name]
+ return f'{type_name.capitalize()}Type{current_index}'
diff --git a/.venv/lib/python3.12/site-packages/botocore/monitoring.py b/.venv/lib/python3.12/site-packages/botocore/monitoring.py
new file mode 100644
index 00000000..71d72302
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/monitoring.py
@@ -0,0 +1,586 @@
+# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import json
+import logging
+import re
+import time
+
+from botocore.compat import ensure_bytes, ensure_unicode, urlparse
+from botocore.retryhandler import EXCEPTION_MAP as RETRYABLE_EXCEPTIONS
+
+logger = logging.getLogger(__name__)
+
+
+class Monitor:
+ _EVENTS_TO_REGISTER = [
+ 'before-parameter-build',
+ 'request-created',
+ 'response-received',
+ 'after-call',
+ 'after-call-error',
+ ]
+
+ def __init__(self, adapter, publisher):
+ """Abstraction for monitoring clients API calls
+
+ :param adapter: An adapter that takes event emitter events
+ and produces monitor events
+
+ :param publisher: A publisher for generated monitor events
+ """
+ self._adapter = adapter
+ self._publisher = publisher
+
+ def register(self, event_emitter):
+ """Register an event emitter to the monitor"""
+ for event_to_register in self._EVENTS_TO_REGISTER:
+ event_emitter.register_last(event_to_register, self.capture)
+
+ def capture(self, event_name, **payload):
+ """Captures an incoming event from the event emitter
+
+ It will feed an event emitter event to the monitor's adaptor to create
+ a monitor event and then publish that event to the monitor's publisher.
+ """
+ try:
+ monitor_event = self._adapter.feed(event_name, payload)
+ if monitor_event:
+ self._publisher.publish(monitor_event)
+ except Exception as e:
+ logger.debug(
+ 'Exception %s raised by client monitor in handling event %s',
+ e,
+ event_name,
+ exc_info=True,
+ )
+
+
+class MonitorEventAdapter:
+ def __init__(self, time=time.time):
+ """Adapts event emitter events to produce monitor events
+
+ :type time: callable
+ :param time: A callable that produces the current time
+ """
+ self._time = time
+
+ def feed(self, emitter_event_name, emitter_payload):
+ """Feed an event emitter event to generate a monitor event
+
+ :type emitter_event_name: str
+ :param emitter_event_name: The name of the event emitted
+
+ :type emitter_payload: dict
+ :param emitter_payload: The payload to associated to the event
+ emitted
+
+ :rtype: BaseMonitorEvent
+ :returns: A monitor event based on the event emitter events
+ fired
+ """
+ return self._get_handler(emitter_event_name)(**emitter_payload)
+
+ def _get_handler(self, event_name):
+ return getattr(
+ self, '_handle_' + event_name.split('.')[0].replace('-', '_')
+ )
+
+ def _handle_before_parameter_build(self, model, context, **kwargs):
+ context['current_api_call_event'] = APICallEvent(
+ service=model.service_model.service_id,
+ operation=model.wire_name,
+ timestamp=self._get_current_time(),
+ )
+
+ def _handle_request_created(self, request, **kwargs):
+ context = request.context
+ new_attempt_event = context[
+ 'current_api_call_event'
+ ].new_api_call_attempt(timestamp=self._get_current_time())
+ new_attempt_event.request_headers = request.headers
+ new_attempt_event.url = request.url
+ context['current_api_call_attempt_event'] = new_attempt_event
+
+ def _handle_response_received(
+ self, parsed_response, context, exception, **kwargs
+ ):
+ attempt_event = context.pop('current_api_call_attempt_event')
+ attempt_event.latency = self._get_latency(attempt_event)
+ if parsed_response is not None:
+ attempt_event.http_status_code = parsed_response[
+ 'ResponseMetadata'
+ ]['HTTPStatusCode']
+ attempt_event.response_headers = parsed_response[
+ 'ResponseMetadata'
+ ]['HTTPHeaders']
+ attempt_event.parsed_error = parsed_response.get('Error')
+ else:
+ attempt_event.wire_exception = exception
+ return attempt_event
+
+ def _handle_after_call(self, context, parsed, **kwargs):
+ context['current_api_call_event'].retries_exceeded = parsed[
+ 'ResponseMetadata'
+ ].get('MaxAttemptsReached', False)
+ return self._complete_api_call(context)
+
+ def _handle_after_call_error(self, context, exception, **kwargs):
+ # If the after-call-error was emitted and the error being raised
+ # was a retryable connection error, then the retries must have exceeded
+ # for that exception as this event gets emitted **after** retries
+ # happen.
+ context[
+ 'current_api_call_event'
+ ].retries_exceeded = self._is_retryable_exception(exception)
+ return self._complete_api_call(context)
+
+ def _is_retryable_exception(self, exception):
+ return isinstance(
+ exception, tuple(RETRYABLE_EXCEPTIONS['GENERAL_CONNECTION_ERROR'])
+ )
+
+ def _complete_api_call(self, context):
+ call_event = context.pop('current_api_call_event')
+ call_event.latency = self._get_latency(call_event)
+ return call_event
+
+ def _get_latency(self, event):
+ return self._get_current_time() - event.timestamp
+
+ def _get_current_time(self):
+ return int(self._time() * 1000)
+
+
+class BaseMonitorEvent:
+ def __init__(self, service, operation, timestamp):
+ """Base monitor event
+
+ :type service: str
+ :param service: A string identifying the service associated to
+ the event
+
+ :type operation: str
+ :param operation: A string identifying the operation of service
+ associated to the event
+
+ :type timestamp: int
+ :param timestamp: Epoch time in milliseconds from when the event began
+ """
+ self.service = service
+ self.operation = operation
+ self.timestamp = timestamp
+
+ def __repr__(self):
+ return f'{self.__class__.__name__}({self.__dict__!r})'
+
+ def __eq__(self, other):
+ if isinstance(other, self.__class__):
+ return self.__dict__ == other.__dict__
+ return False
+
+
+class APICallEvent(BaseMonitorEvent):
+ def __init__(
+ self,
+ service,
+ operation,
+ timestamp,
+ latency=None,
+ attempts=None,
+ retries_exceeded=False,
+ ):
+ """Monitor event for a single API call
+
+ This event corresponds to a single client method call, which includes
+ every HTTP requests attempt made in order to complete the client call
+
+ :type service: str
+ :param service: A string identifying the service associated to
+ the event
+
+ :type operation: str
+ :param operation: A string identifying the operation of service
+ associated to the event
+
+ :type timestamp: int
+ :param timestamp: Epoch time in milliseconds from when the event began
+
+ :type latency: int
+ :param latency: The time in milliseconds to complete the client call
+
+ :type attempts: list
+ :param attempts: The list of APICallAttempts associated to the
+ APICall
+
+ :type retries_exceeded: bool
+ :param retries_exceeded: True if API call exceeded retries. False
+ otherwise
+ """
+ super().__init__(
+ service=service, operation=operation, timestamp=timestamp
+ )
+ self.latency = latency
+ self.attempts = attempts
+ if attempts is None:
+ self.attempts = []
+ self.retries_exceeded = retries_exceeded
+
+ def new_api_call_attempt(self, timestamp):
+ """Instantiates APICallAttemptEvent associated to the APICallEvent
+
+ :type timestamp: int
+ :param timestamp: Epoch time in milliseconds to associate to the
+ APICallAttemptEvent
+ """
+ attempt_event = APICallAttemptEvent(
+ service=self.service, operation=self.operation, timestamp=timestamp
+ )
+ self.attempts.append(attempt_event)
+ return attempt_event
+
+
+class APICallAttemptEvent(BaseMonitorEvent):
+ def __init__(
+ self,
+ service,
+ operation,
+ timestamp,
+ latency=None,
+ url=None,
+ http_status_code=None,
+ request_headers=None,
+ response_headers=None,
+ parsed_error=None,
+ wire_exception=None,
+ ):
+ """Monitor event for a single API call attempt
+
+ This event corresponds to a single HTTP request attempt in completing
+ the entire client method call.
+
+ :type service: str
+ :param service: A string identifying the service associated to
+ the event
+
+ :type operation: str
+ :param operation: A string identifying the operation of service
+ associated to the event
+
+ :type timestamp: int
+ :param timestamp: Epoch time in milliseconds from when the HTTP request
+ started
+
+ :type latency: int
+ :param latency: The time in milliseconds to complete the HTTP request
+ whether it succeeded or failed
+
+ :type url: str
+ :param url: The URL the attempt was sent to
+
+ :type http_status_code: int
+ :param http_status_code: The HTTP status code of the HTTP response
+ if there was a response
+
+ :type request_headers: dict
+ :param request_headers: The HTTP headers sent in making the HTTP
+ request
+
+ :type response_headers: dict
+ :param response_headers: The HTTP headers returned in the HTTP response
+ if there was a response
+
+ :type parsed_error: dict
+ :param parsed_error: The error parsed if the service returned an
+ error back
+
+ :type wire_exception: Exception
+ :param wire_exception: The exception raised in sending the HTTP
+ request (i.e. ConnectionError)
+ """
+ super().__init__(
+ service=service, operation=operation, timestamp=timestamp
+ )
+ self.latency = latency
+ self.url = url
+ self.http_status_code = http_status_code
+ self.request_headers = request_headers
+ self.response_headers = response_headers
+ self.parsed_error = parsed_error
+ self.wire_exception = wire_exception
+
+
+class CSMSerializer:
+ _MAX_CLIENT_ID_LENGTH = 255
+ _MAX_EXCEPTION_CLASS_LENGTH = 128
+ _MAX_ERROR_CODE_LENGTH = 128
+ _MAX_USER_AGENT_LENGTH = 256
+ _MAX_MESSAGE_LENGTH = 512
+ _RESPONSE_HEADERS_TO_EVENT_ENTRIES = {
+ 'x-amzn-requestid': 'XAmznRequestId',
+ 'x-amz-request-id': 'XAmzRequestId',
+ 'x-amz-id-2': 'XAmzId2',
+ }
+ _AUTH_REGEXS = {
+ 'v4': re.compile(
+ r'AWS4-HMAC-SHA256 '
+ r'Credential=(?P<access_key>\w+)/\d+/'
+ r'(?P<signing_region>[a-z0-9-]+)/'
+ ),
+ 's3': re.compile(r'AWS (?P<access_key>\w+):'),
+ }
+ _SERIALIZEABLE_EVENT_PROPERTIES = [
+ 'service',
+ 'operation',
+ 'timestamp',
+ 'attempts',
+ 'latency',
+ 'retries_exceeded',
+ 'url',
+ 'request_headers',
+ 'http_status_code',
+ 'response_headers',
+ 'parsed_error',
+ 'wire_exception',
+ ]
+
+ def __init__(self, csm_client_id):
+ """Serializes monitor events to CSM (Client Side Monitoring) format
+
+ :type csm_client_id: str
+ :param csm_client_id: The application identifier to associate
+ to the serialized events
+ """
+ self._validate_client_id(csm_client_id)
+ self.csm_client_id = csm_client_id
+
+ def _validate_client_id(self, csm_client_id):
+ if len(csm_client_id) > self._MAX_CLIENT_ID_LENGTH:
+ raise ValueError(
+ f'The value provided for csm_client_id: {csm_client_id} exceeds '
+ f'the maximum length of {self._MAX_CLIENT_ID_LENGTH} characters'
+ )
+
+ def serialize(self, event):
+ """Serializes a monitor event to the CSM format
+
+ :type event: BaseMonitorEvent
+ :param event: The event to serialize to bytes
+
+ :rtype: bytes
+ :returns: The CSM serialized form of the event
+ """
+ event_dict = self._get_base_event_dict(event)
+ event_type = self._get_event_type(event)
+ event_dict['Type'] = event_type
+ for attr in self._SERIALIZEABLE_EVENT_PROPERTIES:
+ value = getattr(event, attr, None)
+ if value is not None:
+ getattr(self, '_serialize_' + attr)(
+ value, event_dict, event_type=event_type
+ )
+ return ensure_bytes(json.dumps(event_dict, separators=(',', ':')))
+
+ def _get_base_event_dict(self, event):
+ return {
+ 'Version': 1,
+ 'ClientId': self.csm_client_id,
+ }
+
+ def _serialize_service(self, service, event_dict, **kwargs):
+ event_dict['Service'] = service
+
+ def _serialize_operation(self, operation, event_dict, **kwargs):
+ event_dict['Api'] = operation
+
+ def _serialize_timestamp(self, timestamp, event_dict, **kwargs):
+ event_dict['Timestamp'] = timestamp
+
+ def _serialize_attempts(self, attempts, event_dict, **kwargs):
+ event_dict['AttemptCount'] = len(attempts)
+ if attempts:
+ self._add_fields_from_last_attempt(event_dict, attempts[-1])
+
+ def _add_fields_from_last_attempt(self, event_dict, last_attempt):
+ if last_attempt.request_headers:
+ # It does not matter which attempt to use to grab the region
+ # for the ApiCall event, but SDKs typically do the last one.
+ region = self._get_region(last_attempt.request_headers)
+ if region is not None:
+ event_dict['Region'] = region
+ event_dict['UserAgent'] = self._get_user_agent(
+ last_attempt.request_headers
+ )
+ if last_attempt.http_status_code is not None:
+ event_dict['FinalHttpStatusCode'] = last_attempt.http_status_code
+ if last_attempt.parsed_error is not None:
+ self._serialize_parsed_error(
+ last_attempt.parsed_error, event_dict, 'ApiCall'
+ )
+ if last_attempt.wire_exception is not None:
+ self._serialize_wire_exception(
+ last_attempt.wire_exception, event_dict, 'ApiCall'
+ )
+
+ def _serialize_latency(self, latency, event_dict, event_type):
+ if event_type == 'ApiCall':
+ event_dict['Latency'] = latency
+ elif event_type == 'ApiCallAttempt':
+ event_dict['AttemptLatency'] = latency
+
+ def _serialize_retries_exceeded(
+ self, retries_exceeded, event_dict, **kwargs
+ ):
+ event_dict['MaxRetriesExceeded'] = 1 if retries_exceeded else 0
+
+ def _serialize_url(self, url, event_dict, **kwargs):
+ event_dict['Fqdn'] = urlparse(url).netloc
+
+ def _serialize_request_headers(
+ self, request_headers, event_dict, **kwargs
+ ):
+ event_dict['UserAgent'] = self._get_user_agent(request_headers)
+ if self._is_signed(request_headers):
+ event_dict['AccessKey'] = self._get_access_key(request_headers)
+ region = self._get_region(request_headers)
+ if region is not None:
+ event_dict['Region'] = region
+ if 'X-Amz-Security-Token' in request_headers:
+ event_dict['SessionToken'] = request_headers[
+ 'X-Amz-Security-Token'
+ ]
+
+ def _serialize_http_status_code(
+ self, http_status_code, event_dict, **kwargs
+ ):
+ event_dict['HttpStatusCode'] = http_status_code
+
+ def _serialize_response_headers(
+ self, response_headers, event_dict, **kwargs
+ ):
+ for header, entry in self._RESPONSE_HEADERS_TO_EVENT_ENTRIES.items():
+ if header in response_headers:
+ event_dict[entry] = response_headers[header]
+
+ def _serialize_parsed_error(
+ self, parsed_error, event_dict, event_type, **kwargs
+ ):
+ field_prefix = 'Final' if event_type == 'ApiCall' else ''
+ event_dict[field_prefix + 'AwsException'] = self._truncate(
+ parsed_error['Code'], self._MAX_ERROR_CODE_LENGTH
+ )
+ event_dict[field_prefix + 'AwsExceptionMessage'] = self._truncate(
+ parsed_error['Message'], self._MAX_MESSAGE_LENGTH
+ )
+
+ def _serialize_wire_exception(
+ self, wire_exception, event_dict, event_type, **kwargs
+ ):
+ field_prefix = 'Final' if event_type == 'ApiCall' else ''
+ event_dict[field_prefix + 'SdkException'] = self._truncate(
+ wire_exception.__class__.__name__, self._MAX_EXCEPTION_CLASS_LENGTH
+ )
+ event_dict[field_prefix + 'SdkExceptionMessage'] = self._truncate(
+ str(wire_exception), self._MAX_MESSAGE_LENGTH
+ )
+
+ def _get_event_type(self, event):
+ if isinstance(event, APICallEvent):
+ return 'ApiCall'
+ elif isinstance(event, APICallAttemptEvent):
+ return 'ApiCallAttempt'
+
+ def _get_access_key(self, request_headers):
+ auth_val = self._get_auth_value(request_headers)
+ _, auth_match = self._get_auth_match(auth_val)
+ return auth_match.group('access_key')
+
+ def _get_region(self, request_headers):
+ if not self._is_signed(request_headers):
+ return None
+ auth_val = self._get_auth_value(request_headers)
+ signature_version, auth_match = self._get_auth_match(auth_val)
+ if signature_version != 'v4':
+ return None
+ return auth_match.group('signing_region')
+
+ def _get_user_agent(self, request_headers):
+ return self._truncate(
+ ensure_unicode(request_headers.get('User-Agent', '')),
+ self._MAX_USER_AGENT_LENGTH,
+ )
+
+ def _is_signed(self, request_headers):
+ return 'Authorization' in request_headers
+
+ def _get_auth_value(self, request_headers):
+ return ensure_unicode(request_headers['Authorization'])
+
+ def _get_auth_match(self, auth_val):
+ for signature_version, regex in self._AUTH_REGEXS.items():
+ match = regex.match(auth_val)
+ if match:
+ return signature_version, match
+ return None, None
+
+ def _truncate(self, text, max_length):
+ if len(text) > max_length:
+ logger.debug(
+ 'Truncating following value to maximum length of ' '%s: %s',
+ text,
+ max_length,
+ )
+ return text[:max_length]
+ return text
+
+
+class SocketPublisher:
+ _MAX_MONITOR_EVENT_LENGTH = 8 * 1024
+
+ def __init__(self, socket, host, port, serializer):
+ """Publishes monitor events to a socket
+
+ :type socket: socket.socket
+ :param socket: The socket object to use to publish events
+
+ :type host: string
+ :param host: The host to send events to
+
+ :type port: integer
+ :param port: The port on the host to send events to
+
+ :param serializer: The serializer to use to serialize the event
+ to a form that can be published to the socket. This must
+ have a `serialize()` method that accepts a monitor event
+ and return bytes
+ """
+ self._socket = socket
+ self._address = (host, port)
+ self._serializer = serializer
+
+ def publish(self, event):
+ """Publishes a specified monitor event
+
+ :type event: BaseMonitorEvent
+ :param event: The monitor event to be sent
+ over the publisher's socket to the desired address.
+ """
+ serialized_event = self._serializer.serialize(event)
+ if len(serialized_event) > self._MAX_MONITOR_EVENT_LENGTH:
+ logger.debug(
+ 'Serialized event of size %s exceeds the maximum length '
+ 'allowed: %s. Not sending event to socket.',
+ len(serialized_event),
+ self._MAX_MONITOR_EVENT_LENGTH,
+ )
+ return
+ self._socket.sendto(serialized_event, self._address)
diff --git a/.venv/lib/python3.12/site-packages/botocore/paginate.py b/.venv/lib/python3.12/site-packages/botocore/paginate.py
new file mode 100644
index 00000000..f7095967
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/paginate.py
@@ -0,0 +1,724 @@
+# Copyright 2012-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+
+import base64
+import json
+import logging
+from functools import partial
+from itertools import tee
+
+import jmespath
+
+from botocore.context import with_current_context
+from botocore.exceptions import PaginationError
+from botocore.useragent import register_feature_id
+from botocore.utils import merge_dicts, set_value_from_jmespath
+
+log = logging.getLogger(__name__)
+
+
+class TokenEncoder:
+ """Encodes dictionaries into opaque strings.
+
+ This for the most part json dumps + base64 encoding, but also supports
+ having bytes in the dictionary in addition to the types that json can
+ handle by default.
+
+ This is intended for use in encoding pagination tokens, which in some
+ cases can be complex structures and / or contain bytes.
+ """
+
+ def encode(self, token):
+ """Encodes a dictionary to an opaque string.
+
+ :type token: dict
+ :param token: A dictionary containing pagination information,
+ particularly the service pagination token(s) but also other boto
+ metadata.
+
+ :rtype: str
+ :returns: An opaque string
+ """
+ try:
+ # Try just using json dumps first to avoid having to traverse
+ # and encode the dict. In 99.9999% of cases this will work.
+ json_string = json.dumps(token)
+ except (TypeError, UnicodeDecodeError):
+ # If normal dumping failed, go through and base64 encode all bytes.
+ encoded_token, encoded_keys = self._encode(token, [])
+
+ # Save the list of all the encoded key paths. We can safely
+ # assume that no service will ever use this key.
+ encoded_token['boto_encoded_keys'] = encoded_keys
+
+ # Now that the bytes are all encoded, dump the json.
+ json_string = json.dumps(encoded_token)
+
+ # base64 encode the json string to produce an opaque token string.
+ return base64.b64encode(json_string.encode('utf-8')).decode('utf-8')
+
+ def _encode(self, data, path):
+ """Encode bytes in given data, keeping track of the path traversed."""
+ if isinstance(data, dict):
+ return self._encode_dict(data, path)
+ elif isinstance(data, list):
+ return self._encode_list(data, path)
+ elif isinstance(data, bytes):
+ return self._encode_bytes(data, path)
+ else:
+ return data, []
+
+ def _encode_list(self, data, path):
+ """Encode any bytes in a list, noting the index of what is encoded."""
+ new_data = []
+ encoded = []
+ for i, value in enumerate(data):
+ new_path = path + [i]
+ new_value, new_encoded = self._encode(value, new_path)
+ new_data.append(new_value)
+ encoded.extend(new_encoded)
+ return new_data, encoded
+
+ def _encode_dict(self, data, path):
+ """Encode any bytes in a dict, noting the index of what is encoded."""
+ new_data = {}
+ encoded = []
+ for key, value in data.items():
+ new_path = path + [key]
+ new_value, new_encoded = self._encode(value, new_path)
+ new_data[key] = new_value
+ encoded.extend(new_encoded)
+ return new_data, encoded
+
+ def _encode_bytes(self, data, path):
+ """Base64 encode a byte string."""
+ return base64.b64encode(data).decode('utf-8'), [path]
+
+
+class TokenDecoder:
+ """Decodes token strings back into dictionaries.
+
+ This performs the inverse operation to the TokenEncoder, accepting
+ opaque strings and decoding them into a useable form.
+ """
+
+ def decode(self, token):
+ """Decodes an opaque string to a dictionary.
+
+ :type token: str
+ :param token: A token string given by the botocore pagination
+ interface.
+
+ :rtype: dict
+ :returns: A dictionary containing pagination information,
+ particularly the service pagination token(s) but also other boto
+ metadata.
+ """
+ json_string = base64.b64decode(token.encode('utf-8')).decode('utf-8')
+ decoded_token = json.loads(json_string)
+
+ # Remove the encoding metadata as it is read since it will no longer
+ # be needed.
+ encoded_keys = decoded_token.pop('boto_encoded_keys', None)
+ if encoded_keys is None:
+ return decoded_token
+ else:
+ return self._decode(decoded_token, encoded_keys)
+
+ def _decode(self, token, encoded_keys):
+ """Find each encoded value and decode it."""
+ for key in encoded_keys:
+ encoded = self._path_get(token, key)
+ decoded = base64.b64decode(encoded.encode('utf-8'))
+ self._path_set(token, key, decoded)
+ return token
+
+ def _path_get(self, data, path):
+ """Return the nested data at the given path.
+
+ For instance:
+ data = {'foo': ['bar', 'baz']}
+ path = ['foo', 0]
+ ==> 'bar'
+ """
+ # jmespath isn't used here because it would be difficult to actually
+ # create the jmespath query when taking all of the unknowns of key
+ # structure into account. Gross though this is, it is simple and not
+ # very error prone.
+ d = data
+ for step in path:
+ d = d[step]
+ return d
+
+ def _path_set(self, data, path, value):
+ """Set the value of a key in the given data.
+
+ Example:
+ data = {'foo': ['bar', 'baz']}
+ path = ['foo', 1]
+ value = 'bin'
+ ==> data = {'foo': ['bar', 'bin']}
+ """
+ container = self._path_get(data, path[:-1])
+ container[path[-1]] = value
+
+
+class PaginatorModel:
+ def __init__(self, paginator_config):
+ self._paginator_config = paginator_config['pagination']
+
+ def get_paginator(self, operation_name):
+ try:
+ single_paginator_config = self._paginator_config[operation_name]
+ except KeyError:
+ raise ValueError(
+ f"Paginator for operation does not exist: {operation_name}"
+ )
+ return single_paginator_config
+
+
+class PageIterator:
+ """An iterable object to paginate API results.
+ Please note it is NOT a python iterator.
+ Use ``iter`` to wrap this as a generator.
+ """
+
+ def __init__(
+ self,
+ method,
+ input_token,
+ output_token,
+ more_results,
+ result_keys,
+ non_aggregate_keys,
+ limit_key,
+ max_items,
+ starting_token,
+ page_size,
+ op_kwargs,
+ ):
+ self._method = method
+ self._input_token = input_token
+ self._output_token = output_token
+ self._more_results = more_results
+ self._result_keys = result_keys
+ self._max_items = max_items
+ self._limit_key = limit_key
+ self._starting_token = starting_token
+ self._page_size = page_size
+ self._op_kwargs = op_kwargs
+ self._resume_token = None
+ self._non_aggregate_key_exprs = non_aggregate_keys
+ self._non_aggregate_part = {}
+ self._token_encoder = TokenEncoder()
+ self._token_decoder = TokenDecoder()
+
+ @property
+ def result_keys(self):
+ return self._result_keys
+
+ @property
+ def resume_token(self):
+ """Token to specify to resume pagination."""
+ return self._resume_token
+
+ @resume_token.setter
+ def resume_token(self, value):
+ if not isinstance(value, dict):
+ raise ValueError(f"Bad starting token: {value}")
+
+ if 'boto_truncate_amount' in value:
+ token_keys = sorted(self._input_token + ['boto_truncate_amount'])
+ else:
+ token_keys = sorted(self._input_token)
+ dict_keys = sorted(value.keys())
+
+ if token_keys == dict_keys:
+ self._resume_token = self._token_encoder.encode(value)
+ else:
+ raise ValueError(f"Bad starting token: {value}")
+
+ @property
+ def non_aggregate_part(self):
+ return self._non_aggregate_part
+
+ def __iter__(self):
+ current_kwargs = self._op_kwargs
+ previous_next_token = None
+ next_token = {key: None for key in self._input_token}
+ if self._starting_token is not None:
+ # If the starting token exists, populate the next_token with the
+ # values inside it. This ensures that we have the service's
+ # pagination token on hand if we need to truncate after the
+ # first response.
+ next_token = self._parse_starting_token()[0]
+ # The number of items from result_key we've seen so far.
+ total_items = 0
+ first_request = True
+ primary_result_key = self.result_keys[0]
+ starting_truncation = 0
+ self._inject_starting_params(current_kwargs)
+ while True:
+ response = self._make_request(current_kwargs)
+ parsed = self._extract_parsed_response(response)
+ if first_request:
+ # The first request is handled differently. We could
+ # possibly have a resume/starting token that tells us where
+ # to index into the retrieved page.
+ if self._starting_token is not None:
+ starting_truncation = self._handle_first_request(
+ parsed, primary_result_key, starting_truncation
+ )
+ first_request = False
+ self._record_non_aggregate_key_values(parsed)
+ else:
+ # If this isn't the first request, we have already sliced into
+ # the first request and had to make additional requests after.
+ # We no longer need to add this to truncation.
+ starting_truncation = 0
+ current_response = primary_result_key.search(parsed)
+ if current_response is None:
+ current_response = []
+ num_current_response = len(current_response)
+ truncate_amount = 0
+ if self._max_items is not None:
+ truncate_amount = (
+ total_items + num_current_response - self._max_items
+ )
+ if truncate_amount > 0:
+ self._truncate_response(
+ parsed,
+ primary_result_key,
+ truncate_amount,
+ starting_truncation,
+ next_token,
+ )
+ yield response
+ break
+ else:
+ yield response
+ total_items += num_current_response
+ next_token = self._get_next_token(parsed)
+ if all(t is None for t in next_token.values()):
+ break
+ if (
+ self._max_items is not None
+ and total_items == self._max_items
+ ):
+ # We're on a page boundary so we can set the current
+ # next token to be the resume token.
+ self.resume_token = next_token
+ break
+ if (
+ previous_next_token is not None
+ and previous_next_token == next_token
+ ):
+ message = (
+ f"The same next token was received "
+ f"twice: {next_token}"
+ )
+ raise PaginationError(message=message)
+ self._inject_token_into_kwargs(current_kwargs, next_token)
+ previous_next_token = next_token
+
+ def search(self, expression):
+ """Applies a JMESPath expression to a paginator
+
+ Each page of results is searched using the provided JMESPath
+ expression. If the result is not a list, it is yielded
+ directly. If the result is a list, each element in the result
+ is yielded individually (essentially implementing a flatmap in
+ which the JMESPath search is the mapping function).
+
+ :type expression: str
+ :param expression: JMESPath expression to apply to each page.
+
+ :return: Returns an iterator that yields the individual
+ elements of applying a JMESPath expression to each page of
+ results.
+ """
+ compiled = jmespath.compile(expression)
+ for page in self:
+ results = compiled.search(page)
+ if isinstance(results, list):
+ yield from results
+ else:
+ # Yield result directly if it is not a list.
+ yield results
+
+ @with_current_context(partial(register_feature_id, 'PAGINATOR'))
+ def _make_request(self, current_kwargs):
+ return self._method(**current_kwargs)
+
+ def _extract_parsed_response(self, response):
+ return response
+
+ def _record_non_aggregate_key_values(self, response):
+ non_aggregate_keys = {}
+ for expression in self._non_aggregate_key_exprs:
+ result = expression.search(response)
+ set_value_from_jmespath(
+ non_aggregate_keys, expression.expression, result
+ )
+ self._non_aggregate_part = non_aggregate_keys
+
+ def _inject_starting_params(self, op_kwargs):
+ # If the user has specified a starting token we need to
+ # inject that into the operation's kwargs.
+ if self._starting_token is not None:
+ # Don't need to do anything special if there is no starting
+ # token specified.
+ next_token = self._parse_starting_token()[0]
+ self._inject_token_into_kwargs(op_kwargs, next_token)
+ if self._page_size is not None:
+ # Pass the page size as the parameter name for limiting
+ # page size, also known as the limit_key.
+ op_kwargs[self._limit_key] = self._page_size
+
+ def _inject_token_into_kwargs(self, op_kwargs, next_token):
+ for name, token in next_token.items():
+ if (token is not None) and (token != 'None'):
+ op_kwargs[name] = token
+ elif name in op_kwargs:
+ del op_kwargs[name]
+
+ def _handle_first_request(
+ self, parsed, primary_result_key, starting_truncation
+ ):
+ # If the payload is an array or string, we need to slice into it
+ # and only return the truncated amount.
+ starting_truncation = self._parse_starting_token()[1]
+ all_data = primary_result_key.search(parsed)
+ if isinstance(all_data, (list, str)):
+ data = all_data[starting_truncation:]
+ else:
+ data = None
+ set_value_from_jmespath(parsed, primary_result_key.expression, data)
+ # We also need to truncate any secondary result keys
+ # because they were not truncated in the previous last
+ # response.
+ for token in self.result_keys:
+ if token == primary_result_key:
+ continue
+ sample = token.search(parsed)
+ if isinstance(sample, list):
+ empty_value = []
+ elif isinstance(sample, str):
+ empty_value = ''
+ elif isinstance(sample, (int, float)):
+ empty_value = 0
+ else:
+ empty_value = None
+ set_value_from_jmespath(parsed, token.expression, empty_value)
+ return starting_truncation
+
+ def _truncate_response(
+ self,
+ parsed,
+ primary_result_key,
+ truncate_amount,
+ starting_truncation,
+ next_token,
+ ):
+ original = primary_result_key.search(parsed)
+ if original is None:
+ original = []
+ amount_to_keep = len(original) - truncate_amount
+ truncated = original[:amount_to_keep]
+ set_value_from_jmespath(
+ parsed, primary_result_key.expression, truncated
+ )
+ # The issue here is that even though we know how much we've truncated
+ # we need to account for this globally including any starting
+ # left truncation. For example:
+ # Raw response: [0,1,2,3]
+ # Starting index: 1
+ # Max items: 1
+ # Starting left truncation: [1, 2, 3]
+ # End right truncation for max items: [1]
+ # However, even though we only kept 1, this is post
+ # left truncation so the next starting index should be 2, not 1
+ # (left_truncation + amount_to_keep).
+ next_token['boto_truncate_amount'] = (
+ amount_to_keep + starting_truncation
+ )
+ self.resume_token = next_token
+
+ def _get_next_token(self, parsed):
+ if self._more_results is not None:
+ if not self._more_results.search(parsed):
+ return {}
+ next_tokens = {}
+ for output_token, input_key in zip(
+ self._output_token, self._input_token
+ ):
+ next_token = output_token.search(parsed)
+ # We do not want to include any empty strings as actual tokens.
+ # Treat them as None.
+ if next_token:
+ next_tokens[input_key] = next_token
+ else:
+ next_tokens[input_key] = None
+ return next_tokens
+
+ def result_key_iters(self):
+ teed_results = tee(self, len(self.result_keys))
+ return [
+ ResultKeyIterator(i, result_key)
+ for i, result_key in zip(teed_results, self.result_keys)
+ ]
+
+ def build_full_result(self):
+ complete_result = {}
+ for response in self:
+ page = response
+ # We want to try to catch operation object pagination
+ # and format correctly for those. They come in the form
+ # of a tuple of two elements: (http_response, parsed_responsed).
+ # We want the parsed_response as that is what the page iterator
+ # uses. We can remove it though once operation objects are removed.
+ if isinstance(response, tuple) and len(response) == 2:
+ page = response[1]
+ # We're incrementally building the full response page
+ # by page. For each page in the response we need to
+ # inject the necessary components from the page
+ # into the complete_result.
+ for result_expression in self.result_keys:
+ # In order to incrementally update a result key
+ # we need to search the existing value from complete_result,
+ # then we need to search the _current_ page for the
+ # current result key value. Then we append the current
+ # value onto the existing value, and re-set that value
+ # as the new value.
+ result_value = result_expression.search(page)
+ if result_value is None:
+ continue
+ existing_value = result_expression.search(complete_result)
+ if existing_value is None:
+ # Set the initial result
+ set_value_from_jmespath(
+ complete_result,
+ result_expression.expression,
+ result_value,
+ )
+ continue
+ # Now both result_value and existing_value contain something
+ if isinstance(result_value, list):
+ existing_value.extend(result_value)
+ elif isinstance(result_value, (int, float, str)):
+ # Modify the existing result with the sum or concatenation
+ set_value_from_jmespath(
+ complete_result,
+ result_expression.expression,
+ existing_value + result_value,
+ )
+ merge_dicts(complete_result, self.non_aggregate_part)
+ if self.resume_token is not None:
+ complete_result['NextToken'] = self.resume_token
+ return complete_result
+
+ def _parse_starting_token(self):
+ if self._starting_token is None:
+ return None
+
+ # The starting token is a dict passed as a base64 encoded string.
+ next_token = self._starting_token
+ try:
+ next_token = self._token_decoder.decode(next_token)
+ index = 0
+ if 'boto_truncate_amount' in next_token:
+ index = next_token.get('boto_truncate_amount')
+ del next_token['boto_truncate_amount']
+ except (ValueError, TypeError):
+ next_token, index = self._parse_starting_token_deprecated()
+ return next_token, index
+
+ def _parse_starting_token_deprecated(self):
+ """
+ This handles parsing of old style starting tokens, and attempts to
+ coerce them into the new style.
+ """
+ log.debug(
+ "Attempting to fall back to old starting token parser. For "
+ f"token: {self._starting_token}"
+ )
+ if self._starting_token is None:
+ return None
+
+ parts = self._starting_token.split('___')
+ next_token = []
+ index = 0
+ if len(parts) == len(self._input_token) + 1:
+ try:
+ index = int(parts.pop())
+ except ValueError:
+ # This doesn't look like a valid old-style token, so we're
+ # passing it along as an opaque service token.
+ parts = [self._starting_token]
+
+ for part in parts:
+ if part == 'None':
+ next_token.append(None)
+ else:
+ next_token.append(part)
+ return self._convert_deprecated_starting_token(next_token), index
+
+ def _convert_deprecated_starting_token(self, deprecated_token):
+ """
+ This attempts to convert a deprecated starting token into the new
+ style.
+ """
+ len_deprecated_token = len(deprecated_token)
+ len_input_token = len(self._input_token)
+ if len_deprecated_token > len_input_token:
+ raise ValueError(f"Bad starting token: {self._starting_token}")
+ elif len_deprecated_token < len_input_token:
+ log.debug(
+ "Old format starting token does not contain all input "
+ "tokens. Setting the rest, in order, as None."
+ )
+ for i in range(len_input_token - len_deprecated_token):
+ deprecated_token.append(None)
+ return dict(zip(self._input_token, deprecated_token))
+
+
+class Paginator:
+ PAGE_ITERATOR_CLS = PageIterator
+
+ def __init__(self, method, pagination_config, model):
+ self._model = model
+ self._method = method
+ self._pagination_cfg = pagination_config
+ self._output_token = self._get_output_tokens(self._pagination_cfg)
+ self._input_token = self._get_input_tokens(self._pagination_cfg)
+ self._more_results = self._get_more_results_token(self._pagination_cfg)
+ self._non_aggregate_keys = self._get_non_aggregate_keys(
+ self._pagination_cfg
+ )
+ self._result_keys = self._get_result_keys(self._pagination_cfg)
+ self._limit_key = self._get_limit_key(self._pagination_cfg)
+
+ @property
+ def result_keys(self):
+ return self._result_keys
+
+ def _get_non_aggregate_keys(self, config):
+ keys = []
+ for key in config.get('non_aggregate_keys', []):
+ keys.append(jmespath.compile(key))
+ return keys
+
+ def _get_output_tokens(self, config):
+ output = []
+ output_token = config['output_token']
+ if not isinstance(output_token, list):
+ output_token = [output_token]
+ for config in output_token:
+ output.append(jmespath.compile(config))
+ return output
+
+ def _get_input_tokens(self, config):
+ input_token = self._pagination_cfg['input_token']
+ if not isinstance(input_token, list):
+ input_token = [input_token]
+ return input_token
+
+ def _get_more_results_token(self, config):
+ more_results = config.get('more_results')
+ if more_results is not None:
+ return jmespath.compile(more_results)
+
+ def _get_result_keys(self, config):
+ result_key = config.get('result_key')
+ if result_key is not None:
+ if not isinstance(result_key, list):
+ result_key = [result_key]
+ result_key = [jmespath.compile(rk) for rk in result_key]
+ return result_key
+
+ def _get_limit_key(self, config):
+ return config.get('limit_key')
+
+ def paginate(self, **kwargs):
+ """Create paginator object for an operation.
+
+ This returns an iterable object. Iterating over
+ this object will yield a single page of a response
+ at a time.
+
+ """
+ page_params = self._extract_paging_params(kwargs)
+ return self.PAGE_ITERATOR_CLS(
+ self._method,
+ self._input_token,
+ self._output_token,
+ self._more_results,
+ self._result_keys,
+ self._non_aggregate_keys,
+ self._limit_key,
+ page_params['MaxItems'],
+ page_params['StartingToken'],
+ page_params['PageSize'],
+ kwargs,
+ )
+
+ def _extract_paging_params(self, kwargs):
+ pagination_config = kwargs.pop('PaginationConfig', {})
+ max_items = pagination_config.get('MaxItems', None)
+ if max_items is not None:
+ max_items = int(max_items)
+ page_size = pagination_config.get('PageSize', None)
+ if page_size is not None:
+ if self._limit_key is None:
+ raise PaginationError(
+ message="PageSize parameter is not supported for the "
+ "pagination interface for this operation."
+ )
+ input_members = self._model.input_shape.members
+ limit_key_shape = input_members.get(self._limit_key)
+ if limit_key_shape.type_name == 'string':
+ if not isinstance(page_size, str):
+ page_size = str(page_size)
+ else:
+ page_size = int(page_size)
+ return {
+ 'MaxItems': max_items,
+ 'StartingToken': pagination_config.get('StartingToken', None),
+ 'PageSize': page_size,
+ }
+
+
+class ResultKeyIterator:
+ """Iterates over the results of paginated responses.
+
+ Each iterator is associated with a single result key.
+ Iterating over this object will give you each element in
+ the result key list.
+
+ :param pages_iterator: An iterator that will give you
+ pages of results (a ``PageIterator`` class).
+ :param result_key: The JMESPath expression representing
+ the result key.
+
+ """
+
+ def __init__(self, pages_iterator, result_key):
+ self._pages_iterator = pages_iterator
+ self.result_key = result_key
+
+ def __iter__(self):
+ for page in self._pages_iterator:
+ results = self.result_key.search(page)
+ if results is None:
+ results = []
+ yield from results
diff --git a/.venv/lib/python3.12/site-packages/botocore/parsers.py b/.venv/lib/python3.12/site-packages/botocore/parsers.py
new file mode 100644
index 00000000..eff11a73
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/parsers.py
@@ -0,0 +1,1479 @@
+# Copyright 2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+"""Response parsers for the various protocol types.
+
+The module contains classes that can take an HTTP response, and given
+an output shape, parse the response into a dict according to the
+rules in the output shape.
+
+There are many similarities amongst the different protocols with regard
+to response parsing, and the code is structured in a way to avoid
+code duplication when possible. The diagram below is a diagram
+showing the inheritance hierarchy of the response classes.
+
+::
+
+
+ +-------------------+
+ | ResponseParser |
+ +-------------------+
+ ^ ^ ^ ^ ^
+ | | | | |
+ | | | | +--------------------------------------------+
+ | | | +-----------------------------+ |
+ | | | | |
+ +--------------------+ | +----------------+ | |
+ | | | | |
++----------+----------+ +------+-------+ +-------+------+ +------+-------+ +------+--------+
+|BaseXMLResponseParser| |BaseRestParser| |BaseJSONParser| |BaseCBORParser| |BaseRpcV2Parser|
++---------------------+ +--------------+ +--------------+ +----------+---+ +-+-------------+
+ ^ ^ ^ ^ ^ ^ ^ ^
+ | | | | | | | |
+ | | | | | | | |
+ | ++----------+-+ +-+--------+---+ | +---+---------+-+
+ | |RestXMLParser| |RestJSONParser| | |RpcV2CBORParser|
+ +-----+-----+ +-------------+ +--------------+ | +---+---------+-+
+ |QueryParser| |
+ +-----------+ +----+-----+
+ |JSONParser|
+ +----------+
+
+The diagram above shows that there is a base class, ``ResponseParser`` that
+contains logic that is similar amongst all the different protocols (``query``,
+``json``, ``rest-json``, ``rest-xml``, ``smithy-rpc-v2-cbor``). Amongst the various services
+there is shared logic that can be grouped several ways:
+
+* The ``query`` and ``rest-xml`` both have XML bodies that are parsed in the
+ same way.
+* The ``json`` and ``rest-json`` protocols both have JSON bodies that are
+ parsed in the same way.
+* The ``rest-json`` and ``rest-xml`` protocols have additional attributes
+ besides body parameters that are parsed the same (headers, query string,
+ status code).
+
+This is reflected in the class diagram above. The ``BaseXMLResponseParser``
+and the BaseJSONParser contain logic for parsing the XML/JSON body,
+and the BaseRestParser contains logic for parsing out attributes that
+come from other parts of the HTTP response. Classes like the
+``RestXMLParser`` inherit from the ``BaseXMLResponseParser`` to get the
+XML body parsing logic and the ``BaseRestParser`` to get the HTTP
+header/status code/query string parsing.
+
+Additionally, there are event stream parsers that are used by the other parsers
+to wrap streaming bodies that represent a stream of events. The
+BaseEventStreamParser extends from ResponseParser and defines the logic for
+parsing values from the headers and payload of a message from the underlying
+binary encoding protocol. Currently, event streams support parsing bodies
+encoded as JSON and XML through the following hierarchy.
+
+
+ +--------------+
+ |ResponseParser|
+ +--------------+
+ ^ ^ ^
+ +--------------------+ | +------------------+
+ | | |
+ +----------+----------+ +----------+----------+ +-------+------+
+ |BaseXMLResponseParser| |BaseEventStreamParser| |BaseJSONParser|
+ +---------------------+ +---------------------+ +--------------+
+ ^ ^ ^ ^
+ | | | |
+ | | | |
+ +-+----------------+-+ +-+-----------------+-+
+ |EventStreamXMLParser| |EventStreamJSONParser|
+ +--------------------+ +---------------------+
+
+Return Values
+=============
+
+Each call to ``parse()`` returns a dict has this form::
+
+ Standard Response
+
+ {
+ "ResponseMetadata": {"RequestId": <requestid>}
+ <response keys>
+ }
+
+ Error response
+
+ {
+ "ResponseMetadata": {"RequestId": <requestid>}
+ "Error": {
+ "Code": <string>,
+ "Message": <string>,
+ "Type": <string>,
+ <additional keys>
+ }
+ }
+
+"""
+
+import base64
+import http.client
+import io
+import json
+import logging
+import os
+import re
+import struct
+
+from botocore.compat import ETree, XMLParseError
+from botocore.eventstream import EventStream, NoInitialResponseError
+from botocore.utils import (
+ CachedProperty,
+ ensure_boolean,
+ is_json_value_header,
+ lowercase_dict,
+ merge_dicts,
+ parse_timestamp,
+)
+
+LOG = logging.getLogger(__name__)
+
+DEFAULT_TIMESTAMP_PARSER = parse_timestamp
+
+
+class ResponseParserFactory:
+ def __init__(self):
+ self._defaults = {}
+
+ def set_parser_defaults(self, **kwargs):
+ """Set default arguments when a parser instance is created.
+
+ You can specify any kwargs that are allowed by a ResponseParser
+ class. There are currently two arguments:
+
+ * timestamp_parser - A callable that can parse a timestamp string
+ * blob_parser - A callable that can parse a blob type
+
+ """
+ self._defaults.update(kwargs)
+
+ def create_parser(self, protocol_name):
+ parser_cls = PROTOCOL_PARSERS[protocol_name]
+ return parser_cls(**self._defaults)
+
+
+def create_parser(protocol):
+ return ResponseParserFactory().create_parser(protocol)
+
+
+def _text_content(func):
+ # This decorator hides the difference between
+ # an XML node with text or a plain string. It's used
+ # to ensure that scalar processing operates only on text
+ # strings, which allows the same scalar handlers to be used
+ # for XML nodes from the body and HTTP headers.
+ def _get_text_content(self, shape, node_or_string):
+ if hasattr(node_or_string, 'text'):
+ text = node_or_string.text
+ if text is None:
+ # If an XML node is empty <foo></foo>,
+ # we want to parse that as an empty string,
+ # not as a null/None value.
+ text = ''
+ else:
+ text = node_or_string
+ return func(self, shape, text)
+
+ return _get_text_content
+
+
+class ResponseParserError(Exception):
+ pass
+
+
+class ResponseParser:
+ """Base class for response parsing.
+
+ This class represents the interface that all ResponseParsers for the
+ various protocols must implement.
+
+ This class will take an HTTP response and a model shape and parse the
+ HTTP response into a dictionary.
+
+ There is a single public method exposed: ``parse``. See the ``parse``
+ docstring for more info.
+
+ """
+
+ DEFAULT_ENCODING = 'utf-8'
+ EVENT_STREAM_PARSER_CLS = None
+
+ def __init__(self, timestamp_parser=None, blob_parser=None):
+ if timestamp_parser is None:
+ timestamp_parser = DEFAULT_TIMESTAMP_PARSER
+ self._timestamp_parser = timestamp_parser
+ if blob_parser is None:
+ blob_parser = self._default_blob_parser
+ self._blob_parser = blob_parser
+ self._event_stream_parser = None
+ if self.EVENT_STREAM_PARSER_CLS is not None:
+ self._event_stream_parser = self.EVENT_STREAM_PARSER_CLS(
+ timestamp_parser, blob_parser
+ )
+
+ def _default_blob_parser(self, value):
+ # Blobs are always returned as bytes type (this matters on python3).
+ # We don't decode this to a str because it's entirely possible that the
+ # blob contains binary data that actually can't be decoded.
+ return base64.b64decode(value)
+
+ def parse(self, response, shape):
+ """Parse the HTTP response given a shape.
+
+ :param response: The HTTP response dictionary. This is a dictionary
+ that represents the HTTP request. The dictionary must have the
+ following keys, ``body``, ``headers``, and ``status_code``.
+
+ :param shape: The model shape describing the expected output.
+ :return: Returns a dictionary representing the parsed response
+ described by the model. In addition to the shape described from
+ the model, each response will also have a ``ResponseMetadata``
+ which contains metadata about the response, which contains at least
+ two keys containing ``RequestId`` and ``HTTPStatusCode``. Some
+ responses may populate additional keys, but ``RequestId`` will
+ always be present.
+
+ """
+ LOG.debug('Response headers: %r', response['headers'])
+ LOG.debug('Response body:\n%r', response['body'])
+ if response['status_code'] >= 301:
+ if self._is_generic_error_response(response):
+ parsed = self._do_generic_error_parse(response)
+ elif self._is_modeled_error_shape(shape):
+ parsed = self._do_modeled_error_parse(response, shape)
+ # We don't want to decorate the modeled fields with metadata
+ return parsed
+ else:
+ parsed = self._do_error_parse(response, shape)
+ else:
+ parsed = self._do_parse(response, shape)
+
+ # We don't want to decorate event stream responses with metadata
+ if shape and shape.serialization.get('eventstream'):
+ return parsed
+
+ # Add ResponseMetadata if it doesn't exist and inject the HTTP
+ # status code and headers from the response.
+ if isinstance(parsed, dict):
+ response_metadata = parsed.get('ResponseMetadata', {})
+ response_metadata['HTTPStatusCode'] = response['status_code']
+ # Ensure that the http header keys are all lower cased. Older
+ # versions of urllib3 (< 1.11) would unintentionally do this for us
+ # (see urllib3#633). We need to do this conversion manually now.
+ headers = response['headers']
+ response_metadata['HTTPHeaders'] = lowercase_dict(headers)
+ parsed['ResponseMetadata'] = response_metadata
+ self._add_checksum_response_metadata(response, response_metadata)
+ return parsed
+
+ def _add_checksum_response_metadata(self, response, response_metadata):
+ checksum_context = response.get('context', {}).get('checksum', {})
+ algorithm = checksum_context.get('response_algorithm')
+ if algorithm:
+ response_metadata['ChecksumAlgorithm'] = algorithm
+
+ def _is_modeled_error_shape(self, shape):
+ return shape is not None and shape.metadata.get('exception', False)
+
+ def _is_generic_error_response(self, response):
+ # There are times when a service will respond with a generic
+ # error response such as:
+ # '<html><body><b>Http/1.1 Service Unavailable</b></body></html>'
+ #
+ # This can also happen if you're going through a proxy.
+ # In this case the protocol specific _do_error_parse will either
+ # fail to parse the response (in the best case) or silently succeed
+ # and treat the HTML above as an XML response and return
+ # non sensical parsed data.
+ # To prevent this case from happening we first need to check
+ # whether or not this response looks like the generic response.
+ if response['status_code'] >= 500:
+ if 'body' not in response or response['body'] is None:
+ return True
+
+ body = response['body'].strip()
+ return body.startswith(b'<html>') or not body
+
+ def _do_generic_error_parse(self, response):
+ # There's not really much we can do when we get a generic
+ # html response.
+ LOG.debug(
+ "Received a non protocol specific error response from the "
+ "service, unable to populate error code and message."
+ )
+ return {
+ 'Error': {
+ 'Code': str(response['status_code']),
+ 'Message': http.client.responses.get(
+ response['status_code'], ''
+ ),
+ },
+ 'ResponseMetadata': {},
+ }
+
+ def _do_parse(self, response, shape):
+ raise NotImplementedError(f"{self.__class__.__name__}._do_parse")
+
+ def _do_error_parse(self, response, shape):
+ raise NotImplementedError(f"{self.__class__.__name__}._do_error_parse")
+
+ def _do_modeled_error_parse(self, response, shape, parsed):
+ raise NotImplementedError(
+ f"{self.__class__.__name__}._do_modeled_error_parse"
+ )
+
+ def _parse_shape(self, shape, node):
+ handler = getattr(
+ self, f'_handle_{shape.type_name}', self._default_handle
+ )
+ return handler(shape, node)
+
+ def _handle_list(self, shape, node):
+ # Enough implementations share list serialization that it's moved
+ # up here in the base class.
+ parsed = []
+ member_shape = shape.member
+ for item in node:
+ parsed.append(self._parse_shape(member_shape, item))
+ return parsed
+
+ def _default_handle(self, shape, value):
+ return value
+
+ def _create_event_stream(self, response, shape):
+ parser = self._event_stream_parser
+ name = response['context'].get('operation_name')
+ return EventStream(response['body'], shape, parser, name)
+
+ def _get_first_key(self, value):
+ return list(value)[0]
+
+ def _has_unknown_tagged_union_member(self, shape, value):
+ if shape.is_tagged_union:
+ cleaned_value = value.copy()
+ cleaned_value.pop("__type", None)
+ cleaned_value = {
+ k: v for k, v in cleaned_value.items() if v is not None
+ }
+ if len(cleaned_value) != 1:
+ error_msg = (
+ "Invalid service response: %s must have one and only "
+ "one member set."
+ )
+ raise ResponseParserError(error_msg % shape.name)
+ tag = self._get_first_key(cleaned_value)
+ serialized_member_names = [
+ shape.members[member].serialization.get('name', member)
+ for member in shape.members
+ ]
+ if tag not in serialized_member_names:
+ msg = (
+ "Received a tagged union response with member "
+ "unknown to client: %s. Please upgrade SDK for full "
+ "response support."
+ )
+ LOG.info(msg % tag)
+ return True
+ return False
+
+ def _handle_unknown_tagged_union_member(self, tag):
+ return {'SDK_UNKNOWN_MEMBER': {'name': tag}}
+
+ def _do_query_compatible_error_parse(self, code, headers, error):
+ """
+ Error response may contain an x-amzn-query-error header to translate
+ errors codes from former `query` services into other protocols. We use this
+ to do our lookup in the errorfactory for modeled errors.
+ """
+ query_error = headers['x-amzn-query-error']
+ query_error_components = query_error.split(';')
+
+ if len(query_error_components) == 2 and query_error_components[0]:
+ error['Error']['QueryErrorCode'] = code
+ error['Error']['Type'] = query_error_components[1]
+ return query_error_components[0]
+ return code
+
+
+class BaseXMLResponseParser(ResponseParser):
+ def __init__(self, timestamp_parser=None, blob_parser=None):
+ super().__init__(timestamp_parser, blob_parser)
+ self._namespace_re = re.compile('{.*}')
+
+ def _handle_map(self, shape, node):
+ parsed = {}
+ key_shape = shape.key
+ value_shape = shape.value
+ key_location_name = key_shape.serialization.get('name') or 'key'
+ value_location_name = value_shape.serialization.get('name') or 'value'
+ if shape.serialization.get('flattened') and not isinstance(node, list):
+ node = [node]
+ for keyval_node in node:
+ for single_pair in keyval_node:
+ # Within each <entry> there's a <key> and a <value>
+ tag_name = self._node_tag(single_pair)
+ if tag_name == key_location_name:
+ key_name = self._parse_shape(key_shape, single_pair)
+ elif tag_name == value_location_name:
+ val_name = self._parse_shape(value_shape, single_pair)
+ else:
+ raise ResponseParserError(f"Unknown tag: {tag_name}")
+ parsed[key_name] = val_name
+ return parsed
+
+ def _node_tag(self, node):
+ return self._namespace_re.sub('', node.tag)
+
+ def _handle_list(self, shape, node):
+ # When we use _build_name_to_xml_node, repeated elements are aggregated
+ # into a list. However, we can't tell the difference between a scalar
+ # value and a single element flattened list. So before calling the
+ # real _handle_list, we know that "node" should actually be a list if
+ # it's flattened, and if it's not, then we make it a one element list.
+ if shape.serialization.get('flattened') and not isinstance(node, list):
+ node = [node]
+ return super()._handle_list(shape, node)
+
+ def _handle_structure(self, shape, node):
+ parsed = {}
+ members = shape.members
+ if shape.metadata.get('exception', False):
+ node = self._get_error_root(node)
+ xml_dict = self._build_name_to_xml_node(node)
+ if self._has_unknown_tagged_union_member(shape, xml_dict):
+ tag = self._get_first_key(xml_dict)
+ return self._handle_unknown_tagged_union_member(tag)
+ for member_name in members:
+ member_shape = members[member_name]
+ if (
+ 'location' in member_shape.serialization
+ or member_shape.serialization.get('eventheader')
+ ):
+ # All members with locations have already been handled,
+ # so we don't need to parse these members.
+ continue
+ xml_name = self._member_key_name(member_shape, member_name)
+ member_node = xml_dict.get(xml_name)
+ if member_node is not None:
+ parsed[member_name] = self._parse_shape(
+ member_shape, member_node
+ )
+ elif member_shape.serialization.get('xmlAttribute'):
+ attribs = {}
+ location_name = member_shape.serialization['name']
+ for key, value in node.attrib.items():
+ new_key = self._namespace_re.sub(
+ location_name.split(':')[0] + ':', key
+ )
+ attribs[new_key] = value
+ if location_name in attribs:
+ parsed[member_name] = attribs[location_name]
+ return parsed
+
+ def _get_error_root(self, original_root):
+ if self._node_tag(original_root) == 'ErrorResponse':
+ for child in original_root:
+ if self._node_tag(child) == 'Error':
+ return child
+ return original_root
+
+ def _member_key_name(self, shape, member_name):
+ # This method is needed because we have to special case flattened list
+ # with a serialization name. If this is the case we use the
+ # locationName from the list's member shape as the key name for the
+ # surrounding structure.
+ if shape.type_name == 'list' and shape.serialization.get('flattened'):
+ list_member_serialized_name = shape.member.serialization.get(
+ 'name'
+ )
+ if list_member_serialized_name is not None:
+ return list_member_serialized_name
+ serialized_name = shape.serialization.get('name')
+ if serialized_name is not None:
+ return serialized_name
+ return member_name
+
+ def _build_name_to_xml_node(self, parent_node):
+ # If the parent node is actually a list. We should not be trying
+ # to serialize it to a dictionary. Instead, return the first element
+ # in the list.
+ if isinstance(parent_node, list):
+ return self._build_name_to_xml_node(parent_node[0])
+ xml_dict = {}
+ for item in parent_node:
+ key = self._node_tag(item)
+ if key in xml_dict:
+ # If the key already exists, the most natural
+ # way to handle this is to aggregate repeated
+ # keys into a single list.
+ # <foo>1</foo><foo>2</foo> -> {'foo': [Node(1), Node(2)]}
+ if isinstance(xml_dict[key], list):
+ xml_dict[key].append(item)
+ else:
+ # Convert from a scalar to a list.
+ xml_dict[key] = [xml_dict[key], item]
+ else:
+ xml_dict[key] = item
+ return xml_dict
+
+ def _parse_xml_string_to_dom(self, xml_string):
+ try:
+ parser = ETree.XMLParser(
+ target=ETree.TreeBuilder(), encoding=self.DEFAULT_ENCODING
+ )
+ parser.feed(xml_string)
+ root = parser.close()
+ except XMLParseError as e:
+ raise ResponseParserError(
+ f"Unable to parse response ({e}), "
+ f"invalid XML received. Further retries may succeed:\n{xml_string}"
+ )
+ return root
+
+ def _replace_nodes(self, parsed):
+ for key, value in parsed.items():
+ if list(value):
+ sub_dict = self._build_name_to_xml_node(value)
+ parsed[key] = self._replace_nodes(sub_dict)
+ else:
+ parsed[key] = value.text
+ return parsed
+
+ @_text_content
+ def _handle_boolean(self, shape, text):
+ if text == 'true':
+ return True
+ else:
+ return False
+
+ @_text_content
+ def _handle_float(self, shape, text):
+ return float(text)
+
+ @_text_content
+ def _handle_timestamp(self, shape, text):
+ return self._timestamp_parser(text)
+
+ @_text_content
+ def _handle_integer(self, shape, text):
+ return int(text)
+
+ @_text_content
+ def _handle_string(self, shape, text):
+ return text
+
+ @_text_content
+ def _handle_blob(self, shape, text):
+ return self._blob_parser(text)
+
+ _handle_character = _handle_string
+ _handle_double = _handle_float
+ _handle_long = _handle_integer
+
+
+class QueryParser(BaseXMLResponseParser):
+ def _do_error_parse(self, response, shape):
+ xml_contents = response['body']
+ root = self._parse_xml_string_to_dom(xml_contents)
+ parsed = self._build_name_to_xml_node(root)
+ self._replace_nodes(parsed)
+ # Once we've converted xml->dict, we need to make one or two
+ # more adjustments to extract nested errors and to be consistent
+ # with ResponseMetadata for non-error responses:
+ # 1. {"Errors": {"Error": {...}}} -> {"Error": {...}}
+ # 2. {"RequestId": "id"} -> {"ResponseMetadata": {"RequestId": "id"}}
+ if 'Errors' in parsed:
+ parsed.update(parsed.pop('Errors'))
+ if 'RequestId' in parsed:
+ parsed['ResponseMetadata'] = {'RequestId': parsed.pop('RequestId')}
+ return parsed
+
+ def _do_modeled_error_parse(self, response, shape):
+ return self._parse_body_as_xml(response, shape, inject_metadata=False)
+
+ def _do_parse(self, response, shape):
+ return self._parse_body_as_xml(response, shape, inject_metadata=True)
+
+ def _parse_body_as_xml(self, response, shape, inject_metadata=True):
+ xml_contents = response['body']
+ root = self._parse_xml_string_to_dom(xml_contents)
+ parsed = {}
+ if shape is not None:
+ start = root
+ if 'resultWrapper' in shape.serialization:
+ start = self._find_result_wrapped_shape(
+ shape.serialization['resultWrapper'], root
+ )
+ parsed = self._parse_shape(shape, start)
+ if inject_metadata:
+ self._inject_response_metadata(root, parsed)
+ return parsed
+
+ def _find_result_wrapped_shape(self, element_name, xml_root_node):
+ mapping = self._build_name_to_xml_node(xml_root_node)
+ return mapping[element_name]
+
+ def _inject_response_metadata(self, node, inject_into):
+ mapping = self._build_name_to_xml_node(node)
+ child_node = mapping.get('ResponseMetadata')
+ if child_node is not None:
+ sub_mapping = self._build_name_to_xml_node(child_node)
+ for key, value in sub_mapping.items():
+ sub_mapping[key] = value.text
+ inject_into['ResponseMetadata'] = sub_mapping
+
+
+class EC2QueryParser(QueryParser):
+ def _inject_response_metadata(self, node, inject_into):
+ mapping = self._build_name_to_xml_node(node)
+ child_node = mapping.get('requestId')
+ if child_node is not None:
+ inject_into['ResponseMetadata'] = {'RequestId': child_node.text}
+
+ def _do_error_parse(self, response, shape):
+ # EC2 errors look like:
+ # <Response>
+ # <Errors>
+ # <Error>
+ # <Code>InvalidInstanceID.Malformed</Code>
+ # <Message>Invalid id: "1343124"</Message>
+ # </Error>
+ # </Errors>
+ # <RequestID>12345</RequestID>
+ # </Response>
+ # This is different from QueryParser in that it's RequestID,
+ # not RequestId
+ original = super()._do_error_parse(response, shape)
+ if 'RequestID' in original:
+ original['ResponseMetadata'] = {
+ 'RequestId': original.pop('RequestID')
+ }
+ return original
+
+ def _get_error_root(self, original_root):
+ for child in original_root:
+ if self._node_tag(child) == 'Errors':
+ for errors_child in child:
+ if self._node_tag(errors_child) == 'Error':
+ return errors_child
+ return original_root
+
+
+class BaseJSONParser(ResponseParser):
+ def _handle_structure(self, shape, value):
+ final_parsed = {}
+ if shape.is_document_type:
+ final_parsed = value
+ else:
+ member_shapes = shape.members
+ if value is None:
+ # If the comes across the wire as "null" (None in python),
+ # we should be returning this unchanged, instead of as an
+ # empty dict.
+ return None
+ final_parsed = {}
+ if self._has_unknown_tagged_union_member(shape, value):
+ tag = self._get_first_key(value)
+ return self._handle_unknown_tagged_union_member(tag)
+ for member_name in member_shapes:
+ member_shape = member_shapes[member_name]
+ json_name = member_shape.serialization.get('name', member_name)
+ raw_value = value.get(json_name)
+ if raw_value is not None:
+ final_parsed[member_name] = self._parse_shape(
+ member_shapes[member_name], raw_value
+ )
+ return final_parsed
+
+ def _handle_map(self, shape, value):
+ parsed = {}
+ key_shape = shape.key
+ value_shape = shape.value
+ for key, value in value.items():
+ actual_key = self._parse_shape(key_shape, key)
+ actual_value = self._parse_shape(value_shape, value)
+ parsed[actual_key] = actual_value
+ return parsed
+
+ def _handle_blob(self, shape, value):
+ return self._blob_parser(value)
+
+ def _handle_timestamp(self, shape, value):
+ return self._timestamp_parser(value)
+
+ def _do_error_parse(self, response, shape):
+ body = self._parse_body_as_json(response['body'])
+ error = {"Error": {"Message": '', "Code": ''}, "ResponseMetadata": {}}
+ headers = response['headers']
+ # Error responses can have slightly different structures for json.
+ # The basic structure is:
+ #
+ # {"__type":"ConnectClientException",
+ # "message":"The error message."}
+
+ # The error message can either come in the 'message' or 'Message' key
+ # so we need to check for both.
+ error['Error']['Message'] = body.get(
+ 'message', body.get('Message', '')
+ )
+ # if the message did not contain an error code
+ # include the response status code
+ response_code = response.get('status_code')
+
+ code = body.get('__type', response_code and str(response_code))
+ if code is not None:
+ # code has a couple forms as well:
+ # * "com.aws.dynamodb.vAPI#ProvisionedThroughputExceededException"
+ # * "ResourceNotFoundException"
+ if ':' in code:
+ code = code.split(':', 1)[0]
+ if '#' in code:
+ code = code.rsplit('#', 1)[1]
+ if 'x-amzn-query-error' in headers:
+ code = self._do_query_compatible_error_parse(
+ code, headers, error
+ )
+ error['Error']['Code'] = code
+ self._inject_response_metadata(error, response['headers'])
+ return error
+
+ def _inject_response_metadata(self, parsed, headers):
+ if 'x-amzn-requestid' in headers:
+ parsed.setdefault('ResponseMetadata', {})['RequestId'] = headers[
+ 'x-amzn-requestid'
+ ]
+
+ def _parse_body_as_json(self, body_contents):
+ if not body_contents:
+ return {}
+ body = body_contents.decode(self.DEFAULT_ENCODING)
+ try:
+ original_parsed = json.loads(body)
+ return original_parsed
+ except ValueError:
+ # if the body cannot be parsed, include
+ # the literal string as the message
+ return {'message': body}
+
+
+class BaseCBORParser(ResponseParser):
+ INDEFINITE_ITEM_ADDITIONAL_INFO = 31
+ BREAK_CODE = 0xFF
+
+ @CachedProperty
+ def major_type_to_parsing_method_map(self):
+ return {
+ 0: self._parse_unsigned_integer,
+ 1: self._parse_negative_integer,
+ 2: self._parse_byte_string,
+ 3: self._parse_text_string,
+ 4: self._parse_array,
+ 5: self._parse_map,
+ 6: self._parse_tag,
+ 7: self._parse_simple_and_float,
+ }
+
+ def get_peekable_stream_from_bytes(self, bytes):
+ return io.BufferedReader(io.BytesIO(bytes))
+
+ def parse_data_item(self, stream):
+ # CBOR data is divided into "data items", and each data item starts
+ # with an initial byte that describes how the following bytes should be parsed
+ initial_byte = self._read_bytes_as_int(stream, 1)
+ # The highest order three bits of the initial byte describe the CBOR major type
+ major_type = initial_byte >> 5
+ # The lowest order 5 bits of the initial byte tells us more information about
+ # how the bytes should be parsed that will be used
+ additional_info = initial_byte & 0b00011111
+
+ if major_type in self.major_type_to_parsing_method_map:
+ method = self.major_type_to_parsing_method_map[major_type]
+ return method(stream, additional_info)
+ else:
+ raise ResponseParserError(
+ f"Unsupported inital byte found for data item- "
+ f"Major type:{major_type}, Additional info: "
+ f"{additional_info}"
+ )
+
+ # Major type 0 - unsigned integers
+ def _parse_unsigned_integer(self, stream, additional_info):
+ additional_info_to_num_bytes = {
+ 24: 1,
+ 25: 2,
+ 26: 4,
+ 27: 8,
+ }
+ # Values under 24 don't need a full byte to be stored; their values are
+ # instead stored as the "additional info" in the initial byte
+ if additional_info < 24:
+ return additional_info
+ elif additional_info in additional_info_to_num_bytes:
+ num_bytes = additional_info_to_num_bytes[additional_info]
+ return self._read_bytes_as_int(stream, num_bytes)
+ else:
+ raise ResponseParserError(
+ "Invalid CBOR integer returned from the service; unparsable "
+ f"additional info found for major type 0 or 1: {additional_info}"
+ )
+
+ # Major type 1 - negative integers
+ def _parse_negative_integer(self, stream, additional_info):
+ return -1 - self._parse_unsigned_integer(stream, additional_info)
+
+ # Major type 2 - byte string
+ def _parse_byte_string(self, stream, additional_info):
+ if additional_info != self.INDEFINITE_ITEM_ADDITIONAL_INFO:
+ length = self._parse_unsigned_integer(stream, additional_info)
+ return self._read_from_stream(stream, length)
+ else:
+ chunks = []
+ while True:
+ if self._handle_break_code(stream):
+ break
+ initial_byte = self._read_bytes_as_int(stream, 1)
+ additional_info = initial_byte & 0b00011111
+ length = self._parse_unsigned_integer(stream, additional_info)
+ chunks.append(self._read_from_stream(stream, length))
+ return b''.join(chunks)
+
+ # Major type 3 - text string
+ def _parse_text_string(self, stream, additional_info):
+ return self._parse_byte_string(stream, additional_info).decode('utf-8')
+
+ # Major type 4 - lists
+ def _parse_array(self, stream, additional_info):
+ if additional_info != self.INDEFINITE_ITEM_ADDITIONAL_INFO:
+ length = self._parse_unsigned_integer(stream, additional_info)
+ return [self.parse_data_item(stream) for _ in range(length)]
+ else:
+ items = []
+ while not self._handle_break_code(stream):
+ items.append(self.parse_data_item(stream))
+ return items
+
+ # Major type 5 - maps
+ def _parse_map(self, stream, additional_info):
+ items = {}
+ if additional_info != self.INDEFINITE_ITEM_ADDITIONAL_INFO:
+ length = self._parse_unsigned_integer(stream, additional_info)
+ for _ in range(length):
+ self._parse_key_value_pair(stream, items)
+ return items
+
+ else:
+ while not self._handle_break_code(stream):
+ self._parse_key_value_pair(stream, items)
+ return items
+
+ def _parse_key_value_pair(self, stream, items):
+ key = self.parse_data_item(stream)
+ value = self.parse_data_item(stream)
+ if value is not None:
+ items[key] = value
+
+ # Major type 6 is tags. The only tag we currently support is tag 1 for unix
+ # timestamps
+ def _parse_tag(self, stream, additional_info):
+ tag = self._parse_unsigned_integer(stream, additional_info)
+ value = self.parse_data_item(stream)
+ if tag == 1: # Epoch-based date/time in milliseconds
+ return self._parse_datetime(value)
+ else:
+ raise ResponseParserError(
+ f"Found CBOR tag not supported by botocore: {tag}"
+ )
+
+ def _parse_datetime(self, value):
+ if isinstance(value, (int, float)):
+ return self._timestamp_parser(value)
+ else:
+ raise ResponseParserError(
+ f"Unable to parse datetime value: {value}"
+ )
+
+ # Major type 7 includes floats and "simple" types. Supported simple types are
+ # currently boolean values, CBOR's null, and CBOR's undefined type. All other
+ # values are either floats or invalid.
+ def _parse_simple_and_float(self, stream, additional_info):
+ # For major type 7, values 20-23 correspond to CBOR "simple" values
+ additional_info_simple_values = {
+ 20: False, # CBOR false
+ 21: True, # CBOR true
+ 22: None, # CBOR null
+ 23: None, # CBOR undefined
+ }
+ # First we check if the additional info corresponds to a supported simple value
+ if additional_info in additional_info_simple_values:
+ return additional_info_simple_values[additional_info]
+
+ # If it's not a simple value, we need to parse it into the correct format and
+ # number fo bytes
+ float_formats = {
+ 25: ('>e', 2),
+ 26: ('>f', 4),
+ 27: ('>d', 8),
+ }
+
+ if additional_info in float_formats:
+ float_format, num_bytes = float_formats[additional_info]
+ return struct.unpack(
+ float_format, self._read_from_stream(stream, num_bytes)
+ )[0]
+ raise ResponseParserError(
+ f"Invalid additional info found for major type 7: {additional_info}. "
+ f"This indicates an unsupported simple type or an indefinite float value"
+ )
+
+ # This helper method is intended for use when parsing indefinite length items.
+ # It does nothing if the next byte is not the break code. If the next byte is
+ # the break code, it advances past that byte and returns True so the calling
+ # method knows to stop parsing that data item.
+ def _handle_break_code(self, stream):
+ if int.from_bytes(stream.peek(1)[:1], 'big') == self.BREAK_CODE:
+ stream.seek(1, os.SEEK_CUR)
+ return True
+
+ def _read_bytes_as_int(self, stream, num_bytes):
+ byte = self._read_from_stream(stream, num_bytes)
+ return int.from_bytes(byte, 'big')
+
+ def _read_from_stream(self, stream, num_bytes):
+ value = stream.read(num_bytes)
+ if len(value) != num_bytes:
+ raise ResponseParserError(
+ "End of stream reached; this indicates a "
+ "malformed CBOR response from the server or an "
+ "issue in botocore"
+ )
+ return value
+
+
+class BaseEventStreamParser(ResponseParser):
+ def _do_parse(self, response, shape):
+ final_parsed = {}
+ if shape.serialization.get('eventstream'):
+ event_type = response['headers'].get(':event-type')
+ event_shape = shape.members.get(event_type)
+ if event_shape:
+ final_parsed[event_type] = self._do_parse(
+ response, event_shape
+ )
+ else:
+ self._parse_non_payload_attrs(
+ response, shape, shape.members, final_parsed
+ )
+ self._parse_payload(response, shape, shape.members, final_parsed)
+ return final_parsed
+
+ def _do_error_parse(self, response, shape):
+ exception_type = response['headers'].get(':exception-type')
+ exception_shape = shape.members.get(exception_type)
+ if exception_shape is not None:
+ original_parsed = self._initial_body_parse(response['body'])
+ body = self._parse_shape(exception_shape, original_parsed)
+ error = {
+ 'Error': {
+ 'Code': exception_type,
+ 'Message': body.get('Message', body.get('message', '')),
+ }
+ }
+ else:
+ error = {
+ 'Error': {
+ 'Code': response['headers'].get(':error-code', ''),
+ 'Message': response['headers'].get(':error-message', ''),
+ }
+ }
+ return error
+
+ def _parse_payload(self, response, shape, member_shapes, final_parsed):
+ if shape.serialization.get('event'):
+ for name in member_shapes:
+ member_shape = member_shapes[name]
+ if member_shape.serialization.get('eventpayload'):
+ body = response['body']
+ if member_shape.type_name == 'blob':
+ parsed_body = body
+ elif member_shape.type_name == 'string':
+ parsed_body = body.decode(self.DEFAULT_ENCODING)
+ else:
+ raw_parse = self._initial_body_parse(body)
+ parsed_body = self._parse_shape(
+ member_shape, raw_parse
+ )
+ final_parsed[name] = parsed_body
+ return
+ # If we didn't find an explicit payload, use the current shape
+ original_parsed = self._initial_body_parse(response['body'])
+ body_parsed = self._parse_shape(shape, original_parsed)
+ final_parsed.update(body_parsed)
+
+ def _parse_non_payload_attrs(
+ self, response, shape, member_shapes, final_parsed
+ ):
+ headers = response['headers']
+ for name in member_shapes:
+ member_shape = member_shapes[name]
+ if member_shape.serialization.get('eventheader'):
+ if name in headers:
+ value = headers[name]
+ if member_shape.type_name == 'timestamp':
+ # Event stream timestamps are an in milleseconds so we
+ # divide by 1000 to convert to seconds.
+ value = self._timestamp_parser(value / 1000.0)
+ final_parsed[name] = value
+
+ def _initial_body_parse(self, body_contents):
+ # This method should do the initial xml/json parsing of the
+ # body. We still need to walk the parsed body in order
+ # to convert types, but this method will do the first round
+ # of parsing.
+ raise NotImplementedError("_initial_body_parse")
+
+
+class EventStreamJSONParser(BaseEventStreamParser, BaseJSONParser):
+ def _initial_body_parse(self, body_contents):
+ return self._parse_body_as_json(body_contents)
+
+
+class EventStreamXMLParser(BaseEventStreamParser, BaseXMLResponseParser):
+ def _initial_body_parse(self, xml_string):
+ if not xml_string:
+ return ETree.Element('')
+ return self._parse_xml_string_to_dom(xml_string)
+
+
+class EventStreamCBORParser(BaseEventStreamParser, BaseCBORParser):
+ def _initial_body_parse(self, body_contents):
+ if body_contents == b'':
+ return {}
+ return self.parse_data_item(
+ self.get_peekable_stream_from_bytes(body_contents)
+ )
+
+
+class JSONParser(BaseJSONParser):
+ EVENT_STREAM_PARSER_CLS = EventStreamJSONParser
+
+ """Response parser for the "json" protocol."""
+
+ def _do_parse(self, response, shape):
+ parsed = {}
+ if shape is not None:
+ event_name = shape.event_stream_name
+ if event_name:
+ parsed = self._handle_event_stream(response, shape, event_name)
+ else:
+ parsed = self._handle_json_body(response['body'], shape)
+ self._inject_response_metadata(parsed, response['headers'])
+ return parsed
+
+ def _do_modeled_error_parse(self, response, shape):
+ return self._handle_json_body(response['body'], shape)
+
+ def _handle_event_stream(self, response, shape, event_name):
+ event_stream_shape = shape.members[event_name]
+ event_stream = self._create_event_stream(response, event_stream_shape)
+ try:
+ event = event_stream.get_initial_response()
+ except NoInitialResponseError:
+ error_msg = 'First event was not of type initial-response'
+ raise ResponseParserError(error_msg)
+ parsed = self._handle_json_body(event.payload, shape)
+ parsed[event_name] = event_stream
+ return parsed
+
+ def _handle_json_body(self, raw_body, shape):
+ # The json.loads() gives us the primitive JSON types,
+ # but we need to traverse the parsed JSON data to convert
+ # to richer types (blobs, timestamps, etc.
+ parsed_json = self._parse_body_as_json(raw_body)
+ return self._parse_shape(shape, parsed_json)
+
+
+class BaseRestParser(ResponseParser):
+ def _do_parse(self, response, shape):
+ final_parsed = {}
+ final_parsed['ResponseMetadata'] = self._populate_response_metadata(
+ response
+ )
+ self._add_modeled_parse(response, shape, final_parsed)
+ return final_parsed
+
+ def _add_modeled_parse(self, response, shape, final_parsed):
+ if shape is None:
+ return final_parsed
+ member_shapes = shape.members
+ self._parse_non_payload_attrs(
+ response, shape, member_shapes, final_parsed
+ )
+ self._parse_payload(response, shape, member_shapes, final_parsed)
+
+ def _do_modeled_error_parse(self, response, shape):
+ final_parsed = {}
+ self._add_modeled_parse(response, shape, final_parsed)
+ return final_parsed
+
+ def _populate_response_metadata(self, response):
+ metadata = {}
+ headers = response['headers']
+ if 'x-amzn-requestid' in headers:
+ metadata['RequestId'] = headers['x-amzn-requestid']
+ elif 'x-amz-request-id' in headers:
+ metadata['RequestId'] = headers['x-amz-request-id']
+ # HostId is what it's called whenever this value is returned
+ # in an XML response body, so to be consistent, we'll always
+ # call is HostId.
+ metadata['HostId'] = headers.get('x-amz-id-2', '')
+ return metadata
+
+ def _parse_payload(self, response, shape, member_shapes, final_parsed):
+ if 'payload' in shape.serialization:
+ # If a payload is specified in the output shape, then only that
+ # shape is used for the body payload.
+ payload_member_name = shape.serialization['payload']
+ body_shape = member_shapes[payload_member_name]
+ if body_shape.serialization.get('eventstream'):
+ body = self._create_event_stream(response, body_shape)
+ final_parsed[payload_member_name] = body
+ elif body_shape.type_name in ['string', 'blob']:
+ # This is a stream
+ body = response['body']
+ if isinstance(body, bytes):
+ body = body.decode(self.DEFAULT_ENCODING)
+ final_parsed[payload_member_name] = body
+ else:
+ original_parsed = self._initial_body_parse(response['body'])
+ final_parsed[payload_member_name] = self._parse_shape(
+ body_shape, original_parsed
+ )
+ else:
+ original_parsed = self._initial_body_parse(response['body'])
+ body_parsed = self._parse_shape(shape, original_parsed)
+ final_parsed.update(body_parsed)
+
+ def _parse_non_payload_attrs(
+ self, response, shape, member_shapes, final_parsed
+ ):
+ headers = response['headers']
+ for name in member_shapes:
+ member_shape = member_shapes[name]
+ location = member_shape.serialization.get('location')
+ if location is None:
+ continue
+ elif location == 'statusCode':
+ final_parsed[name] = self._parse_shape(
+ member_shape, response['status_code']
+ )
+ elif location == 'headers':
+ final_parsed[name] = self._parse_header_map(
+ member_shape, headers
+ )
+ elif location == 'header':
+ header_name = member_shape.serialization.get('name', name)
+ if header_name in headers:
+ final_parsed[name] = self._parse_shape(
+ member_shape, headers[header_name]
+ )
+
+ def _parse_header_map(self, shape, headers):
+ # Note that headers are case insensitive, so we .lower()
+ # all header names and header prefixes.
+ parsed = {}
+ prefix = shape.serialization.get('name', '').lower()
+ for header_name in headers:
+ if header_name.lower().startswith(prefix):
+ # The key name inserted into the parsed hash
+ # strips off the prefix.
+ name = header_name[len(prefix) :]
+ parsed[name] = headers[header_name]
+ return parsed
+
+ def _initial_body_parse(self, body_contents):
+ # This method should do the initial xml/json parsing of the
+ # body. We still need to walk the parsed body in order
+ # to convert types, but this method will do the first round
+ # of parsing.
+ raise NotImplementedError("_initial_body_parse")
+
+ def _handle_string(self, shape, value):
+ parsed = value
+ if is_json_value_header(shape):
+ decoded = base64.b64decode(value).decode(self.DEFAULT_ENCODING)
+ parsed = json.loads(decoded)
+ return parsed
+
+ def _handle_list(self, shape, node):
+ location = shape.serialization.get('location')
+ if location == 'header' and not isinstance(node, list):
+ # List in headers may be a comma separated string as per RFC7230
+ node = [e.strip() for e in node.split(',')]
+ return super()._handle_list(shape, node)
+
+
+class BaseRpcV2Parser(ResponseParser):
+ def _do_parse(self, response, shape):
+ parsed = {}
+ if shape is not None:
+ event_stream_name = shape.event_stream_name
+ if event_stream_name:
+ parsed = self._handle_event_stream(
+ response, shape, event_stream_name
+ )
+ else:
+ parsed = {}
+ self._parse_payload(response, shape, parsed)
+ parsed['ResponseMetadata'] = self._populate_response_metadata(
+ response
+ )
+ return parsed
+
+ def _add_modeled_parse(self, response, shape, final_parsed):
+ if shape is None:
+ return final_parsed
+ self._parse_payload(response, shape, final_parsed)
+
+ def _do_modeled_error_parse(self, response, shape):
+ final_parsed = {}
+ self._add_modeled_parse(response, shape, final_parsed)
+ return final_parsed
+
+ def _populate_response_metadata(self, response):
+ metadata = {}
+ headers = response['headers']
+ if 'x-amzn-requestid' in headers:
+ metadata['RequestId'] = headers['x-amzn-requestid']
+ return metadata
+
+ def _handle_structure(self, shape, node):
+ parsed = {}
+ members = shape.members
+ if shape.is_tagged_union:
+ cleaned_value = node.copy()
+ cleaned_value.pop("__type", None)
+ cleaned_value = {
+ k: v for k, v in cleaned_value.items() if v is not None
+ }
+ if len(cleaned_value) != 1:
+ error_msg = (
+ "Invalid service response: %s must have one and only "
+ "one member set."
+ )
+ raise ResponseParserError(error_msg % shape.name)
+ for member_name in members:
+ member_shape = members[member_name]
+ member_node = node.get(member_name)
+ if member_node is not None:
+ parsed[member_name] = self._parse_shape(
+ member_shape, member_node
+ )
+ return parsed
+
+ def _parse_payload(self, response, shape, final_parsed):
+ original_parsed = self._initial_body_parse(response['body'])
+ body_parsed = self._parse_shape(shape, original_parsed)
+ final_parsed.update(body_parsed)
+
+ def _initial_body_parse(self, body_contents):
+ # This method should do the initial parsing of the
+ # body. We still need to walk the parsed body in order
+ # to convert types, but this method will do the first round
+ # of parsing.
+ raise NotImplementedError("_initial_body_parse")
+
+
+class RestJSONParser(BaseRestParser, BaseJSONParser):
+ EVENT_STREAM_PARSER_CLS = EventStreamJSONParser
+
+ def _initial_body_parse(self, body_contents):
+ return self._parse_body_as_json(body_contents)
+
+ def _do_error_parse(self, response, shape):
+ error = super()._do_error_parse(response, shape)
+ self._inject_error_code(error, response)
+ return error
+
+ def _inject_error_code(self, error, response):
+ # The "Code" value can come from either a response
+ # header or a value in the JSON body.
+ body = self._initial_body_parse(response['body'])
+ code = None
+ if 'x-amzn-errortype' in response['headers']:
+ code = response['headers']['x-amzn-errortype']
+ elif 'code' in body or 'Code' in body:
+ code = body.get('code', body.get('Code', ''))
+ if code is None:
+ return
+ if isinstance(code, str):
+ code = code.split(':', 1)[0].rsplit('#', 1)[-1]
+ error['Error']['Code'] = code
+
+ def _handle_boolean(self, shape, value):
+ return ensure_boolean(value)
+
+ def _handle_integer(self, shape, value):
+ return int(value)
+
+ def _handle_float(self, shape, value):
+ return float(value)
+
+ _handle_long = _handle_integer
+ _handle_double = _handle_float
+
+
+class RpcV2CBORParser(BaseRpcV2Parser, BaseCBORParser):
+ EVENT_STREAM_PARSER_CLS = EventStreamCBORParser
+
+ def _initial_body_parse(self, body_contents):
+ if body_contents == b'':
+ return body_contents
+ body_contents_stream = self.get_peekable_stream_from_bytes(
+ body_contents
+ )
+ return self.parse_data_item(body_contents_stream)
+
+ def _do_error_parse(self, response, shape):
+ body = self._initial_body_parse(response['body'])
+ error = {
+ "Error": {
+ "Message": body.get('message', body.get('Message', '')),
+ "Code": '',
+ },
+ "ResponseMetadata": {},
+ }
+ headers = response['headers']
+
+ code = body.get('__type')
+ if code is None:
+ response_code = response.get('status_code')
+ if response_code is not None:
+ code = str(response_code)
+ if code is not None:
+ if ':' in code:
+ code = code.split(':', 1)[0]
+ if '#' in code:
+ code = code.rsplit('#', 1)[1]
+ if 'x-amzn-query-error' in headers:
+ code = self._do_query_compatible_error_parse(
+ code, headers, error
+ )
+ error['Error']['Code'] = code
+ if 'x-amzn-requestid' in headers:
+ error.setdefault('ResponseMetadata', {})['RequestId'] = headers[
+ 'x-amzn-requestid'
+ ]
+ return error
+
+ def _handle_event_stream(self, response, shape, event_name):
+ event_stream_shape = shape.members[event_name]
+ event_stream = self._create_event_stream(response, event_stream_shape)
+ try:
+ event = event_stream.get_initial_response()
+ except NoInitialResponseError:
+ error_msg = 'First event was not of type initial-response'
+ raise ResponseParserError(error_msg)
+ parsed = self._initial_body_parse(event.payload)
+ parsed[event_name] = event_stream
+ return parsed
+
+
+class RestXMLParser(BaseRestParser, BaseXMLResponseParser):
+ EVENT_STREAM_PARSER_CLS = EventStreamXMLParser
+
+ def _initial_body_parse(self, xml_string):
+ if not xml_string:
+ return ETree.Element('')
+ return self._parse_xml_string_to_dom(xml_string)
+
+ def _do_error_parse(self, response, shape):
+ # We're trying to be service agnostic here, but S3 does have a slightly
+ # different response structure for its errors compared to other
+ # rest-xml serivces (route53/cloudfront). We handle this by just
+ # trying to parse both forms.
+ # First:
+ # <ErrorResponse xmlns="...">
+ # <Error>
+ # <Type>Sender</Type>
+ # <Code>InvalidInput</Code>
+ # <Message>Invalid resource type: foo</Message>
+ # </Error>
+ # <RequestId>request-id</RequestId>
+ # </ErrorResponse>
+ if response['body']:
+ # If the body ends up being invalid xml, the xml parser should not
+ # blow up. It should at least try to pull information about the
+ # the error response from other sources like the HTTP status code.
+ try:
+ return self._parse_error_from_body(response)
+ except ResponseParserError:
+ LOG.debug(
+ 'Exception caught when parsing error response body:',
+ exc_info=True,
+ )
+ return self._parse_error_from_http_status(response)
+
+ def _parse_error_from_http_status(self, response):
+ return {
+ 'Error': {
+ 'Code': str(response['status_code']),
+ 'Message': http.client.responses.get(
+ response['status_code'], ''
+ ),
+ },
+ 'ResponseMetadata': {
+ 'RequestId': response['headers'].get('x-amz-request-id', ''),
+ 'HostId': response['headers'].get('x-amz-id-2', ''),
+ },
+ }
+
+ def _parse_error_from_body(self, response):
+ xml_contents = response['body']
+ root = self._parse_xml_string_to_dom(xml_contents)
+ parsed = self._build_name_to_xml_node(root)
+ self._replace_nodes(parsed)
+ if root.tag == 'Error':
+ # This is an S3 error response. First we'll populate the
+ # response metadata.
+ metadata = self._populate_response_metadata(response)
+ # The RequestId and the HostId are already in the
+ # ResponseMetadata, but are also duplicated in the XML
+ # body. We don't need these values in both places,
+ # we'll just remove them from the parsed XML body.
+ parsed.pop('RequestId', '')
+ parsed.pop('HostId', '')
+ return {'Error': parsed, 'ResponseMetadata': metadata}
+ elif 'RequestId' in parsed:
+ # Other rest-xml services:
+ parsed['ResponseMetadata'] = {'RequestId': parsed.pop('RequestId')}
+ default = {'Error': {'Message': '', 'Code': ''}}
+ merge_dicts(default, parsed)
+ return default
+
+ @_text_content
+ def _handle_string(self, shape, text):
+ text = super()._handle_string(shape, text)
+ return text
+
+
+PROTOCOL_PARSERS = {
+ 'ec2': EC2QueryParser,
+ 'query': QueryParser,
+ 'json': JSONParser,
+ 'rest-json': RestJSONParser,
+ 'rest-xml': RestXMLParser,
+ 'smithy-rpc-v2-cbor': RpcV2CBORParser,
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/regions.py b/.venv/lib/python3.12/site-packages/botocore/regions.py
new file mode 100644
index 00000000..4d0fc8ba
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/regions.py
@@ -0,0 +1,856 @@
+# Copyright 2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+"""Resolves regions and endpoints.
+
+This module implements endpoint resolution, including resolving endpoints for a
+given service and region and resolving the available endpoints for a service
+in a specific AWS partition.
+"""
+
+import copy
+import logging
+import re
+from enum import Enum
+
+import jmespath
+
+from botocore import UNSIGNED, xform_name
+from botocore.auth import AUTH_TYPE_MAPS, HAS_CRT
+from botocore.crt import CRT_SUPPORTED_AUTH_TYPES
+from botocore.endpoint_provider import EndpointProvider
+from botocore.exceptions import (
+ EndpointProviderError,
+ EndpointVariantError,
+ InvalidEndpointConfigurationError,
+ InvalidHostLabelError,
+ MissingDependencyException,
+ NoRegionError,
+ ParamValidationError,
+ UnknownEndpointResolutionBuiltInName,
+ UnknownRegionError,
+ UnknownSignatureVersionError,
+ UnsupportedS3AccesspointConfigurationError,
+ UnsupportedS3ConfigurationError,
+ UnsupportedS3ControlArnError,
+ UnsupportedS3ControlConfigurationError,
+)
+from botocore.utils import ensure_boolean, instance_cache
+
+LOG = logging.getLogger(__name__)
+DEFAULT_URI_TEMPLATE = '{service}.{region}.{dnsSuffix}' # noqa
+DEFAULT_SERVICE_DATA = {'endpoints': {}}
+
+
+class BaseEndpointResolver:
+ """Resolves regions and endpoints. Must be subclassed."""
+
+ def construct_endpoint(self, service_name, region_name=None):
+ """Resolves an endpoint for a service and region combination.
+
+ :type service_name: string
+ :param service_name: Name of the service to resolve an endpoint for
+ (e.g., s3)
+
+ :type region_name: string
+ :param region_name: Region/endpoint name to resolve (e.g., us-east-1)
+ if no region is provided, the first found partition-wide endpoint
+ will be used if available.
+
+ :rtype: dict
+ :return: Returns a dict containing the following keys:
+ - partition: (string, required) Resolved partition name
+ - endpointName: (string, required) Resolved endpoint name
+ - hostname: (string, required) Hostname to use for this endpoint
+ - sslCommonName: (string) sslCommonName to use for this endpoint.
+ - credentialScope: (dict) Signature version 4 credential scope
+ - region: (string) region name override when signing.
+ - service: (string) service name override when signing.
+ - signatureVersions: (list<string>) A list of possible signature
+ versions, including s3, v4, v2, and s3v4
+ - protocols: (list<string>) A list of supported protocols
+ (e.g., http, https)
+ - ...: Other keys may be included as well based on the metadata
+ """
+ raise NotImplementedError
+
+ def get_available_partitions(self):
+ """Lists the partitions available to the endpoint resolver.
+
+ :return: Returns a list of partition names (e.g., ["aws", "aws-cn"]).
+ """
+ raise NotImplementedError
+
+ def get_available_endpoints(
+ self, service_name, partition_name='aws', allow_non_regional=False
+ ):
+ """Lists the endpoint names of a particular partition.
+
+ :type service_name: string
+ :param service_name: Name of a service to list endpoint for (e.g., s3)
+
+ :type partition_name: string
+ :param partition_name: Name of the partition to limit endpoints to.
+ (e.g., aws for the public AWS endpoints, aws-cn for AWS China
+ endpoints, aws-us-gov for AWS GovCloud (US) Endpoints, etc.
+
+ :type allow_non_regional: bool
+ :param allow_non_regional: Set to True to include endpoints that are
+ not regional endpoints (e.g., s3-external-1,
+ fips-us-gov-west-1, etc).
+ :return: Returns a list of endpoint names (e.g., ["us-east-1"]).
+ """
+ raise NotImplementedError
+
+
+class EndpointResolver(BaseEndpointResolver):
+ """Resolves endpoints based on partition endpoint metadata"""
+
+ _UNSUPPORTED_DUALSTACK_PARTITIONS = ['aws-iso', 'aws-iso-b']
+
+ def __init__(self, endpoint_data, uses_builtin_data=False):
+ """
+ :type endpoint_data: dict
+ :param endpoint_data: A dict of partition data.
+
+ :type uses_builtin_data: boolean
+ :param uses_builtin_data: Whether the endpoint data originates in the
+ package's data directory.
+ """
+ if 'partitions' not in endpoint_data:
+ raise ValueError('Missing "partitions" in endpoint data')
+ self._endpoint_data = endpoint_data
+ self.uses_builtin_data = uses_builtin_data
+
+ def get_service_endpoints_data(self, service_name, partition_name='aws'):
+ for partition in self._endpoint_data['partitions']:
+ if partition['partition'] != partition_name:
+ continue
+ services = partition['services']
+ if service_name not in services:
+ continue
+ return services[service_name]['endpoints']
+
+ def get_available_partitions(self):
+ result = []
+ for partition in self._endpoint_data['partitions']:
+ result.append(partition['partition'])
+ return result
+
+ def get_available_endpoints(
+ self,
+ service_name,
+ partition_name='aws',
+ allow_non_regional=False,
+ endpoint_variant_tags=None,
+ ):
+ result = []
+ for partition in self._endpoint_data['partitions']:
+ if partition['partition'] != partition_name:
+ continue
+ services = partition['services']
+ if service_name not in services:
+ continue
+ service_endpoints = services[service_name]['endpoints']
+ for endpoint_name in service_endpoints:
+ is_regional_endpoint = endpoint_name in partition['regions']
+ # Only regional endpoints can be modeled with variants
+ if endpoint_variant_tags and is_regional_endpoint:
+ variant_data = self._retrieve_variant_data(
+ service_endpoints[endpoint_name], endpoint_variant_tags
+ )
+ if variant_data:
+ result.append(endpoint_name)
+ elif allow_non_regional or is_regional_endpoint:
+ result.append(endpoint_name)
+ return result
+
+ def get_partition_dns_suffix(
+ self, partition_name, endpoint_variant_tags=None
+ ):
+ for partition in self._endpoint_data['partitions']:
+ if partition['partition'] == partition_name:
+ if endpoint_variant_tags:
+ variant = self._retrieve_variant_data(
+ partition.get('defaults'), endpoint_variant_tags
+ )
+ if variant and 'dnsSuffix' in variant:
+ return variant['dnsSuffix']
+ else:
+ return partition['dnsSuffix']
+ return None
+
+ def construct_endpoint(
+ self,
+ service_name,
+ region_name=None,
+ partition_name=None,
+ use_dualstack_endpoint=False,
+ use_fips_endpoint=False,
+ ):
+ if (
+ service_name == 's3'
+ and use_dualstack_endpoint
+ and region_name is None
+ ):
+ region_name = 'us-east-1'
+
+ if partition_name is not None:
+ valid_partition = None
+ for partition in self._endpoint_data['partitions']:
+ if partition['partition'] == partition_name:
+ valid_partition = partition
+
+ if valid_partition is not None:
+ result = self._endpoint_for_partition(
+ valid_partition,
+ service_name,
+ region_name,
+ use_dualstack_endpoint,
+ use_fips_endpoint,
+ True,
+ )
+ return result
+ return None
+
+ # Iterate over each partition until a match is found.
+ for partition in self._endpoint_data['partitions']:
+ if use_dualstack_endpoint and (
+ partition['partition']
+ in self._UNSUPPORTED_DUALSTACK_PARTITIONS
+ ):
+ continue
+ result = self._endpoint_for_partition(
+ partition,
+ service_name,
+ region_name,
+ use_dualstack_endpoint,
+ use_fips_endpoint,
+ )
+ if result:
+ return result
+
+ def get_partition_for_region(self, region_name):
+ for partition in self._endpoint_data['partitions']:
+ if self._region_match(partition, region_name):
+ return partition['partition']
+ raise UnknownRegionError(
+ region_name=region_name,
+ error_msg='No partition found for provided region_name.',
+ )
+
+ def _endpoint_for_partition(
+ self,
+ partition,
+ service_name,
+ region_name,
+ use_dualstack_endpoint,
+ use_fips_endpoint,
+ force_partition=False,
+ ):
+ partition_name = partition["partition"]
+ if (
+ use_dualstack_endpoint
+ and partition_name in self._UNSUPPORTED_DUALSTACK_PARTITIONS
+ ):
+ error_msg = (
+ "Dualstack endpoints are currently not supported"
+ f" for {partition_name} partition"
+ )
+ raise EndpointVariantError(tags=['dualstack'], error_msg=error_msg)
+
+ # Get the service from the partition, or an empty template.
+ service_data = partition['services'].get(
+ service_name, DEFAULT_SERVICE_DATA
+ )
+ # Use the partition endpoint if no region is supplied.
+ if region_name is None:
+ if 'partitionEndpoint' in service_data:
+ region_name = service_data['partitionEndpoint']
+ else:
+ raise NoRegionError()
+
+ resolve_kwargs = {
+ 'partition': partition,
+ 'service_name': service_name,
+ 'service_data': service_data,
+ 'endpoint_name': region_name,
+ 'use_dualstack_endpoint': use_dualstack_endpoint,
+ 'use_fips_endpoint': use_fips_endpoint,
+ }
+
+ # Attempt to resolve the exact region for this partition.
+ if region_name in service_data['endpoints']:
+ return self._resolve(**resolve_kwargs)
+
+ # Check to see if the endpoint provided is valid for the partition.
+ if self._region_match(partition, region_name) or force_partition:
+ # Use the partition endpoint if set and not regionalized.
+ partition_endpoint = service_data.get('partitionEndpoint')
+ is_regionalized = service_data.get('isRegionalized', True)
+ if partition_endpoint and not is_regionalized:
+ LOG.debug(
+ 'Using partition endpoint for %s, %s: %s',
+ service_name,
+ region_name,
+ partition_endpoint,
+ )
+ resolve_kwargs['endpoint_name'] = partition_endpoint
+ return self._resolve(**resolve_kwargs)
+ LOG.debug(
+ 'Creating a regex based endpoint for %s, %s',
+ service_name,
+ region_name,
+ )
+ return self._resolve(**resolve_kwargs)
+
+ def _region_match(self, partition, region_name):
+ if region_name in partition['regions']:
+ return True
+ if 'regionRegex' in partition:
+ return re.compile(partition['regionRegex']).match(region_name)
+ return False
+
+ def _retrieve_variant_data(self, endpoint_data, tags):
+ variants = endpoint_data.get('variants', [])
+ for variant in variants:
+ if set(variant['tags']) == set(tags):
+ result = variant.copy()
+ return result
+
+ def _create_tag_list(self, use_dualstack_endpoint, use_fips_endpoint):
+ tags = []
+ if use_dualstack_endpoint:
+ tags.append('dualstack')
+ if use_fips_endpoint:
+ tags.append('fips')
+ return tags
+
+ def _resolve_variant(
+ self, tags, endpoint_data, service_defaults, partition_defaults
+ ):
+ result = {}
+ for variants in [endpoint_data, service_defaults, partition_defaults]:
+ variant = self._retrieve_variant_data(variants, tags)
+ if variant:
+ self._merge_keys(variant, result)
+ return result
+
+ def _resolve(
+ self,
+ partition,
+ service_name,
+ service_data,
+ endpoint_name,
+ use_dualstack_endpoint,
+ use_fips_endpoint,
+ ):
+ endpoint_data = service_data.get('endpoints', {}).get(
+ endpoint_name, {}
+ )
+
+ if endpoint_data.get('deprecated'):
+ LOG.warning(
+ f'Client is configured with the deprecated endpoint: {endpoint_name}'
+ )
+
+ service_defaults = service_data.get('defaults', {})
+ partition_defaults = partition.get('defaults', {})
+ tags = self._create_tag_list(use_dualstack_endpoint, use_fips_endpoint)
+
+ if tags:
+ result = self._resolve_variant(
+ tags, endpoint_data, service_defaults, partition_defaults
+ )
+ if result == {}:
+ error_msg = (
+ f"Endpoint does not exist for {service_name} "
+ f"in region {endpoint_name}"
+ )
+ raise EndpointVariantError(tags=tags, error_msg=error_msg)
+ self._merge_keys(endpoint_data, result)
+ else:
+ result = endpoint_data
+
+ # If dnsSuffix has not already been consumed from a variant definition
+ if 'dnsSuffix' not in result:
+ result['dnsSuffix'] = partition['dnsSuffix']
+
+ result['partition'] = partition['partition']
+ result['endpointName'] = endpoint_name
+
+ # Merge in the service defaults then the partition defaults.
+ self._merge_keys(service_defaults, result)
+ self._merge_keys(partition_defaults, result)
+
+ result['hostname'] = self._expand_template(
+ partition,
+ result['hostname'],
+ service_name,
+ endpoint_name,
+ result['dnsSuffix'],
+ )
+ if 'sslCommonName' in result:
+ result['sslCommonName'] = self._expand_template(
+ partition,
+ result['sslCommonName'],
+ service_name,
+ endpoint_name,
+ result['dnsSuffix'],
+ )
+
+ return result
+
+ def _merge_keys(self, from_data, result):
+ for key in from_data:
+ if key not in result:
+ result[key] = from_data[key]
+
+ def _expand_template(
+ self, partition, template, service_name, endpoint_name, dnsSuffix
+ ):
+ return template.format(
+ service=service_name, region=endpoint_name, dnsSuffix=dnsSuffix
+ )
+
+
+class EndpointResolverBuiltins(str, Enum):
+ # The AWS Region configured for the SDK client (str)
+ AWS_REGION = "AWS::Region"
+ # Whether the UseFIPSEndpoint configuration option has been enabled for
+ # the SDK client (bool)
+ AWS_USE_FIPS = "AWS::UseFIPS"
+ # Whether the UseDualStackEndpoint configuration option has been enabled
+ # for the SDK client (bool)
+ AWS_USE_DUALSTACK = "AWS::UseDualStack"
+ # Whether the global endpoint should be used with STS, rather than the
+ # regional endpoint for us-east-1 (bool)
+ AWS_STS_USE_GLOBAL_ENDPOINT = "AWS::STS::UseGlobalEndpoint"
+ # Whether the global endpoint should be used with S3, rather than the
+ # regional endpoint for us-east-1 (bool)
+ AWS_S3_USE_GLOBAL_ENDPOINT = "AWS::S3::UseGlobalEndpoint"
+ # Whether S3 Transfer Acceleration has been requested (bool)
+ AWS_S3_ACCELERATE = "AWS::S3::Accelerate"
+ # Whether S3 Force Path Style has been enabled (bool)
+ AWS_S3_FORCE_PATH_STYLE = "AWS::S3::ForcePathStyle"
+ # Whether to use the ARN region or raise an error when ARN and client
+ # region differ (for s3 service only, bool)
+ AWS_S3_USE_ARN_REGION = "AWS::S3::UseArnRegion"
+ # Whether to use the ARN region or raise an error when ARN and client
+ # region differ (for s3-control service only, bool)
+ AWS_S3CONTROL_USE_ARN_REGION = 'AWS::S3Control::UseArnRegion'
+ # Whether multi-region access points (MRAP) should be disabled (bool)
+ AWS_S3_DISABLE_MRAP = "AWS::S3::DisableMultiRegionAccessPoints"
+ # Whether a custom endpoint has been configured (str)
+ SDK_ENDPOINT = "SDK::Endpoint"
+ # An AWS account ID that can be optionally configured for the SDK client (str)
+ ACCOUNT_ID = "AWS::Auth::AccountId"
+ # Whether an endpoint should include an account ID (str)
+ ACCOUNT_ID_ENDPOINT_MODE = "AWS::Auth::AccountIdEndpointMode"
+
+
+class EndpointRulesetResolver:
+ """Resolves endpoints using a service's endpoint ruleset"""
+
+ def __init__(
+ self,
+ endpoint_ruleset_data,
+ partition_data,
+ service_model,
+ builtins,
+ client_context,
+ event_emitter,
+ use_ssl=True,
+ requested_auth_scheme=None,
+ ):
+ self._provider = EndpointProvider(
+ ruleset_data=endpoint_ruleset_data,
+ partition_data=partition_data,
+ )
+ self._param_definitions = self._provider.ruleset.parameters
+ self._service_model = service_model
+ self._builtins = builtins
+ self._client_context = client_context
+ self._event_emitter = event_emitter
+ self._use_ssl = use_ssl
+ self._requested_auth_scheme = requested_auth_scheme
+ self._instance_cache = {}
+
+ def construct_endpoint(
+ self,
+ operation_model,
+ call_args,
+ request_context,
+ ):
+ """Invokes the provider with params defined in the service's ruleset"""
+ if call_args is None:
+ call_args = {}
+
+ if request_context is None:
+ request_context = {}
+
+ provider_params = self._get_provider_params(
+ operation_model, call_args, request_context
+ )
+ LOG.debug(
+ f'Calling endpoint provider with parameters: {provider_params}'
+ )
+ try:
+ provider_result = self._provider.resolve_endpoint(
+ **provider_params
+ )
+ except EndpointProviderError as ex:
+ botocore_exception = self.ruleset_error_to_botocore_exception(
+ ex, provider_params
+ )
+ if botocore_exception is None:
+ raise
+ else:
+ raise botocore_exception from ex
+ LOG.debug(f'Endpoint provider result: {provider_result.url}')
+
+ # The endpoint provider does not support non-secure transport.
+ if not self._use_ssl and provider_result.url.startswith('https://'):
+ provider_result = provider_result._replace(
+ url=f'http://{provider_result.url[8:]}'
+ )
+
+ # Multi-valued headers are not supported in botocore. Replace the list
+ # of values returned for each header with just its first entry,
+ # dropping any additionally entries.
+ provider_result = provider_result._replace(
+ headers={
+ key: val[0] for key, val in provider_result.headers.items()
+ }
+ )
+
+ return provider_result
+
+ def _get_provider_params(
+ self, operation_model, call_args, request_context
+ ):
+ """Resolve a value for each parameter defined in the service's ruleset
+
+ The resolution order for parameter values is:
+ 1. Operation-specific static context values from the service definition
+ 2. Operation-specific dynamic context values from API parameters
+ 3. Client-specific context parameters
+ 4. Built-in values such as region, FIPS usage, ...
+ """
+ provider_params = {}
+ # Builtin values can be customized for each operation by hooks
+ # subscribing to the ``before-endpoint-resolution.*`` event.
+ customized_builtins = self._get_customized_builtins(
+ operation_model, call_args, request_context
+ )
+ for param_name, param_def in self._param_definitions.items():
+ param_val = self._resolve_param_from_context(
+ param_name=param_name,
+ operation_model=operation_model,
+ call_args=call_args,
+ )
+ if param_val is None and param_def.builtin is not None:
+ param_val = self._resolve_param_as_builtin(
+ builtin_name=param_def.builtin,
+ builtins=customized_builtins,
+ )
+ if param_val is not None:
+ provider_params[param_name] = param_val
+
+ return provider_params
+
+ def _resolve_param_from_context(
+ self, param_name, operation_model, call_args
+ ):
+ static = self._resolve_param_as_static_context_param(
+ param_name, operation_model
+ )
+ if static is not None:
+ return static
+ dynamic = self._resolve_param_as_dynamic_context_param(
+ param_name, operation_model, call_args
+ )
+ if dynamic is not None:
+ return dynamic
+ operation_context_params = (
+ self._resolve_param_as_operation_context_param(
+ param_name, operation_model, call_args
+ )
+ )
+ if operation_context_params is not None:
+ return operation_context_params
+ return self._resolve_param_as_client_context_param(param_name)
+
+ def _resolve_param_as_static_context_param(
+ self, param_name, operation_model
+ ):
+ static_ctx_params = self._get_static_context_params(operation_model)
+ return static_ctx_params.get(param_name)
+
+ def _resolve_param_as_dynamic_context_param(
+ self, param_name, operation_model, call_args
+ ):
+ dynamic_ctx_params = self._get_dynamic_context_params(operation_model)
+ if param_name in dynamic_ctx_params:
+ member_name = dynamic_ctx_params[param_name]
+ return call_args.get(member_name)
+
+ def _resolve_param_as_client_context_param(self, param_name):
+ client_ctx_params = self._get_client_context_params()
+ if param_name in client_ctx_params:
+ client_ctx_varname = client_ctx_params[param_name]
+ return self._client_context.get(client_ctx_varname)
+
+ def _resolve_param_as_operation_context_param(
+ self, param_name, operation_model, call_args
+ ):
+ operation_ctx_params = operation_model.operation_context_parameters
+ if param_name in operation_ctx_params:
+ path = operation_ctx_params[param_name]['path']
+ return jmespath.search(path, call_args)
+
+ def _resolve_param_as_builtin(self, builtin_name, builtins):
+ if builtin_name not in EndpointResolverBuiltins.__members__.values():
+ raise UnknownEndpointResolutionBuiltInName(name=builtin_name)
+ builtin = builtins.get(builtin_name)
+ if callable(builtin):
+ return builtin()
+ return builtin
+
+ @instance_cache
+ def _get_static_context_params(self, operation_model):
+ """Mapping of param names to static param value for an operation"""
+ return {
+ param.name: param.value
+ for param in operation_model.static_context_parameters
+ }
+
+ @instance_cache
+ def _get_dynamic_context_params(self, operation_model):
+ """Mapping of param names to member names for an operation"""
+ return {
+ param.name: param.member_name
+ for param in operation_model.context_parameters
+ }
+
+ @instance_cache
+ def _get_client_context_params(self):
+ """Mapping of param names to client configuration variable"""
+ return {
+ param.name: xform_name(param.name)
+ for param in self._service_model.client_context_parameters
+ }
+
+ def _get_customized_builtins(
+ self, operation_model, call_args, request_context
+ ):
+ service_id = self._service_model.service_id.hyphenize()
+ customized_builtins = copy.copy(self._builtins)
+ # Handlers are expected to modify the builtins dict in place.
+ self._event_emitter.emit(
+ f'before-endpoint-resolution.{service_id}',
+ builtins=customized_builtins,
+ model=operation_model,
+ params=call_args,
+ context=request_context,
+ )
+ return customized_builtins
+
+ def auth_schemes_to_signing_ctx(self, auth_schemes):
+ """Convert an Endpoint's authSchemes property to a signing_context dict
+
+ :type auth_schemes: list
+ :param auth_schemes: A list of dictionaries taken from the
+ ``authSchemes`` property of an Endpoint object returned by
+ ``EndpointProvider``.
+
+ :rtype: str, dict
+ :return: Tuple of auth type string (to be used in
+ ``request_context['auth_type']``) and signing context dict (for use
+ in ``request_context['signing']``).
+ """
+ if not isinstance(auth_schemes, list) or len(auth_schemes) == 0:
+ raise TypeError("auth_schemes must be a non-empty list.")
+
+ LOG.debug(
+ 'Selecting from endpoint provider\'s list of auth schemes: %s. '
+ 'User selected auth scheme is: "%s"',
+ ', '.join([f'"{s.get("name")}"' for s in auth_schemes]),
+ self._requested_auth_scheme,
+ )
+
+ if self._requested_auth_scheme == UNSIGNED:
+ return 'none', {}
+
+ auth_schemes = [
+ {**scheme, 'name': self._strip_sig_prefix(scheme['name'])}
+ for scheme in auth_schemes
+ ]
+ if self._requested_auth_scheme is not None:
+ try:
+ # Use the first scheme that matches the requested scheme,
+ # after accounting for naming differences between botocore and
+ # endpoint rulesets. Keep the requested name.
+ name, scheme = next(
+ (self._requested_auth_scheme, s)
+ for s in auth_schemes
+ if self._does_botocore_authname_match_ruleset_authname(
+ self._requested_auth_scheme, s['name']
+ )
+ )
+ except StopIteration:
+ # For legacy signers, no match will be found. Do not raise an
+ # exception, instead default to the logic in botocore
+ # customizations.
+ return None, {}
+ else:
+ try:
+ name, scheme = next(
+ (s['name'], s)
+ for s in auth_schemes
+ if s['name'] in AUTH_TYPE_MAPS
+ )
+ except StopIteration:
+ # If no auth scheme was specifically requested and an
+ # authSchemes list is present in the Endpoint object but none
+ # of the entries are supported, raise an exception.
+ fixable_with_crt = False
+ auth_type_options = [s['name'] for s in auth_schemes]
+ if not HAS_CRT:
+ fixable_with_crt = any(
+ scheme in CRT_SUPPORTED_AUTH_TYPES
+ for scheme in auth_type_options
+ )
+
+ if fixable_with_crt:
+ raise MissingDependencyException(
+ msg='This operation requires an additional dependency.'
+ ' Use pip install botocore[crt] before proceeding.'
+ )
+ else:
+ raise UnknownSignatureVersionError(
+ signature_version=', '.join(auth_type_options)
+ )
+
+ signing_context = {}
+ if 'signingRegion' in scheme:
+ signing_context['region'] = scheme['signingRegion']
+ elif 'signingRegionSet' in scheme:
+ if len(scheme['signingRegionSet']) > 0:
+ signing_context['region'] = ','.join(
+ scheme['signingRegionSet']
+ )
+ if 'signingName' in scheme:
+ signing_context.update(signing_name=scheme['signingName'])
+ if 'disableDoubleEncoding' in scheme:
+ signing_context['disableDoubleEncoding'] = ensure_boolean(
+ scheme['disableDoubleEncoding']
+ )
+
+ LOG.debug(
+ 'Selected auth type "%s" as "%s" with signing context params: %s',
+ scheme['name'], # original name without "sig"
+ name, # chosen name can differ when `signature_version` is set
+ signing_context,
+ )
+ return name, signing_context
+
+ def _strip_sig_prefix(self, auth_name):
+ """Normalize auth type names by removing any "sig" prefix"""
+ return auth_name[3:] if auth_name.startswith('sig') else auth_name
+
+ def _does_botocore_authname_match_ruleset_authname(self, botoname, rsname):
+ """
+ Whether a valid string provided as signature_version parameter for
+ client construction refers to the same auth methods as a string
+ returned by the endpoint ruleset provider. This accounts for:
+
+ * The ruleset prefixes auth names with "sig"
+ * The s3 and s3control rulesets don't distinguish between v4[a] and
+ s3v4[a] signers
+ * The v2, v3, and HMAC v1 based signers (s3, s3-*) are botocore legacy
+ features and do not exist in the rulesets
+ * Only characters up to the first dash are considered
+
+ Example matches:
+ * v4, sigv4
+ * v4, v4
+ * s3v4, sigv4
+ * s3v7, sigv7 (hypothetical example)
+ * s3v4a, sigv4a
+ * s3v4-query, sigv4
+
+ Example mismatches:
+ * v4a, sigv4
+ * s3, sigv4
+ * s3-presign-post, sigv4
+ """
+ rsname = self._strip_sig_prefix(rsname)
+ botoname = botoname.split('-')[0]
+ if botoname != 's3' and botoname.startswith('s3'):
+ botoname = botoname[2:]
+ return rsname == botoname
+
+ def ruleset_error_to_botocore_exception(self, ruleset_exception, params):
+ """Attempts to translate ruleset errors to pre-existing botocore
+ exception types by string matching exception strings.
+ """
+ msg = ruleset_exception.kwargs.get('msg')
+ if msg is None:
+ return
+
+ if msg.startswith('Invalid region in ARN: '):
+ # Example message:
+ # "Invalid region in ARN: `us-we$t-2` (invalid DNS name)"
+ try:
+ label = msg.split('`')[1]
+ except IndexError:
+ label = msg
+ return InvalidHostLabelError(label=label)
+
+ service_name = self._service_model.service_name
+ if service_name == 's3':
+ if (
+ msg == 'S3 Object Lambda does not support S3 Accelerate'
+ or msg == 'Accelerate cannot be used with FIPS'
+ ):
+ return UnsupportedS3ConfigurationError(msg=msg)
+ if (
+ msg.startswith('S3 Outposts does not support')
+ or msg.startswith('S3 MRAP does not support')
+ or msg.startswith('S3 Object Lambda does not support')
+ or msg.startswith('Access Points do not support')
+ or msg.startswith('Invalid configuration:')
+ or msg.startswith('Client was configured for partition')
+ ):
+ return UnsupportedS3AccesspointConfigurationError(msg=msg)
+ if msg.lower().startswith('invalid arn:'):
+ return ParamValidationError(report=msg)
+ if service_name == 's3control':
+ if msg.startswith('Invalid ARN:'):
+ arn = params.get('Bucket')
+ return UnsupportedS3ControlArnError(arn=arn, msg=msg)
+ if msg.startswith('Invalid configuration:') or msg.startswith(
+ 'Client was configured for partition'
+ ):
+ return UnsupportedS3ControlConfigurationError(msg=msg)
+ if msg == "AccountId is required but not set":
+ return ParamValidationError(report=msg)
+ if service_name == 'events':
+ if msg.startswith(
+ 'Invalid Configuration: FIPS is not supported with '
+ 'EventBridge multi-region endpoints.'
+ ):
+ return InvalidEndpointConfigurationError(msg=msg)
+ if msg == 'EndpointId must be a valid host label.':
+ return InvalidEndpointConfigurationError(msg=msg)
+ return None
diff --git a/.venv/lib/python3.12/site-packages/botocore/response.py b/.venv/lib/python3.12/site-packages/botocore/response.py
new file mode 100644
index 00000000..ba3fac9b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/response.py
@@ -0,0 +1,201 @@
+# Copyright (c) 2012-2013 Mitch Garnaat http://garnaat.org/
+# Copyright 2012-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+
+import logging
+from io import IOBase
+
+from urllib3.exceptions import ProtocolError as URLLib3ProtocolError
+from urllib3.exceptions import ReadTimeoutError as URLLib3ReadTimeoutError
+
+from botocore import parsers
+from botocore.compat import set_socket_timeout
+from botocore.exceptions import (
+ IncompleteReadError,
+ ReadTimeoutError,
+ ResponseStreamingError,
+)
+
+# Keep these imported. There's pre-existing code that uses them.
+from botocore import ScalarTypes # noqa
+from botocore.compat import XMLParseError # noqa
+from botocore.hooks import first_non_none_response # noqa
+
+
+logger = logging.getLogger(__name__)
+
+
+class StreamingBody(IOBase):
+ """Wrapper class for an http response body.
+
+ This provides a few additional conveniences that do not exist
+ in the urllib3 model:
+
+ * Set the timeout on the socket (i.e read() timeouts)
+ * Auto validation of content length, if the amount of bytes
+ we read does not match the content length, an exception
+ is raised.
+
+ """
+
+ _DEFAULT_CHUNK_SIZE = 1024
+
+ def __init__(self, raw_stream, content_length):
+ self._raw_stream = raw_stream
+ self._content_length = content_length
+ self._amount_read = 0
+
+ def __del__(self):
+ # Extending destructor in order to preserve the underlying raw_stream.
+ # The ability to add custom cleanup logic introduced in Python3.4+.
+ # https://www.python.org/dev/peps/pep-0442/
+ pass
+
+ def set_socket_timeout(self, timeout):
+ """Set the timeout seconds on the socket."""
+ # The problem we're trying to solve is to prevent .read() calls from
+ # hanging. This can happen in rare cases. What we'd like to ideally
+ # do is set a timeout on the .read() call so that callers can retry
+ # the request.
+ # Unfortunately, this isn't currently possible in requests.
+ # See: https://github.com/kennethreitz/requests/issues/1803
+ # So what we're going to do is reach into the guts of the stream and
+ # grab the socket object, which we can set the timeout on. We're
+ # putting in a check here so in case this interface goes away, we'll
+ # know.
+ try:
+ set_socket_timeout(self._raw_stream, timeout)
+ except AttributeError:
+ logger.error(
+ "Cannot access the socket object of "
+ "a streaming response. It's possible "
+ "the interface has changed.",
+ exc_info=True,
+ )
+ raise
+
+ def readable(self):
+ try:
+ return self._raw_stream.readable()
+ except AttributeError:
+ return False
+
+ def read(self, amt=None):
+ """Read at most amt bytes from the stream.
+
+ If the amt argument is omitted, read all data.
+ """
+ try:
+ chunk = self._raw_stream.read(amt)
+ except URLLib3ReadTimeoutError as e:
+ # TODO: the url will be None as urllib3 isn't setting it yet
+ raise ReadTimeoutError(endpoint_url=e.url, error=e)
+ except URLLib3ProtocolError as e:
+ raise ResponseStreamingError(error=e)
+ self._amount_read += len(chunk)
+ if amt is None or (not chunk and amt > 0):
+ # If the server sends empty contents or
+ # we ask to read all of the contents, then we know
+ # we need to verify the content length.
+ self._verify_content_length()
+ return chunk
+
+ def readlines(self):
+ return self._raw_stream.readlines()
+
+ def __iter__(self):
+ """Return an iterator to yield 1k chunks from the raw stream."""
+ return self.iter_chunks(self._DEFAULT_CHUNK_SIZE)
+
+ def __next__(self):
+ """Return the next 1k chunk from the raw stream."""
+ current_chunk = self.read(self._DEFAULT_CHUNK_SIZE)
+ if current_chunk:
+ return current_chunk
+ raise StopIteration()
+
+ def __enter__(self):
+ return self._raw_stream
+
+ def __exit__(self, type, value, traceback):
+ self._raw_stream.close()
+
+ next = __next__
+
+ def iter_lines(self, chunk_size=_DEFAULT_CHUNK_SIZE, keepends=False):
+ """Return an iterator to yield lines from the raw stream.
+
+ This is achieved by reading chunk of bytes (of size chunk_size) at a
+ time from the raw stream, and then yielding lines from there.
+ """
+ pending = b''
+ for chunk in self.iter_chunks(chunk_size):
+ lines = (pending + chunk).splitlines(True)
+ for line in lines[:-1]:
+ yield line.splitlines(keepends)[0]
+ pending = lines[-1]
+ if pending:
+ yield pending.splitlines(keepends)[0]
+
+ def iter_chunks(self, chunk_size=_DEFAULT_CHUNK_SIZE):
+ """Return an iterator to yield chunks of chunk_size bytes from the raw
+ stream.
+ """
+ while True:
+ current_chunk = self.read(chunk_size)
+ if current_chunk == b"":
+ break
+ yield current_chunk
+
+ def _verify_content_length(self):
+ # See: https://github.com/kennethreitz/requests/issues/1855
+ # Basically, our http library doesn't do this for us, so we have
+ # to do this ourself.
+ if self._content_length is not None and self._amount_read != int(
+ self._content_length
+ ):
+ raise IncompleteReadError(
+ actual_bytes=self._amount_read,
+ expected_bytes=int(self._content_length),
+ )
+
+ def tell(self):
+ return self._raw_stream.tell()
+
+ def close(self):
+ """Close the underlying http response stream."""
+ self._raw_stream.close()
+
+
+def get_response(operation_model, http_response):
+ protocol = operation_model.metadata['protocol']
+ response_dict = {
+ 'headers': http_response.headers,
+ 'status_code': http_response.status_code,
+ }
+ # TODO: Unfortunately, we have to have error logic here.
+ # If it looks like an error, in the streaming response case we
+ # need to actually grab the contents.
+ if response_dict['status_code'] >= 300:
+ response_dict['body'] = http_response.content
+ elif operation_model.has_streaming_output:
+ response_dict['body'] = StreamingBody(
+ http_response.raw, response_dict['headers'].get('content-length')
+ )
+ else:
+ response_dict['body'] = http_response.content
+
+ parser = parsers.create_parser(protocol)
+ return http_response, parser.parse(
+ response_dict, operation_model.output_shape
+ )
diff --git a/.venv/lib/python3.12/site-packages/botocore/retries/__init__.py b/.venv/lib/python3.12/site-packages/botocore/retries/__init__.py
new file mode 100644
index 00000000..a6d6b377
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/retries/__init__.py
@@ -0,0 +1,6 @@
+"""New retry v2 handlers.
+
+This package obsoletes the botocore/retryhandler.py module and contains
+new retry logic.
+
+"""
diff --git a/.venv/lib/python3.12/site-packages/botocore/retries/adaptive.py b/.venv/lib/python3.12/site-packages/botocore/retries/adaptive.py
new file mode 100644
index 00000000..5e638ddb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/retries/adaptive.py
@@ -0,0 +1,132 @@
+import logging
+import math
+import threading
+
+from botocore.retries import bucket, standard, throttling
+
+logger = logging.getLogger(__name__)
+
+
+def register_retry_handler(client):
+ clock = bucket.Clock()
+ rate_adjustor = throttling.CubicCalculator(
+ starting_max_rate=0, start_time=clock.current_time()
+ )
+ token_bucket = bucket.TokenBucket(max_rate=1, clock=clock)
+ rate_clocker = RateClocker(clock)
+ throttling_detector = standard.ThrottlingErrorDetector(
+ retry_event_adapter=standard.RetryEventAdapter(),
+ )
+ limiter = ClientRateLimiter(
+ rate_adjustor=rate_adjustor,
+ rate_clocker=rate_clocker,
+ token_bucket=token_bucket,
+ throttling_detector=throttling_detector,
+ clock=clock,
+ )
+ client.meta.events.register(
+ 'before-send',
+ limiter.on_sending_request,
+ )
+ client.meta.events.register(
+ 'needs-retry',
+ limiter.on_receiving_response,
+ )
+ return limiter
+
+
+class ClientRateLimiter:
+ _MAX_RATE_ADJUST_SCALE = 2.0
+
+ def __init__(
+ self,
+ rate_adjustor,
+ rate_clocker,
+ token_bucket,
+ throttling_detector,
+ clock,
+ ):
+ self._rate_adjustor = rate_adjustor
+ self._rate_clocker = rate_clocker
+ self._token_bucket = token_bucket
+ self._throttling_detector = throttling_detector
+ self._clock = clock
+ self._enabled = False
+ self._lock = threading.Lock()
+
+ def on_sending_request(self, request, **kwargs):
+ if self._enabled:
+ self._token_bucket.acquire()
+
+ # Hooked up to needs-retry.
+ def on_receiving_response(self, **kwargs):
+ measured_rate = self._rate_clocker.record()
+ timestamp = self._clock.current_time()
+ with self._lock:
+ if not self._throttling_detector.is_throttling_error(**kwargs):
+ new_rate = self._rate_adjustor.success_received(timestamp)
+ else:
+ if not self._enabled:
+ rate_to_use = measured_rate
+ else:
+ rate_to_use = min(
+ measured_rate, self._token_bucket.max_rate
+ )
+ new_rate = self._rate_adjustor.error_received(
+ rate_to_use, timestamp
+ )
+ logger.debug(
+ "Throttling response received, new send rate: %s "
+ "measured rate: %s, token bucket capacity "
+ "available: %s",
+ new_rate,
+ measured_rate,
+ self._token_bucket.available_capacity,
+ )
+ self._enabled = True
+ self._token_bucket.max_rate = min(
+ new_rate, self._MAX_RATE_ADJUST_SCALE * measured_rate
+ )
+
+
+class RateClocker:
+ """Tracks the rate at which a client is sending a request."""
+
+ _DEFAULT_SMOOTHING = 0.8
+ # Update the rate every _TIME_BUCKET_RANGE seconds.
+ _TIME_BUCKET_RANGE = 0.5
+
+ def __init__(
+ self,
+ clock,
+ smoothing=_DEFAULT_SMOOTHING,
+ time_bucket_range=_TIME_BUCKET_RANGE,
+ ):
+ self._clock = clock
+ self._measured_rate = 0
+ self._smoothing = smoothing
+ self._last_bucket = math.floor(self._clock.current_time())
+ self._time_bucket_scale = 1 / self._TIME_BUCKET_RANGE
+ self._count = 0
+ self._lock = threading.Lock()
+
+ def record(self, amount=1):
+ with self._lock:
+ t = self._clock.current_time()
+ bucket = (
+ math.floor(t * self._time_bucket_scale)
+ / self._time_bucket_scale
+ )
+ self._count += amount
+ if bucket > self._last_bucket:
+ current_rate = self._count / float(bucket - self._last_bucket)
+ self._measured_rate = (current_rate * self._smoothing) + (
+ self._measured_rate * (1 - self._smoothing)
+ )
+ self._count = 0
+ self._last_bucket = bucket
+ return self._measured_rate
+
+ @property
+ def measured_rate(self):
+ return self._measured_rate
diff --git a/.venv/lib/python3.12/site-packages/botocore/retries/base.py b/.venv/lib/python3.12/site-packages/botocore/retries/base.py
new file mode 100644
index 00000000..108bfed6
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/retries/base.py
@@ -0,0 +1,26 @@
+class BaseRetryBackoff:
+ def delay_amount(self, context):
+ """Calculate how long we should delay before retrying.
+
+ :type context: RetryContext
+
+ """
+ raise NotImplementedError("delay_amount")
+
+
+class BaseRetryableChecker:
+ """Base class for determining if a retry should happen.
+
+ This base class checks for specific retryable conditions.
+ A single retryable checker doesn't necessarily indicate a retry
+ will happen. It's up to the ``RetryPolicy`` to use its
+ ``BaseRetryableCheckers`` to make the final decision on whether a retry
+ should happen.
+ """
+
+ def is_retryable(self, context):
+ """Returns True if retryable, False if not.
+
+ :type context: RetryContext
+ """
+ raise NotImplementedError("is_retryable")
diff --git a/.venv/lib/python3.12/site-packages/botocore/retries/bucket.py b/.venv/lib/python3.12/site-packages/botocore/retries/bucket.py
new file mode 100644
index 00000000..09d33c77
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/retries/bucket.py
@@ -0,0 +1,115 @@
+"""This module implements token buckets used for client side throttling."""
+
+import threading
+import time
+
+from botocore.exceptions import CapacityNotAvailableError
+
+
+class Clock:
+ def __init__(self):
+ pass
+
+ def sleep(self, amount):
+ time.sleep(amount)
+
+ def current_time(self):
+ return time.time()
+
+
+class TokenBucket:
+ _MIN_RATE = 0.5
+
+ def __init__(self, max_rate, clock, min_rate=_MIN_RATE):
+ self._fill_rate = None
+ self._max_capacity = None
+ self._current_capacity = 0
+ self._clock = clock
+ self._last_timestamp = None
+ self._min_rate = min_rate
+ self._lock = threading.Lock()
+ self._new_fill_rate_condition = threading.Condition(self._lock)
+ self.max_rate = max_rate
+
+ @property
+ def max_rate(self):
+ return self._fill_rate
+
+ @max_rate.setter
+ def max_rate(self, value):
+ with self._new_fill_rate_condition:
+ # Before we can change the rate we need to fill any pending
+ # tokens we might have based on the current rate. If we don't
+ # do this it means everything since the last recorded timestamp
+ # will accumulate at the rate we're about to set which isn't
+ # correct.
+ self._refill()
+ self._fill_rate = max(value, self._min_rate)
+ if value >= 1:
+ self._max_capacity = value
+ else:
+ self._max_capacity = 1
+ # If we're scaling down, we also can't have a capacity that's
+ # more than our max_capacity.
+ self._current_capacity = min(
+ self._current_capacity, self._max_capacity
+ )
+ self._new_fill_rate_condition.notify()
+
+ @property
+ def max_capacity(self):
+ return self._max_capacity
+
+ @property
+ def available_capacity(self):
+ return self._current_capacity
+
+ def acquire(self, amount=1, block=True):
+ """Acquire token or return amount of time until next token available.
+
+ If block is True, then this method will block until there's sufficient
+ capacity to acquire the desired amount.
+
+ If block is False, then this method will return True is capacity
+ was successfully acquired, False otherwise.
+
+ """
+ with self._new_fill_rate_condition:
+ return self._acquire(amount=amount, block=block)
+
+ def _acquire(self, amount, block):
+ self._refill()
+ if amount <= self._current_capacity:
+ self._current_capacity -= amount
+ return True
+ else:
+ if not block:
+ raise CapacityNotAvailableError()
+ # Not enough capacity.
+ sleep_amount = self._sleep_amount(amount)
+ while sleep_amount > 0:
+ # Until python3.2, wait() always returned None so we can't
+ # tell if a timeout occurred waiting on the cond var.
+ # Because of this we'll unconditionally call _refill().
+ # The downside to this is that we were waken up via
+ # a notify(), we're calling unnecessarily calling _refill() an
+ # extra time.
+ self._new_fill_rate_condition.wait(sleep_amount)
+ self._refill()
+ sleep_amount = self._sleep_amount(amount)
+ self._current_capacity -= amount
+ return True
+
+ def _sleep_amount(self, amount):
+ return (amount - self._current_capacity) / self._fill_rate
+
+ def _refill(self):
+ timestamp = self._clock.current_time()
+ if self._last_timestamp is None:
+ self._last_timestamp = timestamp
+ return
+ current_capacity = self._current_capacity
+ fill_amount = (timestamp - self._last_timestamp) * self._fill_rate
+ new_capacity = min(self._max_capacity, current_capacity + fill_amount)
+ self._current_capacity = new_capacity
+ self._last_timestamp = timestamp
diff --git a/.venv/lib/python3.12/site-packages/botocore/retries/quota.py b/.venv/lib/python3.12/site-packages/botocore/retries/quota.py
new file mode 100644
index 00000000..f0394291
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/retries/quota.py
@@ -0,0 +1,54 @@
+"""Retry quota implementation."""
+
+import threading
+
+
+class RetryQuota:
+ INITIAL_CAPACITY = 500
+
+ def __init__(self, initial_capacity=INITIAL_CAPACITY, lock=None):
+ self._max_capacity = initial_capacity
+ self._available_capacity = initial_capacity
+ if lock is None:
+ lock = threading.Lock()
+ self._lock = lock
+
+ def acquire(self, capacity_amount):
+ """Attempt to aquire a certain amount of capacity.
+
+ If there's not sufficient amount of capacity available, ``False``
+ is returned. Otherwise, ``True`` is returned, which indicates that
+ capacity was successfully allocated.
+
+ """
+ # The acquire() is only called when we encounter a retryable
+ # response so we aren't worried about locking the entire method.
+ with self._lock:
+ if capacity_amount > self._available_capacity:
+ return False
+ self._available_capacity -= capacity_amount
+ return True
+
+ def release(self, capacity_amount):
+ """Release capacity back to the retry quota.
+
+ The capacity being released will be truncated if necessary
+ to ensure the max capacity is never exceeded.
+
+ """
+ # Implementation note: The release() method is called as part
+ # of the "after-call" event, which means it gets invoked for
+ # every API call. In the common case where the request is
+ # successful and we're at full capacity, we can avoid locking.
+ # We can't exceed max capacity so there's no work we have to do.
+ if self._max_capacity == self._available_capacity:
+ return
+ with self._lock:
+ amount = min(
+ self._max_capacity - self._available_capacity, capacity_amount
+ )
+ self._available_capacity += amount
+
+ @property
+ def available_capacity(self):
+ return self._available_capacity
diff --git a/.venv/lib/python3.12/site-packages/botocore/retries/special.py b/.venv/lib/python3.12/site-packages/botocore/retries/special.py
new file mode 100644
index 00000000..9b782601
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/retries/special.py
@@ -0,0 +1,51 @@
+"""Special cased retries.
+
+These are additional retry cases we still have to handle from the legacy
+retry handler. They don't make sense as part of the standard mode retry
+module. Ideally we should be able to remove this module.
+
+"""
+
+import logging
+from binascii import crc32
+
+from botocore.retries.base import BaseRetryableChecker
+
+logger = logging.getLogger(__name__)
+
+
+# TODO: This is an ideal candidate for the retryable trait once that's
+# available.
+class RetryIDPCommunicationError(BaseRetryableChecker):
+ _SERVICE_NAME = 'sts'
+
+ def is_retryable(self, context):
+ service_name = context.operation_model.service_model.service_name
+ if service_name != self._SERVICE_NAME:
+ return False
+ error_code = context.get_error_code()
+ return error_code == 'IDPCommunicationError'
+
+
+class RetryDDBChecksumError(BaseRetryableChecker):
+ _CHECKSUM_HEADER = 'x-amz-crc32'
+ _SERVICE_NAME = 'dynamodb'
+
+ def is_retryable(self, context):
+ service_name = context.operation_model.service_model.service_name
+ if service_name != self._SERVICE_NAME:
+ return False
+ if context.http_response is None:
+ return False
+ checksum = context.http_response.headers.get(self._CHECKSUM_HEADER)
+ if checksum is None:
+ return False
+ actual_crc32 = crc32(context.http_response.content) & 0xFFFFFFFF
+ if actual_crc32 != int(checksum):
+ logger.debug(
+ "DynamoDB crc32 checksum does not match, "
+ "expected: %s, actual: %s",
+ checksum,
+ actual_crc32,
+ )
+ return True
diff --git a/.venv/lib/python3.12/site-packages/botocore/retries/standard.py b/.venv/lib/python3.12/site-packages/botocore/retries/standard.py
new file mode 100644
index 00000000..8801530b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/retries/standard.py
@@ -0,0 +1,532 @@
+"""Standard retry behavior.
+
+This contains the default standard retry behavior.
+It provides consistent behavior with other AWS SDKs.
+
+The key base classes uses for retries:
+
+ * ``BaseRetryableChecker`` - Use to check a specific condition that
+ indicates a retry should happen. This can include things like
+ max attempts, HTTP status code checks, error code checks etc.
+ * ``RetryBackoff`` - Use to determine how long we should backoff until
+ we retry a request. This is the class that will implement delay such
+ as exponential backoff.
+ * ``RetryPolicy`` - Main class that determines if a retry should
+ happen. It can combine data from a various BaseRetryableCheckers
+ to make a final call as to whether or not a retry should happen.
+ It then uses a ``BaseRetryBackoff`` to determine how long to delay.
+ * ``RetryHandler`` - The bridge between botocore's event system
+ used by endpoint.py to manage retries and the interfaces defined
+ in this module.
+
+This allows us to define an API that has minimal coupling to the event
+based API used by botocore.
+
+"""
+
+import logging
+import random
+
+from botocore.exceptions import (
+ ConnectionError,
+ ConnectTimeoutError,
+ HTTPClientError,
+ ReadTimeoutError,
+)
+from botocore.retries import quota, special
+from botocore.retries.base import BaseRetryableChecker, BaseRetryBackoff
+
+DEFAULT_MAX_ATTEMPTS = 3
+logger = logging.getLogger(__name__)
+
+
+def register_retry_handler(client, max_attempts=DEFAULT_MAX_ATTEMPTS):
+ retry_quota = RetryQuotaChecker(quota.RetryQuota())
+
+ service_id = client.meta.service_model.service_id
+ service_event_name = service_id.hyphenize()
+ client.meta.events.register(
+ f'after-call.{service_event_name}', retry_quota.release_retry_quota
+ )
+
+ handler = RetryHandler(
+ retry_policy=RetryPolicy(
+ retry_checker=StandardRetryConditions(max_attempts=max_attempts),
+ retry_backoff=ExponentialBackoff(),
+ ),
+ retry_event_adapter=RetryEventAdapter(),
+ retry_quota=retry_quota,
+ )
+
+ unique_id = f'retry-config-{service_event_name}'
+ client.meta.events.register(
+ f'needs-retry.{service_event_name}',
+ handler.needs_retry,
+ unique_id=unique_id,
+ )
+ return handler
+
+
+class RetryHandler:
+ """Bridge between botocore's event system and this module.
+
+ This class is intended to be hooked to botocore's event system
+ as an event handler.
+ """
+
+ def __init__(self, retry_policy, retry_event_adapter, retry_quota):
+ self._retry_policy = retry_policy
+ self._retry_event_adapter = retry_event_adapter
+ self._retry_quota = retry_quota
+
+ def needs_retry(self, **kwargs):
+ """Connect as a handler to the needs-retry event."""
+ retry_delay = None
+ context = self._retry_event_adapter.create_retry_context(**kwargs)
+ if self._retry_policy.should_retry(context):
+ # Before we can retry we need to ensure we have sufficient
+ # capacity in our retry quota.
+ if self._retry_quota.acquire_retry_quota(context):
+ retry_delay = self._retry_policy.compute_retry_delay(context)
+ logger.debug(
+ "Retry needed, retrying request after delay of: %s",
+ retry_delay,
+ )
+ else:
+ logger.debug(
+ "Retry needed but retry quota reached, "
+ "not retrying request."
+ )
+ else:
+ logger.debug("Not retrying request.")
+ self._retry_event_adapter.adapt_retry_response_from_context(context)
+ return retry_delay
+
+
+class RetryEventAdapter:
+ """Adapter to existing retry interface used in the endpoints layer.
+
+ This existing interface for determining if a retry needs to happen
+ is event based and used in ``botocore.endpoint``. The interface has
+ grown organically over the years and could use some cleanup. This
+ adapter converts that interface into the interface used by the
+ new retry strategies.
+
+ """
+
+ def create_retry_context(self, **kwargs):
+ """Create context based on needs-retry kwargs."""
+ response = kwargs['response']
+ if response is None:
+ # If response is None it means that an exception was raised
+ # because we never received a response from the service. This
+ # could be something like a ConnectionError we get from our
+ # http layer.
+ http_response = None
+ parsed_response = None
+ else:
+ http_response, parsed_response = response
+ # This provides isolation between the kwargs emitted in the
+ # needs-retry event, and what this module uses to check for
+ # retries.
+ context = RetryContext(
+ attempt_number=kwargs['attempts'],
+ operation_model=kwargs['operation'],
+ http_response=http_response,
+ parsed_response=parsed_response,
+ caught_exception=kwargs['caught_exception'],
+ request_context=kwargs['request_dict']['context'],
+ )
+ return context
+
+ def adapt_retry_response_from_context(self, context):
+ """Modify response back to user back from context."""
+ # This will mutate attributes that are returned back to the end
+ # user. We do it this way so that all the various retry classes
+ # don't mutate any input parameters from the needs-retry event.
+ metadata = context.get_retry_metadata()
+ if context.parsed_response is not None:
+ context.parsed_response.setdefault('ResponseMetadata', {}).update(
+ metadata
+ )
+
+
+# Implementation note: this is meant to encapsulate all the misc stuff
+# that gets sent in the needs-retry event. This is mapped so that params
+# are more clear and explicit.
+class RetryContext:
+ """Normalize a response that we use to check if a retry should occur.
+
+ This class smoothes over the different types of responses we may get
+ from a service including:
+
+ * A modeled error response from the service that contains a service
+ code and error message.
+ * A raw HTTP response that doesn't contain service protocol specific
+ error keys.
+ * An exception received while attempting to retrieve a response.
+ This could be a ConnectionError we receive from our HTTP layer which
+ could represent that we weren't able to receive a response from
+ the service.
+
+ This class guarantees that at least one of the above attributes will be
+ non None.
+
+ This class is meant to provide a read-only view into the properties
+ associated with a possible retryable response. None of the properties
+ are meant to be modified directly.
+
+ """
+
+ def __init__(
+ self,
+ attempt_number,
+ operation_model=None,
+ parsed_response=None,
+ http_response=None,
+ caught_exception=None,
+ request_context=None,
+ ):
+ # 1-based attempt number.
+ self.attempt_number = attempt_number
+ self.operation_model = operation_model
+ # This is the parsed response dictionary we get from parsing
+ # the HTTP response from the service.
+ self.parsed_response = parsed_response
+ # This is an instance of botocore.awsrequest.AWSResponse.
+ self.http_response = http_response
+ # This is a subclass of Exception that will be non None if
+ # an exception was raised when retrying to retrieve a response.
+ self.caught_exception = caught_exception
+ # This is the request context dictionary that's added to the
+ # request dict. This is used to story any additional state
+ # about the request. We use this for storing retry quota
+ # capacity.
+ if request_context is None:
+ request_context = {}
+ self.request_context = request_context
+ self._retry_metadata = {}
+
+ # These are misc helper methods to avoid duplication in the various
+ # checkers.
+ def get_error_code(self):
+ """Check if there was a parsed response with an error code.
+
+ If we could not find any error codes, ``None`` is returned.
+
+ """
+ if self.parsed_response is None:
+ return
+ error = self.parsed_response.get('Error', {})
+ if not isinstance(error, dict):
+ return
+ return error.get('Code')
+
+ def add_retry_metadata(self, **kwargs):
+ """Add key/value pairs to the retry metadata.
+
+ This allows any objects during the retry process to add
+ metadata about any checks/validations that happened.
+
+ This gets added to the response metadata in the retry handler.
+
+ """
+ self._retry_metadata.update(**kwargs)
+
+ def get_retry_metadata(self):
+ return self._retry_metadata.copy()
+
+
+class RetryPolicy:
+ def __init__(self, retry_checker, retry_backoff):
+ self._retry_checker = retry_checker
+ self._retry_backoff = retry_backoff
+
+ def should_retry(self, context):
+ return self._retry_checker.is_retryable(context)
+
+ def compute_retry_delay(self, context):
+ return self._retry_backoff.delay_amount(context)
+
+
+class ExponentialBackoff(BaseRetryBackoff):
+ _BASE = 2
+ _MAX_BACKOFF = 20
+
+ def __init__(self, max_backoff=20, random=random.random):
+ self._base = self._BASE
+ self._max_backoff = max_backoff
+ self._random = random
+
+ def delay_amount(self, context):
+ """Calculates delay based on exponential backoff.
+
+ This class implements truncated binary exponential backoff
+ with jitter::
+
+ t_i = rand(0, 1) * min(2 ** attempt, MAX_BACKOFF)
+
+ where ``i`` is the request attempt (0 based).
+
+ """
+ # The context.attempt_number is a 1-based value, but we have
+ # to calculate the delay based on i based a 0-based value. We
+ # want the first delay to just be ``rand(0, 1)``.
+ return self._random() * min(
+ (self._base ** (context.attempt_number - 1)),
+ self._max_backoff,
+ )
+
+
+class MaxAttemptsChecker(BaseRetryableChecker):
+ def __init__(self, max_attempts):
+ self._max_attempts = max_attempts
+
+ def is_retryable(self, context):
+ under_max_attempts = context.attempt_number < self._max_attempts
+ retries_context = context.request_context.get('retries')
+ if retries_context:
+ retries_context['max'] = max(
+ retries_context.get('max', 0), self._max_attempts
+ )
+ if not under_max_attempts:
+ logger.debug("Max attempts of %s reached.", self._max_attempts)
+ context.add_retry_metadata(MaxAttemptsReached=True)
+ return under_max_attempts
+
+
+class TransientRetryableChecker(BaseRetryableChecker):
+ _TRANSIENT_ERROR_CODES = [
+ 'RequestTimeout',
+ 'RequestTimeoutException',
+ 'PriorRequestNotComplete',
+ ]
+ _TRANSIENT_STATUS_CODES = [500, 502, 503, 504]
+ _TRANSIENT_EXCEPTION_CLS = (
+ ConnectionError,
+ HTTPClientError,
+ )
+
+ def __init__(
+ self,
+ transient_error_codes=None,
+ transient_status_codes=None,
+ transient_exception_cls=None,
+ ):
+ if transient_error_codes is None:
+ transient_error_codes = self._TRANSIENT_ERROR_CODES[:]
+ if transient_status_codes is None:
+ transient_status_codes = self._TRANSIENT_STATUS_CODES[:]
+ if transient_exception_cls is None:
+ transient_exception_cls = self._TRANSIENT_EXCEPTION_CLS
+ self._transient_error_codes = transient_error_codes
+ self._transient_status_codes = transient_status_codes
+ self._transient_exception_cls = transient_exception_cls
+
+ def is_retryable(self, context):
+ if context.get_error_code() in self._transient_error_codes:
+ return True
+ if context.http_response is not None:
+ if (
+ context.http_response.status_code
+ in self._transient_status_codes
+ ):
+ return True
+ if context.caught_exception is not None:
+ return isinstance(
+ context.caught_exception, self._transient_exception_cls
+ )
+ return False
+
+
+class ThrottledRetryableChecker(BaseRetryableChecker):
+ # This is the union of all error codes we've seen that represent
+ # a throttled error.
+ _THROTTLED_ERROR_CODES = [
+ 'Throttling',
+ 'ThrottlingException',
+ 'ThrottledException',
+ 'RequestThrottledException',
+ 'TooManyRequestsException',
+ 'ProvisionedThroughputExceededException',
+ 'TransactionInProgressException',
+ 'RequestLimitExceeded',
+ 'BandwidthLimitExceeded',
+ 'LimitExceededException',
+ 'RequestThrottled',
+ 'SlowDown',
+ 'PriorRequestNotComplete',
+ 'EC2ThrottledException',
+ ]
+
+ def __init__(self, throttled_error_codes=None):
+ if throttled_error_codes is None:
+ throttled_error_codes = self._THROTTLED_ERROR_CODES[:]
+ self._throttled_error_codes = throttled_error_codes
+
+ def is_retryable(self, context):
+ # Only the error code from a parsed service response is used
+ # to determine if the response is a throttled response.
+ return context.get_error_code() in self._throttled_error_codes
+
+
+class ModeledRetryableChecker(BaseRetryableChecker):
+ """Check if an error has been modeled as retryable."""
+
+ def __init__(self):
+ self._error_detector = ModeledRetryErrorDetector()
+
+ def is_retryable(self, context):
+ error_code = context.get_error_code()
+ if error_code is None:
+ return False
+ return self._error_detector.detect_error_type(context) is not None
+
+
+class ModeledRetryErrorDetector:
+ """Checks whether or not an error is a modeled retryable error."""
+
+ # There are return values from the detect_error_type() method.
+ TRANSIENT_ERROR = 'TRANSIENT_ERROR'
+ THROTTLING_ERROR = 'THROTTLING_ERROR'
+ # This class is lower level than ModeledRetryableChecker, which
+ # implements BaseRetryableChecker. This object allows you to distinguish
+ # between the various types of retryable errors.
+
+ def detect_error_type(self, context):
+ """Detect the error type associated with an error code and model.
+
+ This will either return:
+
+ * ``self.TRANSIENT_ERROR`` - If the error is a transient error
+ * ``self.THROTTLING_ERROR`` - If the error is a throttling error
+ * ``None`` - If the error is neither type of error.
+
+ """
+ error_code = context.get_error_code()
+ op_model = context.operation_model
+ if op_model is None or not op_model.error_shapes:
+ return
+ for shape in op_model.error_shapes:
+ if shape.metadata.get('retryable') is not None:
+ # Check if this error code matches the shape. This can
+ # be either by name or by a modeled error code.
+ error_code_to_check = (
+ shape.metadata.get('error', {}).get('code') or shape.name
+ )
+ if error_code == error_code_to_check:
+ if shape.metadata['retryable'].get('throttling'):
+ return self.THROTTLING_ERROR
+ return self.TRANSIENT_ERROR
+
+
+class ThrottlingErrorDetector:
+ def __init__(self, retry_event_adapter):
+ self._modeled_error_detector = ModeledRetryErrorDetector()
+ self._fixed_error_code_detector = ThrottledRetryableChecker()
+ self._retry_event_adapter = retry_event_adapter
+
+ # This expects the kwargs from needs-retry to be passed through.
+ def is_throttling_error(self, **kwargs):
+ context = self._retry_event_adapter.create_retry_context(**kwargs)
+ if self._fixed_error_code_detector.is_retryable(context):
+ return True
+ error_type = self._modeled_error_detector.detect_error_type(context)
+ return error_type == self._modeled_error_detector.THROTTLING_ERROR
+
+
+class StandardRetryConditions(BaseRetryableChecker):
+ """Concrete class that implements the standard retry policy checks.
+
+ Specifically:
+
+ not max_attempts and (transient or throttled or modeled_retry)
+
+ """
+
+ def __init__(self, max_attempts=DEFAULT_MAX_ATTEMPTS):
+ # Note: This class is for convenience so you can have the
+ # standard retry condition in a single class.
+ self._max_attempts_checker = MaxAttemptsChecker(max_attempts)
+ self._additional_checkers = OrRetryChecker(
+ [
+ TransientRetryableChecker(),
+ ThrottledRetryableChecker(),
+ ModeledRetryableChecker(),
+ OrRetryChecker(
+ [
+ special.RetryIDPCommunicationError(),
+ special.RetryDDBChecksumError(),
+ ]
+ ),
+ ]
+ )
+
+ def is_retryable(self, context):
+ return self._max_attempts_checker.is_retryable(
+ context
+ ) and self._additional_checkers.is_retryable(context)
+
+
+class OrRetryChecker(BaseRetryableChecker):
+ def __init__(self, checkers):
+ self._checkers = checkers
+
+ def is_retryable(self, context):
+ return any(checker.is_retryable(context) for checker in self._checkers)
+
+
+class RetryQuotaChecker:
+ _RETRY_COST = 5
+ _NO_RETRY_INCREMENT = 1
+ _TIMEOUT_RETRY_REQUEST = 10
+ _TIMEOUT_EXCEPTIONS = (ConnectTimeoutError, ReadTimeoutError)
+
+ # Implementation note: We're not making this a BaseRetryableChecker
+ # because this isn't just a check if we can retry. This also changes
+ # state so we have to careful when/how we call this. Making it
+ # a BaseRetryableChecker implies you can call .is_retryable(context)
+ # as many times as you want and not affect anything.
+
+ def __init__(self, quota):
+ self._quota = quota
+ # This tracks the last amount
+ self._last_amount_acquired = None
+
+ def acquire_retry_quota(self, context):
+ if self._is_timeout_error(context):
+ capacity_amount = self._TIMEOUT_RETRY_REQUEST
+ else:
+ capacity_amount = self._RETRY_COST
+ success = self._quota.acquire(capacity_amount)
+ if success:
+ # We add the capacity amount to the request context so we know
+ # how much to release later. The capacity amount can vary based
+ # on the error.
+ context.request_context['retry_quota_capacity'] = capacity_amount
+ return True
+ context.add_retry_metadata(RetryQuotaReached=True)
+ return False
+
+ def _is_timeout_error(self, context):
+ return isinstance(context.caught_exception, self._TIMEOUT_EXCEPTIONS)
+
+ # This is intended to be hooked up to ``after-call``.
+ def release_retry_quota(self, context, http_response, **kwargs):
+ # There's three possible options.
+ # 1. The HTTP response did not have a 2xx response. In that case we
+ # give no quota back.
+ # 2. The HTTP request was successful and was never retried. In
+ # that case we give _NO_RETRY_INCREMENT back.
+ # 3. The API call had retries, and we eventually receive an HTTP
+ # response with a 2xx status code. In that case we give back
+ # whatever quota was associated with the last acquisition.
+ if http_response is None:
+ return
+ status_code = http_response.status_code
+ if 200 <= status_code < 300:
+ if 'retry_quota_capacity' not in context:
+ self._quota.release(self._NO_RETRY_INCREMENT)
+ else:
+ capacity_amount = context['retry_quota_capacity']
+ self._quota.release(capacity_amount)
diff --git a/.venv/lib/python3.12/site-packages/botocore/retries/throttling.py b/.venv/lib/python3.12/site-packages/botocore/retries/throttling.py
new file mode 100644
index 00000000..34ab4172
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/retries/throttling.py
@@ -0,0 +1,55 @@
+from collections import namedtuple
+
+CubicParams = namedtuple('CubicParams', ['w_max', 'k', 'last_fail'])
+
+
+class CubicCalculator:
+ _SCALE_CONSTANT = 0.4
+ _BETA = 0.7
+
+ def __init__(
+ self,
+ starting_max_rate,
+ start_time,
+ scale_constant=_SCALE_CONSTANT,
+ beta=_BETA,
+ ):
+ self._w_max = starting_max_rate
+ self._scale_constant = scale_constant
+ self._beta = beta
+ self._k = self._calculate_zero_point()
+ self._last_fail = start_time
+
+ def _calculate_zero_point(self):
+ scaled_value = (self._w_max * (1 - self._beta)) / self._scale_constant
+ k = scaled_value ** (1 / 3.0)
+ return k
+
+ def success_received(self, timestamp):
+ dt = timestamp - self._last_fail
+ new_rate = self._scale_constant * (dt - self._k) ** 3 + self._w_max
+ return new_rate
+
+ def error_received(self, current_rate, timestamp):
+ # Consider not having this be the current measured rate.
+
+ # We have a new max rate, which is the current rate we were sending
+ # at when we received an error response.
+ self._w_max = current_rate
+ self._k = self._calculate_zero_point()
+ self._last_fail = timestamp
+ return current_rate * self._beta
+
+ def get_params_snapshot(self):
+ """Return a read-only object of the current cubic parameters.
+
+ These parameters are intended to be used for debug/troubleshooting
+ purposes. These object is a read-only snapshot and cannot be used
+ to modify the behavior of the CUBIC calculations.
+
+ New parameters may be added to this object in the future.
+
+ """
+ return CubicParams(
+ w_max=self._w_max, k=self._k, last_fail=self._last_fail
+ )
diff --git a/.venv/lib/python3.12/site-packages/botocore/retryhandler.py b/.venv/lib/python3.12/site-packages/botocore/retryhandler.py
new file mode 100644
index 00000000..c2eed1d9
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/retryhandler.py
@@ -0,0 +1,416 @@
+# Copyright (c) 2012-2013 Mitch Garnaat http://garnaat.org/
+# Copyright 2012-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+
+import functools
+import logging
+import random
+from binascii import crc32
+
+from botocore.exceptions import (
+ ChecksumError,
+ ConnectionClosedError,
+ ConnectionError,
+ EndpointConnectionError,
+ ReadTimeoutError,
+)
+
+logger = logging.getLogger(__name__)
+# The only supported error for now is GENERAL_CONNECTION_ERROR
+# which maps to requests generic ConnectionError. If we're able
+# to get more specific exceptions from requests we can update
+# this mapping with more specific exceptions.
+EXCEPTION_MAP = {
+ 'GENERAL_CONNECTION_ERROR': [
+ ConnectionError,
+ ConnectionClosedError,
+ ReadTimeoutError,
+ EndpointConnectionError,
+ ],
+}
+
+
+def delay_exponential(base, growth_factor, attempts):
+ """Calculate time to sleep based on exponential function.
+
+ The format is::
+
+ base * growth_factor ^ (attempts - 1)
+
+ If ``base`` is set to 'rand' then a random number between
+ 0 and 1 will be used as the base.
+ Base must be greater than 0, otherwise a ValueError will be
+ raised.
+
+ """
+ if base == 'rand':
+ base = random.random()
+ elif base <= 0:
+ raise ValueError(
+ f"The 'base' param must be greater than 0, got: {base}"
+ )
+ time_to_sleep = base * (growth_factor ** (attempts - 1))
+ return time_to_sleep
+
+
+def create_exponential_delay_function(base, growth_factor):
+ """Create an exponential delay function based on the attempts.
+
+ This is used so that you only have to pass it the attempts
+ parameter to calculate the delay.
+
+ """
+ return functools.partial(
+ delay_exponential, base=base, growth_factor=growth_factor
+ )
+
+
+def create_retry_handler(config, operation_name=None):
+ checker = create_checker_from_retry_config(
+ config, operation_name=operation_name
+ )
+ action = create_retry_action_from_config(
+ config, operation_name=operation_name
+ )
+ return RetryHandler(checker=checker, action=action)
+
+
+def create_retry_action_from_config(config, operation_name=None):
+ # The spec has the possibility of supporting per policy
+ # actions, but right now, we assume this comes from the
+ # default section, which means that delay functions apply
+ # for every policy in the retry config (per service).
+ delay_config = config['__default__']['delay']
+ if delay_config['type'] == 'exponential':
+ return create_exponential_delay_function(
+ base=delay_config['base'],
+ growth_factor=delay_config['growth_factor'],
+ )
+
+
+def create_checker_from_retry_config(config, operation_name=None):
+ checkers = []
+ max_attempts = None
+ retryable_exceptions = []
+ if '__default__' in config:
+ policies = config['__default__'].get('policies', [])
+ max_attempts = config['__default__']['max_attempts']
+ for key in policies:
+ current_config = policies[key]
+ checkers.append(_create_single_checker(current_config))
+ retry_exception = _extract_retryable_exception(current_config)
+ if retry_exception is not None:
+ retryable_exceptions.extend(retry_exception)
+ if operation_name is not None and config.get(operation_name) is not None:
+ operation_policies = config[operation_name]['policies']
+ for key in operation_policies:
+ checkers.append(_create_single_checker(operation_policies[key]))
+ retry_exception = _extract_retryable_exception(
+ operation_policies[key]
+ )
+ if retry_exception is not None:
+ retryable_exceptions.extend(retry_exception)
+ if len(checkers) == 1:
+ # Don't need to use a MultiChecker
+ return MaxAttemptsDecorator(checkers[0], max_attempts=max_attempts)
+ else:
+ multi_checker = MultiChecker(checkers)
+ return MaxAttemptsDecorator(
+ multi_checker,
+ max_attempts=max_attempts,
+ retryable_exceptions=tuple(retryable_exceptions),
+ )
+
+
+def _create_single_checker(config):
+ if 'response' in config['applies_when']:
+ return _create_single_response_checker(
+ config['applies_when']['response']
+ )
+ elif 'socket_errors' in config['applies_when']:
+ return ExceptionRaiser()
+
+
+def _create_single_response_checker(response):
+ if 'service_error_code' in response:
+ checker = ServiceErrorCodeChecker(
+ status_code=response['http_status_code'],
+ error_code=response['service_error_code'],
+ )
+ elif 'http_status_code' in response:
+ checker = HTTPStatusCodeChecker(
+ status_code=response['http_status_code']
+ )
+ elif 'crc32body' in response:
+ checker = CRC32Checker(header=response['crc32body'])
+ else:
+ # TODO: send a signal.
+ raise ValueError("Unknown retry policy")
+ return checker
+
+
+def _extract_retryable_exception(config):
+ applies_when = config['applies_when']
+ if 'crc32body' in applies_when.get('response', {}):
+ return [ChecksumError]
+ elif 'socket_errors' in applies_when:
+ exceptions = []
+ for name in applies_when['socket_errors']:
+ exceptions.extend(EXCEPTION_MAP[name])
+ return exceptions
+
+
+class RetryHandler:
+ """Retry handler.
+
+ The retry handler takes two params, ``checker`` object
+ and an ``action`` object.
+
+ The ``checker`` object must be a callable object and based on a response
+ and an attempt number, determines whether or not sufficient criteria for
+ a retry has been met. If this is the case then the ``action`` object
+ (which also is a callable) determines what needs to happen in the event
+ of a retry.
+
+ """
+
+ def __init__(self, checker, action):
+ self._checker = checker
+ self._action = action
+
+ def __call__(self, attempts, response, caught_exception, **kwargs):
+ """Handler for a retry.
+
+ Intended to be hooked up to an event handler (hence the **kwargs),
+ this will process retries appropriately.
+
+ """
+ checker_kwargs = {
+ 'attempt_number': attempts,
+ 'response': response,
+ 'caught_exception': caught_exception,
+ }
+ if isinstance(self._checker, MaxAttemptsDecorator):
+ retries_context = kwargs['request_dict']['context'].get('retries')
+ checker_kwargs.update({'retries_context': retries_context})
+
+ if self._checker(**checker_kwargs):
+ result = self._action(attempts=attempts)
+ logger.debug("Retry needed, action of: %s", result)
+ return result
+ logger.debug("No retry needed.")
+
+
+class BaseChecker:
+ """Base class for retry checkers.
+
+ Each class is responsible for checking a single criteria that determines
+ whether or not a retry should not happen.
+
+ """
+
+ def __call__(self, attempt_number, response, caught_exception):
+ """Determine if retry criteria matches.
+
+ Note that either ``response`` is not None and ``caught_exception`` is
+ None or ``response`` is None and ``caught_exception`` is not None.
+
+ :type attempt_number: int
+ :param attempt_number: The total number of times we've attempted
+ to send the request.
+
+ :param response: The HTTP response (if one was received).
+
+ :type caught_exception: Exception
+ :param caught_exception: Any exception that was caught while trying to
+ send the HTTP response.
+
+ :return: True, if the retry criteria matches (and therefore a retry
+ should occur. False if the criteria does not match.
+
+ """
+ # The default implementation allows subclasses to not have to check
+ # whether or not response is None or not.
+ if response is not None:
+ return self._check_response(attempt_number, response)
+ elif caught_exception is not None:
+ return self._check_caught_exception(
+ attempt_number, caught_exception
+ )
+ else:
+ raise ValueError("Both response and caught_exception are None.")
+
+ def _check_response(self, attempt_number, response):
+ pass
+
+ def _check_caught_exception(self, attempt_number, caught_exception):
+ pass
+
+
+class MaxAttemptsDecorator(BaseChecker):
+ """Allow retries up to a maximum number of attempts.
+
+ This will pass through calls to the decorated retry checker, provided
+ that the number of attempts does not exceed max_attempts. It will
+ also catch any retryable_exceptions passed in. Once max_attempts has
+ been exceeded, then False will be returned or the retryable_exceptions
+ that was previously being caught will be raised.
+
+ """
+
+ def __init__(self, checker, max_attempts, retryable_exceptions=None):
+ self._checker = checker
+ self._max_attempts = max_attempts
+ self._retryable_exceptions = retryable_exceptions
+
+ def __call__(
+ self, attempt_number, response, caught_exception, retries_context
+ ):
+ if retries_context:
+ retries_context['max'] = max(
+ retries_context.get('max', 0), self._max_attempts
+ )
+
+ should_retry = self._should_retry(
+ attempt_number, response, caught_exception
+ )
+ if should_retry:
+ if attempt_number >= self._max_attempts:
+ # explicitly set MaxAttemptsReached
+ if response is not None and 'ResponseMetadata' in response[1]:
+ response[1]['ResponseMetadata']['MaxAttemptsReached'] = (
+ True
+ )
+ logger.debug(
+ "Reached the maximum number of retry attempts: %s",
+ attempt_number,
+ )
+ return False
+ else:
+ return should_retry
+ else:
+ return False
+
+ def _should_retry(self, attempt_number, response, caught_exception):
+ if self._retryable_exceptions and attempt_number < self._max_attempts:
+ try:
+ return self._checker(
+ attempt_number, response, caught_exception
+ )
+ except self._retryable_exceptions as e:
+ logger.debug(
+ "retry needed, retryable exception caught: %s",
+ e,
+ exc_info=True,
+ )
+ return True
+ else:
+ # If we've exceeded the max attempts we just let the exception
+ # propagate if one has occurred.
+ return self._checker(attempt_number, response, caught_exception)
+
+
+class HTTPStatusCodeChecker(BaseChecker):
+ def __init__(self, status_code):
+ self._status_code = status_code
+
+ def _check_response(self, attempt_number, response):
+ if response[0].status_code == self._status_code:
+ logger.debug(
+ "retry needed: retryable HTTP status code received: %s",
+ self._status_code,
+ )
+ return True
+ else:
+ return False
+
+
+class ServiceErrorCodeChecker(BaseChecker):
+ def __init__(self, status_code, error_code):
+ self._status_code = status_code
+ self._error_code = error_code
+
+ def _check_response(self, attempt_number, response):
+ if response[0].status_code == self._status_code:
+ actual_error_code = response[1].get('Error', {}).get('Code')
+ if actual_error_code == self._error_code:
+ logger.debug(
+ "retry needed: matching HTTP status and error code seen: "
+ "%s, %s",
+ self._status_code,
+ self._error_code,
+ )
+ return True
+ return False
+
+
+class MultiChecker(BaseChecker):
+ def __init__(self, checkers):
+ self._checkers = checkers
+
+ def __call__(self, attempt_number, response, caught_exception):
+ for checker in self._checkers:
+ checker_response = checker(
+ attempt_number, response, caught_exception
+ )
+ if checker_response:
+ return checker_response
+ return False
+
+
+class CRC32Checker(BaseChecker):
+ def __init__(self, header):
+ # The header where the expected crc32 is located.
+ self._header_name = header
+
+ def _check_response(self, attempt_number, response):
+ http_response = response[0]
+ expected_crc = http_response.headers.get(self._header_name)
+ if expected_crc is None:
+ logger.debug(
+ "crc32 check skipped, the %s header is not "
+ "in the http response.",
+ self._header_name,
+ )
+ else:
+ actual_crc32 = crc32(response[0].content) & 0xFFFFFFFF
+ if not actual_crc32 == int(expected_crc):
+ logger.debug(
+ "retry needed: crc32 check failed, expected != actual: "
+ "%s != %s",
+ int(expected_crc),
+ actual_crc32,
+ )
+ raise ChecksumError(
+ checksum_type='crc32',
+ expected_checksum=int(expected_crc),
+ actual_checksum=actual_crc32,
+ )
+
+
+class ExceptionRaiser(BaseChecker):
+ """Raise any caught exceptions.
+
+ This class will raise any non None ``caught_exception``.
+
+ """
+
+ def _check_caught_exception(self, attempt_number, caught_exception):
+ # This is implementation specific, but this class is useful by
+ # coordinating with the MaxAttemptsDecorator.
+ # The MaxAttemptsDecorator has a list of exceptions it should catch
+ # and retry, but something needs to come along and actually raise the
+ # caught_exception. That's what this class is being used for. If
+ # the MaxAttemptsDecorator is not interested in retrying the exception
+ # then this exception just propagates out past the retry code.
+ raise caught_exception
diff --git a/.venv/lib/python3.12/site-packages/botocore/serialize.py b/.venv/lib/python3.12/site-packages/botocore/serialize.py
new file mode 100644
index 00000000..7d2a61d0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/serialize.py
@@ -0,0 +1,1119 @@
+# Copyright 2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+"""Protocol input serializes.
+
+This module contains classes that implement input serialization
+for the various AWS protocol types.
+
+These classes essentially take user input, a model object that
+represents what the expected input should look like, and it returns
+a dictionary that contains the various parts of a request. A few
+high level design decisions:
+
+
+* Each protocol type maps to a separate class, all inherit from
+ ``Serializer``.
+* The return value for ``serialize_to_request`` (the main entry
+ point) returns a dictionary that represents a request. This
+ will have keys like ``url_path``, ``query_string``, etc. This
+ is done so that it's a) easy to test and b) not tied to a
+ particular HTTP library. See the ``serialize_to_request`` docstring
+ for more details.
+
+Unicode
+-------
+
+The input to the serializers should be text (str/unicode), not bytes,
+with the exception of blob types. Those are assumed to be binary,
+and if a str/unicode type is passed in, it will be encoded as utf-8.
+"""
+
+import base64
+import calendar
+import datetime
+import json
+import math
+import re
+import struct
+from xml.etree import ElementTree
+
+from botocore import validate
+from botocore.compat import formatdate
+from botocore.exceptions import ParamValidationError
+from botocore.utils import (
+ has_header,
+ is_json_value_header,
+ parse_to_aware_datetime,
+ percent_encode,
+)
+
+# From the spec, the default timestamp format if not specified is iso8601.
+DEFAULT_TIMESTAMP_FORMAT = 'iso8601'
+ISO8601 = '%Y-%m-%dT%H:%M:%SZ'
+# Same as ISO8601, but with microsecond precision.
+ISO8601_MICRO = '%Y-%m-%dT%H:%M:%S.%fZ'
+HOST_PREFIX_RE = re.compile(r"^[A-Za-z0-9\.\-]+$")
+
+
+def create_serializer(protocol_name, include_validation=True):
+ # TODO: Unknown protocols.
+ serializer = SERIALIZERS[protocol_name]()
+ if include_validation:
+ validator = validate.ParamValidator()
+ serializer = validate.ParamValidationDecorator(validator, serializer)
+ return serializer
+
+
+class Serializer:
+ DEFAULT_METHOD = 'POST'
+ # Clients can change this to a different MutableMapping
+ # (i.e OrderedDict) if they want. This is used in the
+ # compliance test to match the hash ordering used in the
+ # tests.
+ MAP_TYPE = dict
+ DEFAULT_ENCODING = 'utf-8'
+
+ def serialize_to_request(self, parameters, operation_model):
+ """Serialize parameters into an HTTP request.
+
+ This method takes user provided parameters and a shape
+ model and serializes the parameters to an HTTP request.
+ More specifically, this method returns information about
+ parts of the HTTP request, it does not enforce a particular
+ interface or standard for an HTTP request. It instead returns
+ a dictionary of:
+
+ * 'url_path'
+ * 'host_prefix'
+ * 'query_string'
+ * 'headers'
+ * 'body'
+ * 'method'
+
+ It is then up to consumers to decide how to map this to a Request
+ object of their HTTP library of choice. Below is an example
+ return value::
+
+ {'body': {'Action': 'OperationName',
+ 'Bar': 'val2',
+ 'Foo': 'val1',
+ 'Version': '2014-01-01'},
+ 'headers': {},
+ 'method': 'POST',
+ 'query_string': '',
+ 'host_prefix': 'value.',
+ 'url_path': '/'}
+
+ :param parameters: The dictionary input parameters for the
+ operation (i.e the user input).
+ :param operation_model: The OperationModel object that describes
+ the operation.
+ """
+ raise NotImplementedError("serialize_to_request")
+
+ def _create_default_request(self):
+ # Creates a boilerplate default request dict that subclasses
+ # can use as a starting point.
+ serialized = {
+ 'url_path': '/',
+ 'query_string': '',
+ 'method': self.DEFAULT_METHOD,
+ 'headers': {},
+ # An empty body is represented as an empty byte string.
+ 'body': b'',
+ }
+ return serialized
+
+ # Some extra utility methods subclasses can use.
+
+ def _timestamp_iso8601(self, value):
+ if value.microsecond > 0:
+ timestamp_format = ISO8601_MICRO
+ else:
+ timestamp_format = ISO8601
+ return value.strftime(timestamp_format)
+
+ def _timestamp_unixtimestamp(self, value):
+ return int(calendar.timegm(value.timetuple()))
+
+ def _timestamp_rfc822(self, value):
+ if isinstance(value, datetime.datetime):
+ value = self._timestamp_unixtimestamp(value)
+ return formatdate(value, usegmt=True)
+
+ def _convert_timestamp_to_str(self, value, timestamp_format=None):
+ if timestamp_format is None:
+ timestamp_format = self.TIMESTAMP_FORMAT
+ timestamp_format = timestamp_format.lower()
+ datetime_obj = parse_to_aware_datetime(value)
+ converter = getattr(self, f'_timestamp_{timestamp_format}')
+ final_value = converter(datetime_obj)
+ return final_value
+
+ def _get_serialized_name(self, shape, default_name):
+ # Returns the serialized name for the shape if it exists.
+ # Otherwise it will return the passed in default_name.
+ return shape.serialization.get('name', default_name)
+
+ def _get_base64(self, value):
+ # Returns the base64-encoded version of value, handling
+ # both strings and bytes. The returned value is a string
+ # via the default encoding.
+ if isinstance(value, str):
+ value = value.encode(self.DEFAULT_ENCODING)
+ return base64.b64encode(value).strip().decode(self.DEFAULT_ENCODING)
+
+ def _expand_host_prefix(self, parameters, operation_model):
+ operation_endpoint = operation_model.endpoint
+ if (
+ operation_endpoint is None
+ or 'hostPrefix' not in operation_endpoint
+ ):
+ return None
+
+ host_prefix_expression = operation_endpoint['hostPrefix']
+ input_members = operation_model.input_shape.members
+ host_labels = [
+ member
+ for member, shape in input_members.items()
+ if shape.serialization.get('hostLabel')
+ ]
+ format_kwargs = {}
+ bad_labels = []
+ for name in host_labels:
+ param = parameters[name]
+ if not HOST_PREFIX_RE.match(param):
+ bad_labels.append(name)
+ format_kwargs[name] = param
+ if bad_labels:
+ raise ParamValidationError(
+ report=(
+ f"Invalid value for parameter(s): {', '.join(bad_labels)}. "
+ "Must contain only alphanumeric characters, hyphen, "
+ "or period."
+ )
+ )
+ return host_prefix_expression.format(**format_kwargs)
+
+
+class QuerySerializer(Serializer):
+ TIMESTAMP_FORMAT = 'iso8601'
+
+ def serialize_to_request(self, parameters, operation_model):
+ shape = operation_model.input_shape
+ serialized = self._create_default_request()
+ serialized['method'] = operation_model.http.get(
+ 'method', self.DEFAULT_METHOD
+ )
+ serialized['headers'] = {
+ 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'
+ }
+ # The query serializer only deals with body params so
+ # that's what we hand off the _serialize_* methods.
+ body_params = self.MAP_TYPE()
+ body_params['Action'] = operation_model.name
+ body_params['Version'] = operation_model.metadata['apiVersion']
+ if shape is not None:
+ self._serialize(body_params, parameters, shape)
+ serialized['body'] = body_params
+
+ host_prefix = self._expand_host_prefix(parameters, operation_model)
+ if host_prefix is not None:
+ serialized['host_prefix'] = host_prefix
+
+ return serialized
+
+ def _serialize(self, serialized, value, shape, prefix=''):
+ # serialized: The dict that is incrementally added to with the
+ # final serialized parameters.
+ # value: The current user input value.
+ # shape: The shape object that describes the structure of the
+ # input.
+ # prefix: The incrementally built up prefix for the serialized
+ # key (i.e Foo.bar.members.1).
+ method = getattr(
+ self,
+ f'_serialize_type_{shape.type_name}',
+ self._default_serialize,
+ )
+ method(serialized, value, shape, prefix=prefix)
+
+ def _serialize_type_structure(self, serialized, value, shape, prefix=''):
+ members = shape.members
+ for key, value in value.items():
+ member_shape = members[key]
+ member_prefix = self._get_serialized_name(member_shape, key)
+ if prefix:
+ member_prefix = f'{prefix}.{member_prefix}'
+ self._serialize(serialized, value, member_shape, member_prefix)
+
+ def _serialize_type_list(self, serialized, value, shape, prefix=''):
+ if not value:
+ # The query protocol serializes empty lists.
+ serialized[prefix] = ''
+ return
+ if self._is_shape_flattened(shape):
+ list_prefix = prefix
+ if shape.member.serialization.get('name'):
+ name = self._get_serialized_name(shape.member, default_name='')
+ # Replace '.Original' with '.{name}'.
+ list_prefix = '.'.join(prefix.split('.')[:-1] + [name])
+ else:
+ list_name = shape.member.serialization.get('name', 'member')
+ list_prefix = f'{prefix}.{list_name}'
+ for i, element in enumerate(value, 1):
+ element_prefix = f'{list_prefix}.{i}'
+ element_shape = shape.member
+ self._serialize(serialized, element, element_shape, element_prefix)
+
+ def _serialize_type_map(self, serialized, value, shape, prefix=''):
+ if self._is_shape_flattened(shape):
+ full_prefix = prefix
+ else:
+ full_prefix = f'{prefix}.entry'
+ template = full_prefix + '.{i}.{suffix}'
+ key_shape = shape.key
+ value_shape = shape.value
+ key_suffix = self._get_serialized_name(key_shape, default_name='key')
+ value_suffix = self._get_serialized_name(value_shape, 'value')
+ for i, key in enumerate(value, 1):
+ key_prefix = template.format(i=i, suffix=key_suffix)
+ value_prefix = template.format(i=i, suffix=value_suffix)
+ self._serialize(serialized, key, key_shape, key_prefix)
+ self._serialize(serialized, value[key], value_shape, value_prefix)
+
+ def _serialize_type_blob(self, serialized, value, shape, prefix=''):
+ # Blob args must be base64 encoded.
+ serialized[prefix] = self._get_base64(value)
+
+ def _serialize_type_timestamp(self, serialized, value, shape, prefix=''):
+ serialized[prefix] = self._convert_timestamp_to_str(
+ value, shape.serialization.get('timestampFormat')
+ )
+
+ def _serialize_type_boolean(self, serialized, value, shape, prefix=''):
+ if value:
+ serialized[prefix] = 'true'
+ else:
+ serialized[prefix] = 'false'
+
+ def _default_serialize(self, serialized, value, shape, prefix=''):
+ serialized[prefix] = value
+
+ def _is_shape_flattened(self, shape):
+ return shape.serialization.get('flattened')
+
+
+class EC2Serializer(QuerySerializer):
+ """EC2 specific customizations to the query protocol serializers.
+
+ The EC2 model is almost, but not exactly, similar to the query protocol
+ serializer. This class encapsulates those differences. The model
+ will have be marked with a ``protocol`` of ``ec2``, so you don't need
+ to worry about wiring this class up correctly.
+
+ """
+
+ def _get_serialized_name(self, shape, default_name):
+ # Returns the serialized name for the shape if it exists.
+ # Otherwise it will return the passed in default_name.
+ if 'queryName' in shape.serialization:
+ return shape.serialization['queryName']
+ elif 'name' in shape.serialization:
+ # A locationName is always capitalized
+ # on input for the ec2 protocol.
+ name = shape.serialization['name']
+ return name[0].upper() + name[1:]
+ else:
+ return default_name
+
+ def _serialize_type_list(self, serialized, value, shape, prefix=''):
+ for i, element in enumerate(value, 1):
+ element_prefix = f'{prefix}.{i}'
+ element_shape = shape.member
+ self._serialize(serialized, element, element_shape, element_prefix)
+
+
+class JSONSerializer(Serializer):
+ TIMESTAMP_FORMAT = 'unixtimestamp'
+
+ def serialize_to_request(self, parameters, operation_model):
+ target = '{}.{}'.format(
+ operation_model.metadata['targetPrefix'],
+ operation_model.name,
+ )
+ json_version = operation_model.metadata['jsonVersion']
+ serialized = self._create_default_request()
+ serialized['method'] = operation_model.http.get(
+ 'method', self.DEFAULT_METHOD
+ )
+ serialized['headers'] = {
+ 'X-Amz-Target': target,
+ 'Content-Type': f'application/x-amz-json-{json_version}',
+ }
+ body = self.MAP_TYPE()
+ input_shape = operation_model.input_shape
+ if input_shape is not None:
+ self._serialize(body, parameters, input_shape)
+ serialized['body'] = json.dumps(body).encode(self.DEFAULT_ENCODING)
+
+ host_prefix = self._expand_host_prefix(parameters, operation_model)
+ if host_prefix is not None:
+ serialized['host_prefix'] = host_prefix
+
+ return serialized
+
+ def _serialize(self, serialized, value, shape, key=None):
+ method = getattr(
+ self,
+ f'_serialize_type_{shape.type_name}',
+ self._default_serialize,
+ )
+ method(serialized, value, shape, key)
+
+ def _serialize_type_structure(self, serialized, value, shape, key):
+ if shape.is_document_type:
+ serialized[key] = value
+ else:
+ if key is not None:
+ # If a key is provided, this is a result of a recursive
+ # call so we need to add a new child dict as the value
+ # of the passed in serialized dict. We'll then add
+ # all the structure members as key/vals in the new serialized
+ # dictionary we just created.
+ new_serialized = self.MAP_TYPE()
+ serialized[key] = new_serialized
+ serialized = new_serialized
+ members = shape.members
+ for member_key, member_value in value.items():
+ member_shape = members[member_key]
+ if 'name' in member_shape.serialization:
+ member_key = member_shape.serialization['name']
+ self._serialize(
+ serialized, member_value, member_shape, member_key
+ )
+
+ def _serialize_type_map(self, serialized, value, shape, key):
+ map_obj = self.MAP_TYPE()
+ serialized[key] = map_obj
+ for sub_key, sub_value in value.items():
+ self._serialize(map_obj, sub_value, shape.value, sub_key)
+
+ def _serialize_type_list(self, serialized, value, shape, key):
+ list_obj = []
+ serialized[key] = list_obj
+ for list_item in value:
+ wrapper = {}
+ # The JSON list serialization is the only case where we aren't
+ # setting a key on a dict. We handle this by using
+ # a __current__ key on a wrapper dict to serialize each
+ # list item before appending it to the serialized list.
+ self._serialize(wrapper, list_item, shape.member, "__current__")
+ list_obj.append(wrapper["__current__"])
+
+ def _default_serialize(self, serialized, value, shape, key):
+ serialized[key] = value
+
+ def _serialize_type_timestamp(self, serialized, value, shape, key):
+ serialized[key] = self._convert_timestamp_to_str(
+ value, shape.serialization.get('timestampFormat')
+ )
+
+ def _serialize_type_blob(self, serialized, value, shape, key):
+ serialized[key] = self._get_base64(value)
+
+
+class CBORSerializer(Serializer):
+ UNSIGNED_INT_MAJOR_TYPE = 0
+ NEGATIVE_INT_MAJOR_TYPE = 1
+ BLOB_MAJOR_TYPE = 2
+ STRING_MAJOR_TYPE = 3
+ LIST_MAJOR_TYPE = 4
+ MAP_MAJOR_TYPE = 5
+ TAG_MAJOR_TYPE = 6
+ FLOAT_AND_SIMPLE_MAJOR_TYPE = 7
+
+ def _serialize_data_item(self, serialized, value, shape, key=None):
+ method = getattr(self, f'_serialize_type_{shape.type_name}')
+ if method is None:
+ raise ValueError(
+ f"Unrecognized C2J type: {shape.type_name}, unable to "
+ f"serialize request"
+ )
+ method(serialized, value, shape, key)
+
+ def _serialize_type_integer(self, serialized, value, shape, key):
+ if value >= 0:
+ major_type = self.UNSIGNED_INT_MAJOR_TYPE
+ else:
+ major_type = self.NEGATIVE_INT_MAJOR_TYPE
+ # The only differences in serializing negative and positive integers is
+ # that for negative, we set the major type to 1 and set the value to -1
+ # minus the value
+ value = -1 - value
+ additional_info, num_bytes = self._get_additional_info_and_num_bytes(
+ value
+ )
+ initial_byte = self._get_initial_byte(major_type, additional_info)
+ if num_bytes == 0:
+ serialized.extend(initial_byte)
+ else:
+ serialized.extend(initial_byte + value.to_bytes(num_bytes, "big"))
+
+ def _serialize_type_long(self, serialized, value, shape, key):
+ self._serialize_type_integer(serialized, value, shape, key)
+
+ def _serialize_type_blob(self, serialized, value, shape, key):
+ if isinstance(value, str):
+ value = value.encode('utf-8')
+ elif not isinstance(value, (bytes, bytearray)):
+ # We support file-like objects for blobs; these already have been
+ # validated to ensure they have a read method
+ value = value.read()
+ length = len(value)
+ additional_info, num_bytes = self._get_additional_info_and_num_bytes(
+ length
+ )
+ initial_byte = self._get_initial_byte(
+ self.BLOB_MAJOR_TYPE, additional_info
+ )
+ if num_bytes == 0:
+ serialized.extend(initial_byte)
+ else:
+ serialized.extend(initial_byte + length.to_bytes(num_bytes, "big"))
+ serialized.extend(value)
+
+ def _serialize_type_string(self, serialized, value, shape, key):
+ encoded = value.encode('utf-8')
+ length = len(encoded)
+ additional_info, num_bytes = self._get_additional_info_and_num_bytes(
+ length
+ )
+ initial_byte = self._get_initial_byte(
+ self.STRING_MAJOR_TYPE, additional_info
+ )
+ if num_bytes == 0:
+ serialized.extend(initial_byte + encoded)
+ else:
+ serialized.extend(
+ initial_byte + length.to_bytes(num_bytes, "big") + encoded
+ )
+
+ def _serialize_type_list(self, serialized, value, shape, key):
+ length = len(value)
+ additional_info, num_bytes = self._get_additional_info_and_num_bytes(
+ length
+ )
+ initial_byte = self._get_initial_byte(
+ self.LIST_MAJOR_TYPE, additional_info
+ )
+ if num_bytes == 0:
+ serialized.extend(initial_byte)
+ else:
+ serialized.extend(initial_byte + length.to_bytes(num_bytes, "big"))
+ for item in value:
+ self._serialize_data_item(serialized, item, shape.member)
+
+ def _serialize_type_map(self, serialized, value, shape, key):
+ length = len(value)
+ additional_info, num_bytes = self._get_additional_info_and_num_bytes(
+ length
+ )
+ initial_byte = self._get_initial_byte(
+ self.MAP_MAJOR_TYPE, additional_info
+ )
+ if num_bytes == 0:
+ serialized.extend(initial_byte)
+ else:
+ serialized.extend(initial_byte + length.to_bytes(num_bytes, "big"))
+ for key_item, item in value.items():
+ self._serialize_data_item(serialized, key_item, shape.key)
+ self._serialize_data_item(serialized, item, shape.value)
+
+ def _serialize_type_structure(self, serialized, value, shape, key):
+ if key is not None:
+ # For nested structures, we need to serialize the key first
+ self._serialize_data_item(serialized, key, shape.key_shape)
+
+ # Remove `None` values from the dictionary
+ value = {k: v for k, v in value.items() if v is not None}
+
+ map_length = len(value)
+ additional_info, num_bytes = self._get_additional_info_and_num_bytes(
+ map_length
+ )
+ initial_byte = self._get_initial_byte(
+ self.MAP_MAJOR_TYPE, additional_info
+ )
+ if num_bytes == 0:
+ serialized.extend(initial_byte)
+ else:
+ serialized.extend(
+ initial_byte + map_length.to_bytes(num_bytes, "big")
+ )
+
+ members = shape.members
+ for member_key, member_value in value.items():
+ member_shape = members[member_key]
+ if 'name' in member_shape.serialization:
+ member_key = member_shape.serialization['name']
+ if member_value is not None:
+ self._serialize_type_string(serialized, member_key, None, None)
+ self._serialize_data_item(
+ serialized, member_value, member_shape
+ )
+
+ def _serialize_type_timestamp(self, serialized, value, shape, key):
+ timestamp = self._convert_timestamp_to_str(value)
+ tag = 1 # Use tag 1 for unix timestamp
+ initial_byte = self._get_initial_byte(self.TAG_MAJOR_TYPE, tag)
+ serialized.extend(initial_byte) # Tagging the timestamp
+ additional_info, num_bytes = self._get_additional_info_and_num_bytes(
+ timestamp
+ )
+
+ if num_bytes == 0:
+ initial_byte = self._get_initial_byte(
+ self.UNSIGNED_INT_MAJOR_TYPE, timestamp
+ )
+ serialized.extend(initial_byte)
+ else:
+ initial_byte = self._get_initial_byte(
+ self.UNSIGNED_INT_MAJOR_TYPE, additional_info
+ )
+ serialized.extend(
+ initial_byte + timestamp.to_bytes(num_bytes, "big")
+ )
+
+ def _serialize_type_float(self, serialized, value, shape, key):
+ if self._is_special_number(value):
+ serialized.extend(
+ self._get_bytes_for_special_numbers(value)
+ ) # Handle special values like NaN or Infinity
+ else:
+ initial_byte = self._get_initial_byte(
+ self.FLOAT_AND_SIMPLE_MAJOR_TYPE, 26
+ )
+ serialized.extend(initial_byte + struct.pack(">f", value))
+
+ def _serialize_type_double(self, serialized, value, shape, key):
+ if self._is_special_number(value):
+ serialized.extend(
+ self._get_bytes_for_special_numbers(value)
+ ) # Handle special values like NaN or Infinity
+ else:
+ initial_byte = self._get_initial_byte(
+ self.FLOAT_AND_SIMPLE_MAJOR_TYPE, 27
+ )
+ serialized.extend(initial_byte + struct.pack(">d", value))
+
+ def _serialize_type_boolean(self, serialized, value, shape, key):
+ additional_info = 21 if value else 20
+ serialized.extend(
+ self._get_initial_byte(
+ self.FLOAT_AND_SIMPLE_MAJOR_TYPE, additional_info
+ )
+ )
+
+ def _get_additional_info_and_num_bytes(self, value):
+ # Values under 24 can be stored in the initial byte and don't need further
+ # encoding
+ if value < 24:
+ return value, 0
+ # Values between 24 and 255 (inclusive) can be stored in 1 byte and
+ # correspond to additional info 24
+ elif value < 256:
+ return 24, 1
+ # Values up to 65535 can be stored in two bytes and correspond to additional
+ # info 25
+ elif value < 65536:
+ return 25, 2
+ # Values up to 4294967296 can be stored in four bytes and correspond to
+ # additional info 26
+ elif value < 4294967296:
+ return 26, 4
+ # The maximum number of bytes in a definite length data items is 8 which
+ # to additional info 27
+ else:
+ return 27, 8
+
+ def _get_initial_byte(self, major_type, additional_info):
+ # The highest order three bits are the major type, so we need to bitshift the
+ # major type by 5
+ major_type_bytes = major_type << 5
+ return (major_type_bytes | additional_info).to_bytes(1, "big")
+
+ def _is_special_number(self, value):
+ return any(
+ [
+ value == float('inf'),
+ value == float('-inf'),
+ math.isnan(value),
+ ]
+ )
+
+ def _get_bytes_for_special_numbers(self, value):
+ additional_info = 25
+ initial_byte = self._get_initial_byte(
+ self.FLOAT_AND_SIMPLE_MAJOR_TYPE, additional_info
+ )
+ if value == float('inf'):
+ return initial_byte + struct.pack(">H", 0x7C00)
+ elif value == float('-inf'):
+ return initial_byte + struct.pack(">H", 0xFC00)
+ elif math.isnan(value):
+ return initial_byte + struct.pack(">H", 0x7E00)
+
+
+class BaseRestSerializer(Serializer):
+ """Base class for rest protocols.
+
+ The only variance between the various rest protocols is the
+ way that the body is serialized. All other aspects (headers, uri, etc.)
+ are the same and logic for serializing those aspects lives here.
+
+ Subclasses must implement the ``_serialize_body_params`` method.
+
+ """
+
+ QUERY_STRING_TIMESTAMP_FORMAT = 'iso8601'
+ HEADER_TIMESTAMP_FORMAT = 'rfc822'
+ # This is a list of known values for the "location" key in the
+ # serialization dict. The location key tells us where on the request
+ # to put the serialized value.
+ KNOWN_LOCATIONS = ['uri', 'querystring', 'header', 'headers']
+
+ def serialize_to_request(self, parameters, operation_model):
+ serialized = self._create_default_request()
+ serialized['method'] = operation_model.http.get(
+ 'method', self.DEFAULT_METHOD
+ )
+ shape = operation_model.input_shape
+ if shape is None:
+ serialized['url_path'] = operation_model.http['requestUri']
+ return serialized
+ shape_members = shape.members
+ # While the ``serialized`` key holds the final serialized request
+ # data, we need interim dicts for the various locations of the
+ # request. We need this for the uri_path_kwargs and the
+ # query_string_kwargs because they are templated, so we need
+ # to gather all the needed data for the string template,
+ # then we render the template. The body_kwargs is needed
+ # because once we've collected them all, we run them through
+ # _serialize_body_params, which for rest-json, creates JSON,
+ # and for rest-xml, will create XML. This is what the
+ # ``partitioned`` dict below is for.
+ partitioned = {
+ 'uri_path_kwargs': self.MAP_TYPE(),
+ 'query_string_kwargs': self.MAP_TYPE(),
+ 'body_kwargs': self.MAP_TYPE(),
+ 'headers': self.MAP_TYPE(),
+ }
+ for param_name, param_value in parameters.items():
+ if param_value is None:
+ # Don't serialize any parameter with a None value.
+ continue
+ self._partition_parameters(
+ partitioned, param_name, param_value, shape_members
+ )
+ serialized['url_path'] = self._render_uri_template(
+ operation_model.http['requestUri'], partitioned['uri_path_kwargs']
+ )
+
+ if 'authPath' in operation_model.http:
+ serialized['auth_path'] = self._render_uri_template(
+ operation_model.http['authPath'],
+ partitioned['uri_path_kwargs'],
+ )
+ # Note that we lean on the http implementation to handle the case
+ # where the requestUri path already has query parameters.
+ # The bundled http client, requests, already supports this.
+ serialized['query_string'] = partitioned['query_string_kwargs']
+ if partitioned['headers']:
+ serialized['headers'] = partitioned['headers']
+ self._serialize_payload(
+ partitioned, parameters, serialized, shape, shape_members
+ )
+ self._serialize_content_type(serialized, shape, shape_members)
+
+ host_prefix = self._expand_host_prefix(parameters, operation_model)
+ if host_prefix is not None:
+ serialized['host_prefix'] = host_prefix
+
+ return serialized
+
+ def _render_uri_template(self, uri_template, params):
+ # We need to handle two cases::
+ #
+ # /{Bucket}/foo
+ # /{Key+}/bar
+ # A label ending with '+' is greedy. There can only
+ # be one greedy key.
+ encoded_params = {}
+ for template_param in re.findall(r'{(.*?)}', uri_template):
+ if template_param.endswith('+'):
+ encoded_params[template_param] = percent_encode(
+ params[template_param[:-1]], safe='/~'
+ )
+ else:
+ encoded_params[template_param] = percent_encode(
+ params[template_param]
+ )
+ return uri_template.format(**encoded_params)
+
+ def _serialize_payload(
+ self, partitioned, parameters, serialized, shape, shape_members
+ ):
+ # partitioned - The user input params partitioned by location.
+ # parameters - The user input params.
+ # serialized - The final serialized request dict.
+ # shape - Describes the expected input shape
+ # shape_members - The members of the input struct shape
+ payload_member = shape.serialization.get('payload')
+ if self._has_streaming_payload(payload_member, shape_members):
+ # If it's streaming, then the body is just the
+ # value of the payload.
+ body_payload = parameters.get(payload_member, b'')
+ body_payload = self._encode_payload(body_payload)
+ serialized['body'] = body_payload
+ elif payload_member is not None:
+ # If there's a payload member, we serialized that
+ # member to they body.
+ body_params = parameters.get(payload_member)
+ if body_params is not None:
+ serialized['body'] = self._serialize_body_params(
+ body_params, shape_members[payload_member]
+ )
+ else:
+ serialized['body'] = self._serialize_empty_body()
+ elif partitioned['body_kwargs']:
+ serialized['body'] = self._serialize_body_params(
+ partitioned['body_kwargs'], shape
+ )
+ elif self._requires_empty_body(shape):
+ serialized['body'] = self._serialize_empty_body()
+
+ def _serialize_empty_body(self):
+ return b''
+
+ def _serialize_content_type(self, serialized, shape, shape_members):
+ """
+ Some protocols require varied Content-Type headers
+ depending on user input. This allows subclasses to apply
+ this conditionally.
+ """
+ pass
+
+ def _requires_empty_body(self, shape):
+ """
+ Some protocols require a specific body to represent an empty
+ payload. This allows subclasses to apply this conditionally.
+ """
+ return False
+
+ def _has_streaming_payload(self, payload, shape_members):
+ """Determine if payload is streaming (a blob or string)."""
+ return payload is not None and shape_members[payload].type_name in (
+ 'blob',
+ 'string',
+ )
+
+ def _encode_payload(self, body):
+ if isinstance(body, str):
+ return body.encode(self.DEFAULT_ENCODING)
+ return body
+
+ def _partition_parameters(
+ self, partitioned, param_name, param_value, shape_members
+ ):
+ # This takes the user provided input parameter (``param``)
+ # and figures out where they go in the request dict.
+ # Some params are HTTP headers, some are used in the URI, some
+ # are in the request body. This method deals with this.
+ member = shape_members[param_name]
+ location = member.serialization.get('location')
+ key_name = member.serialization.get('name', param_name)
+ if location == 'uri':
+ partitioned['uri_path_kwargs'][key_name] = param_value
+ elif location == 'querystring':
+ if isinstance(param_value, dict):
+ partitioned['query_string_kwargs'].update(param_value)
+ elif isinstance(param_value, bool):
+ bool_str = str(param_value).lower()
+ partitioned['query_string_kwargs'][key_name] = bool_str
+ elif member.type_name == 'timestamp':
+ timestamp_format = member.serialization.get(
+ 'timestampFormat', self.QUERY_STRING_TIMESTAMP_FORMAT
+ )
+ timestamp = self._convert_timestamp_to_str(
+ param_value, timestamp_format
+ )
+ partitioned['query_string_kwargs'][key_name] = timestamp
+ else:
+ partitioned['query_string_kwargs'][key_name] = param_value
+ elif location == 'header':
+ shape = shape_members[param_name]
+ if not param_value and shape.type_name == 'list':
+ # Empty lists should not be set on the headers
+ return
+ value = self._convert_header_value(shape, param_value)
+ partitioned['headers'][key_name] = str(value)
+ elif location == 'headers':
+ # 'headers' is a bit of an oddball. The ``key_name``
+ # is actually really a prefix for the header names:
+ header_prefix = key_name
+ # The value provided by the user is a dict so we'll be
+ # creating multiple header key/val pairs. The key
+ # name to use for each header is the header_prefix (``key_name``)
+ # plus the key provided by the user.
+ self._do_serialize_header_map(
+ header_prefix, partitioned['headers'], param_value
+ )
+ else:
+ partitioned['body_kwargs'][param_name] = param_value
+
+ def _do_serialize_header_map(self, header_prefix, headers, user_input):
+ for key, val in user_input.items():
+ full_key = header_prefix + key
+ headers[full_key] = val
+
+ def _serialize_body_params(self, params, shape):
+ raise NotImplementedError('_serialize_body_params')
+
+ def _convert_header_value(self, shape, value):
+ if shape.type_name == 'timestamp':
+ datetime_obj = parse_to_aware_datetime(value)
+ timestamp = calendar.timegm(datetime_obj.utctimetuple())
+ timestamp_format = shape.serialization.get(
+ 'timestampFormat', self.HEADER_TIMESTAMP_FORMAT
+ )
+ return self._convert_timestamp_to_str(timestamp, timestamp_format)
+ elif shape.type_name == 'list':
+ converted_value = [
+ self._convert_header_value(shape.member, v)
+ for v in value
+ if v is not None
+ ]
+ return ",".join(converted_value)
+ elif is_json_value_header(shape):
+ # Serialize with no spaces after separators to save space in
+ # the header.
+ return self._get_base64(json.dumps(value, separators=(',', ':')))
+ else:
+ return value
+
+
+class BaseRpcV2Serializer(Serializer):
+ """Base class for RPCv2 protocols.
+
+ The only variance between the various RPCv2 protocols is the
+ way that the body is serialized. All other aspects (headers, uri, etc.)
+ are the same and logic for serializing those aspects lives here.
+
+ Subclasses must implement the ``_serialize_body_params`` and
+ ``_serialize_headers`` methods.
+
+ """
+
+ def serialize_to_request(self, parameters, operation_model):
+ serialized = self._create_default_request()
+ service_name = operation_model.service_model.metadata['targetPrefix']
+ operation_name = operation_model.name
+ serialized['url_path'] = (
+ f'/service/{service_name}/operation/{operation_name}'
+ )
+
+ input_shape = operation_model.input_shape
+ if input_shape is not None:
+ self._serialize_payload(parameters, serialized, input_shape)
+
+ self._serialize_headers(serialized, operation_model)
+
+ return serialized
+
+ def _serialize_payload(self, parameters, serialized, shape):
+ body_payload = self._serialize_body_params(parameters, shape)
+ serialized['body'] = body_payload
+
+ def _serialize_headers(self, serialized, operation_model):
+ raise NotImplementedError("_serialize_headers")
+
+ def _serialize_body_params(self, parameters, shape):
+ raise NotImplementedError("_serialize_body_params")
+
+
+class RestJSONSerializer(BaseRestSerializer, JSONSerializer):
+ def _serialize_empty_body(self):
+ return b'{}'
+
+ def _requires_empty_body(self, shape):
+ """
+ Serialize an empty JSON object whenever the shape has
+ members not targeting a location.
+ """
+ for member, val in shape.members.items():
+ if 'location' not in val.serialization:
+ return True
+ return False
+
+ def _serialize_content_type(self, serialized, shape, shape_members):
+ """Set Content-Type to application/json for all structured bodies."""
+ payload = shape.serialization.get('payload')
+ if self._has_streaming_payload(payload, shape_members):
+ # Don't apply content-type to streaming bodies
+ return
+
+ has_body = serialized['body'] != b''
+ has_content_type = has_header('Content-Type', serialized['headers'])
+ if has_body and not has_content_type:
+ serialized['headers']['Content-Type'] = 'application/json'
+
+ def _serialize_body_params(self, params, shape):
+ serialized_body = self.MAP_TYPE()
+ self._serialize(serialized_body, params, shape)
+ return json.dumps(serialized_body).encode(self.DEFAULT_ENCODING)
+
+
+class RestXMLSerializer(BaseRestSerializer):
+ TIMESTAMP_FORMAT = 'iso8601'
+
+ def _serialize_body_params(self, params, shape):
+ root_name = shape.serialization['name']
+ pseudo_root = ElementTree.Element('')
+ self._serialize(shape, params, pseudo_root, root_name)
+ real_root = list(pseudo_root)[0]
+ return ElementTree.tostring(real_root, encoding=self.DEFAULT_ENCODING)
+
+ def _serialize(self, shape, params, xmlnode, name):
+ method = getattr(
+ self,
+ f'_serialize_type_{shape.type_name}',
+ self._default_serialize,
+ )
+ method(xmlnode, params, shape, name)
+
+ def _serialize_type_structure(self, xmlnode, params, shape, name):
+ structure_node = ElementTree.SubElement(xmlnode, name)
+
+ if 'xmlNamespace' in shape.serialization:
+ namespace_metadata = shape.serialization['xmlNamespace']
+ attribute_name = 'xmlns'
+ if namespace_metadata.get('prefix'):
+ attribute_name += f":{namespace_metadata['prefix']}"
+ structure_node.attrib[attribute_name] = namespace_metadata['uri']
+ for key, value in params.items():
+ member_shape = shape.members[key]
+ member_name = member_shape.serialization.get('name', key)
+ # We need to special case member shapes that are marked as an
+ # xmlAttribute. Rather than serializing into an XML child node,
+ # we instead serialize the shape to an XML attribute of the
+ # *current* node.
+ if value is None:
+ # Don't serialize any param whose value is None.
+ return
+ if member_shape.serialization.get('xmlAttribute'):
+ # xmlAttributes must have a serialization name.
+ xml_attribute_name = member_shape.serialization['name']
+ structure_node.attrib[xml_attribute_name] = value
+ continue
+ self._serialize(member_shape, value, structure_node, member_name)
+
+ def _serialize_type_list(self, xmlnode, params, shape, name):
+ member_shape = shape.member
+ if shape.serialization.get('flattened'):
+ element_name = name
+ list_node = xmlnode
+ else:
+ element_name = member_shape.serialization.get('name', 'member')
+ list_node = ElementTree.SubElement(xmlnode, name)
+ for item in params:
+ self._serialize(member_shape, item, list_node, element_name)
+
+ def _serialize_type_map(self, xmlnode, params, shape, name):
+ # Given the ``name`` of MyMap, and input of {"key1": "val1"}
+ # we serialize this as:
+ # <MyMap>
+ # <entry>
+ # <key>key1</key>
+ # <value>val1</value>
+ # </entry>
+ # </MyMap>
+ node = ElementTree.SubElement(xmlnode, name)
+ # TODO: handle flattened maps.
+ for key, value in params.items():
+ entry_node = ElementTree.SubElement(node, 'entry')
+ key_name = self._get_serialized_name(shape.key, default_name='key')
+ val_name = self._get_serialized_name(
+ shape.value, default_name='value'
+ )
+ self._serialize(shape.key, key, entry_node, key_name)
+ self._serialize(shape.value, value, entry_node, val_name)
+
+ def _serialize_type_boolean(self, xmlnode, params, shape, name):
+ # For scalar types, the 'params' attr is actually just a scalar
+ # value representing the data we need to serialize as a boolean.
+ # It will either be 'true' or 'false'
+ node = ElementTree.SubElement(xmlnode, name)
+ if params:
+ str_value = 'true'
+ else:
+ str_value = 'false'
+ node.text = str_value
+
+ def _serialize_type_blob(self, xmlnode, params, shape, name):
+ node = ElementTree.SubElement(xmlnode, name)
+ node.text = self._get_base64(params)
+
+ def _serialize_type_timestamp(self, xmlnode, params, shape, name):
+ node = ElementTree.SubElement(xmlnode, name)
+ node.text = self._convert_timestamp_to_str(
+ params, shape.serialization.get('timestampFormat')
+ )
+
+ def _default_serialize(self, xmlnode, params, shape, name):
+ node = ElementTree.SubElement(xmlnode, name)
+ node.text = str(params)
+
+
+class RpcV2CBORSerializer(BaseRpcV2Serializer, CBORSerializer):
+ TIMESTAMP_FORMAT = 'unixtimestamp'
+
+ def _serialize_body_params(self, parameters, input_shape):
+ body = bytearray()
+ self._serialize_data_item(body, parameters, input_shape)
+ return bytes(body)
+
+ def _serialize_headers(self, serialized, operation_model):
+ serialized['headers']['smithy-protocol'] = 'rpc-v2-cbor'
+
+ if operation_model.has_event_stream_output:
+ header_val = 'application/vnd.amazon.eventstream'
+ else:
+ header_val = 'application/cbor'
+
+ has_body = serialized['body'] != b''
+ has_content_type = has_header('Content-Type', serialized['headers'])
+
+ serialized['headers']['Accept'] = header_val
+ if not has_content_type and has_body:
+ serialized['headers']['Content-Type'] = header_val
+
+
+SERIALIZERS = {
+ 'ec2': EC2Serializer,
+ 'query': QuerySerializer,
+ 'json': JSONSerializer,
+ 'rest-json': RestJSONSerializer,
+ 'rest-xml': RestXMLSerializer,
+ 'smithy-rpc-v2-cbor': RpcV2CBORSerializer,
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/session.py b/.venv/lib/python3.12/site-packages/botocore/session.py
new file mode 100644
index 00000000..740db2fd
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/session.py
@@ -0,0 +1,1299 @@
+# Copyright (c) 2012-2013 Mitch Garnaat http://garnaat.org/
+# Copyright 2012-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+"""
+This module contains the main interface to the botocore package, the
+Session object.
+"""
+
+import copy
+import logging
+import os
+import platform
+import socket
+import warnings
+
+import botocore.client
+import botocore.configloader
+import botocore.credentials
+import botocore.tokens
+from botocore import (
+ UNSIGNED,
+ __version__,
+ handlers,
+ invoke_initializers,
+ monitoring,
+ paginate,
+ retryhandler,
+ translate,
+ waiter,
+)
+from botocore.compat import HAS_CRT, MutableMapping
+from botocore.configprovider import (
+ BOTOCORE_DEFAUT_SESSION_VARIABLES,
+ ConfigChainFactory,
+ ConfiguredEndpointProvider,
+ ConfigValueStore,
+ DefaultConfigResolver,
+ SmartDefaultsConfigStoreFactory,
+ create_botocore_default_config_mapping,
+)
+from botocore.context import get_context, with_current_context
+from botocore.errorfactory import ClientExceptionsFactory
+from botocore.exceptions import (
+ ConfigNotFound,
+ InvalidDefaultsMode,
+ PartialCredentialsError,
+ ProfileNotFound,
+ UnknownServiceError,
+)
+from botocore.hooks import (
+ EventAliaser,
+ HierarchicalEmitter,
+ first_non_none_response,
+)
+from botocore.loaders import create_loader
+from botocore.model import ServiceModel
+from botocore.parsers import ResponseParserFactory
+from botocore.regions import EndpointResolver
+from botocore.useragent import UserAgentString
+from botocore.utils import (
+ EVENT_ALIASES,
+ IMDSRegionProvider,
+ validate_region_name,
+)
+
+from botocore.compat import HAS_CRT # noqa
+
+
+logger = logging.getLogger(__name__)
+
+
+class Session:
+ """
+ The Session object collects together useful functionality
+ from `botocore` as well as important data such as configuration
+ information and credentials into a single, easy-to-use object.
+
+ :ivar available_profiles: A list of profiles defined in the config
+ file associated with this session.
+ :ivar profile: The current profile.
+ """
+
+ SESSION_VARIABLES = copy.copy(BOTOCORE_DEFAUT_SESSION_VARIABLES)
+
+ #: The default format string to use when configuring the botocore logger.
+ LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
+
+ def __init__(
+ self,
+ session_vars=None,
+ event_hooks=None,
+ include_builtin_handlers=True,
+ profile=None,
+ ):
+ """
+ Create a new Session object.
+
+ :type session_vars: dict
+ :param session_vars: A dictionary that is used to override some or all
+ of the environment variables associated with this session. The
+ key/value pairs defined in this dictionary will override the
+ corresponding variables defined in ``SESSION_VARIABLES``.
+
+ :type event_hooks: BaseEventHooks
+ :param event_hooks: The event hooks object to use. If one is not
+ provided, an event hooks object will be automatically created
+ for you.
+
+ :type include_builtin_handlers: bool
+ :param include_builtin_handlers: Indicates whether or not to
+ automatically register builtin handlers.
+
+ :type profile: str
+ :param profile: The name of the profile to use for this
+ session. Note that the profile can only be set when
+ the session is created.
+
+ """
+ if event_hooks is None:
+ self._original_handler = HierarchicalEmitter()
+ else:
+ self._original_handler = event_hooks
+ self._events = EventAliaser(self._original_handler)
+ if include_builtin_handlers:
+ self._register_builtin_handlers(self._events)
+ self.user_agent_name = 'Botocore'
+ self.user_agent_version = __version__
+ self.user_agent_extra = ''
+ # The _profile attribute is just used to cache the value
+ # of the current profile to avoid going through the normal
+ # config lookup process each access time.
+ self._profile = None
+ self._config = None
+ self._credentials = None
+ self._auth_token = None
+ self._profile_map = None
+ # This is a dict that stores per session specific config variable
+ # overrides via set_config_variable().
+ self._session_instance_vars = {}
+ if profile is not None:
+ self._session_instance_vars['profile'] = profile
+ self._client_config = None
+ self._last_client_region_used = None
+ self._components = ComponentLocator()
+ self._internal_components = ComponentLocator()
+ self._register_components()
+ self.session_var_map = SessionVarDict(self, self.SESSION_VARIABLES)
+ if session_vars is not None:
+ self.session_var_map.update(session_vars)
+ invoke_initializers(self)
+
+ def _register_components(self):
+ self._register_credential_provider()
+ self._register_token_provider()
+ self._register_data_loader()
+ self._register_endpoint_resolver()
+ self._register_event_emitter()
+ self._register_response_parser_factory()
+ self._register_exceptions_factory()
+ self._register_config_store()
+ self._register_monitor()
+ self._register_default_config_resolver()
+ self._register_smart_defaults_factory()
+ self._register_user_agent_creator()
+
+ def _register_event_emitter(self):
+ self._components.register_component('event_emitter', self._events)
+
+ def _register_token_provider(self):
+ self._components.lazy_register_component(
+ 'token_provider', self._create_token_resolver
+ )
+
+ def _create_token_resolver(self):
+ return botocore.tokens.create_token_resolver(self)
+
+ def _register_credential_provider(self):
+ self._components.lazy_register_component(
+ 'credential_provider', self._create_credential_resolver
+ )
+
+ def _create_credential_resolver(self):
+ return botocore.credentials.create_credential_resolver(
+ self, region_name=self._last_client_region_used
+ )
+
+ def _register_data_loader(self):
+ self._components.lazy_register_component(
+ 'data_loader',
+ lambda: create_loader(self.get_config_variable('data_path')),
+ )
+
+ def _register_endpoint_resolver(self):
+ def create_default_resolver():
+ loader = self.get_component('data_loader')
+ endpoints, path = loader.load_data_with_path('endpoints')
+ uses_builtin = loader.is_builtin_path(path)
+ return EndpointResolver(endpoints, uses_builtin_data=uses_builtin)
+
+ self._internal_components.lazy_register_component(
+ 'endpoint_resolver', create_default_resolver
+ )
+
+ def _register_default_config_resolver(self):
+ def create_default_config_resolver():
+ loader = self.get_component('data_loader')
+ defaults = loader.load_data('sdk-default-configuration')
+ return DefaultConfigResolver(defaults)
+
+ self._internal_components.lazy_register_component(
+ 'default_config_resolver', create_default_config_resolver
+ )
+
+ def _register_smart_defaults_factory(self):
+ def create_smart_defaults_factory():
+ default_config_resolver = self._get_internal_component(
+ 'default_config_resolver'
+ )
+ imds_region_provider = IMDSRegionProvider(session=self)
+ return SmartDefaultsConfigStoreFactory(
+ default_config_resolver, imds_region_provider
+ )
+
+ self._internal_components.lazy_register_component(
+ 'smart_defaults_factory', create_smart_defaults_factory
+ )
+
+ def _register_response_parser_factory(self):
+ self._components.register_component(
+ 'response_parser_factory', ResponseParserFactory()
+ )
+
+ def _register_exceptions_factory(self):
+ self._internal_components.register_component(
+ 'exceptions_factory', ClientExceptionsFactory()
+ )
+
+ def _register_builtin_handlers(self, events):
+ for spec in handlers.BUILTIN_HANDLERS:
+ if len(spec) == 2:
+ event_name, handler = spec
+ self.register(event_name, handler)
+ else:
+ event_name, handler, register_type = spec
+ if register_type is handlers.REGISTER_FIRST:
+ self._events.register_first(event_name, handler)
+ elif register_type is handlers.REGISTER_LAST:
+ self._events.register_last(event_name, handler)
+
+ def _register_config_store(self):
+ config_store_component = ConfigValueStore(
+ mapping=create_botocore_default_config_mapping(self)
+ )
+ self._components.register_component(
+ 'config_store', config_store_component
+ )
+
+ def _register_monitor(self):
+ self._internal_components.lazy_register_component(
+ 'monitor', self._create_csm_monitor
+ )
+
+ def _register_user_agent_creator(self):
+ uas = UserAgentString.from_environment()
+ self._components.register_component('user_agent_creator', uas)
+
+ def _create_csm_monitor(self):
+ if self.get_config_variable('csm_enabled'):
+ client_id = self.get_config_variable('csm_client_id')
+ host = self.get_config_variable('csm_host')
+ port = self.get_config_variable('csm_port')
+ handler = monitoring.Monitor(
+ adapter=monitoring.MonitorEventAdapter(),
+ publisher=monitoring.SocketPublisher(
+ socket=socket.socket(socket.AF_INET, socket.SOCK_DGRAM),
+ host=host,
+ port=port,
+ serializer=monitoring.CSMSerializer(
+ csm_client_id=client_id
+ ),
+ ),
+ )
+ return handler
+ return None
+
+ def _get_crt_version(self):
+ user_agent_creator = self.get_component('user_agent_creator')
+ return user_agent_creator._crt_version or 'Unknown'
+
+ @property
+ def available_profiles(self):
+ return list(self._build_profile_map().keys())
+
+ def _build_profile_map(self):
+ # This will build the profile map if it has not been created,
+ # otherwise it will return the cached value. The profile map
+ # is a list of profile names, to the config values for the profile.
+ if self._profile_map is None:
+ self._profile_map = self.full_config['profiles']
+ return self._profile_map
+
+ @property
+ def profile(self):
+ if self._profile is None:
+ profile = self.get_config_variable('profile')
+ self._profile = profile
+ return self._profile
+
+ def get_config_variable(self, logical_name, methods=None):
+ if methods is not None:
+ return self._get_config_variable_with_custom_methods(
+ logical_name, methods
+ )
+ return self.get_component('config_store').get_config_variable(
+ logical_name
+ )
+
+ def _get_config_variable_with_custom_methods(self, logical_name, methods):
+ # If a custom list of methods was supplied we need to perserve the
+ # behavior with the new system. To do so a new chain that is a copy of
+ # the old one will be constructed, but only with the supplied methods
+ # being added to the chain. This chain will be consulted for a value
+ # and then thrown out. This is not efficient, nor is the methods arg
+ # used in botocore, this is just for backwards compatibility.
+ chain_builder = SubsetChainConfigFactory(session=self, methods=methods)
+ mapping = create_botocore_default_config_mapping(self)
+ for name, config_options in self.session_var_map.items():
+ config_name, env_vars, default, typecast = config_options
+ build_chain_config_args = {
+ 'conversion_func': typecast,
+ 'default': default,
+ }
+ if 'instance' in methods:
+ build_chain_config_args['instance_name'] = name
+ if 'env' in methods:
+ build_chain_config_args['env_var_names'] = env_vars
+ if 'config' in methods:
+ build_chain_config_args['config_property_name'] = config_name
+ mapping[name] = chain_builder.create_config_chain(
+ **build_chain_config_args
+ )
+ config_store_component = ConfigValueStore(mapping=mapping)
+ value = config_store_component.get_config_variable(logical_name)
+ return value
+
+ def set_config_variable(self, logical_name, value):
+ """Set a configuration variable to a specific value.
+
+ By using this method, you can override the normal lookup
+ process used in ``get_config_variable`` by explicitly setting
+ a value. Subsequent calls to ``get_config_variable`` will
+ use the ``value``. This gives you per-session specific
+ configuration values.
+
+ ::
+ >>> # Assume logical name 'foo' maps to env var 'FOO'
+ >>> os.environ['FOO'] = 'myvalue'
+ >>> s.get_config_variable('foo')
+ 'myvalue'
+ >>> s.set_config_variable('foo', 'othervalue')
+ >>> s.get_config_variable('foo')
+ 'othervalue'
+
+ :type logical_name: str
+ :param logical_name: The logical name of the session variable
+ you want to set. These are the keys in ``SESSION_VARIABLES``.
+ :param value: The value to associate with the config variable.
+
+ """
+ logger.debug(
+ "Setting config variable for %s to %r",
+ logical_name,
+ value,
+ )
+ self._session_instance_vars[logical_name] = value
+
+ def instance_variables(self):
+ return copy.copy(self._session_instance_vars)
+
+ def get_scoped_config(self):
+ """
+ Returns the config values from the config file scoped to the current
+ profile.
+
+ The configuration data is loaded **only** from the config file.
+ It does not resolve variables based on different locations
+ (e.g. first from the session instance, then from environment
+ variables, then from the config file). If you want this lookup
+ behavior, use the ``get_config_variable`` method instead.
+
+ Note that this configuration is specific to a single profile (the
+ ``profile`` session variable).
+
+ If the ``profile`` session variable is set and the profile does
+ not exist in the config file, a ``ProfileNotFound`` exception
+ will be raised.
+
+ :raises: ConfigNotFound, ConfigParseError, ProfileNotFound
+ :rtype: dict
+
+ """
+ profile_name = self.get_config_variable('profile')
+ profile_map = self._build_profile_map()
+ # If a profile is not explicitly set return the default
+ # profile config or an empty config dict if we don't have
+ # a default profile.
+ if profile_name is None:
+ return profile_map.get('default', {})
+ elif profile_name not in profile_map:
+ # Otherwise if they specified a profile, it has to
+ # exist (even if it's the default profile) otherwise
+ # we complain.
+ raise ProfileNotFound(profile=profile_name)
+ else:
+ return profile_map[profile_name]
+
+ @property
+ def full_config(self):
+ """Return the parsed config file.
+
+ The ``get_config`` method returns the config associated with the
+ specified profile. This property returns the contents of the
+ **entire** config file.
+
+ :rtype: dict
+ """
+ if self._config is None:
+ try:
+ config_file = self.get_config_variable('config_file')
+ self._config = botocore.configloader.load_config(config_file)
+ except ConfigNotFound:
+ self._config = {'profiles': {}}
+ try:
+ # Now we need to inject the profiles from the
+ # credentials file. We don't actually need the values
+ # in the creds file, only the profile names so that we
+ # can validate the user is not referring to a nonexistent
+ # profile.
+ cred_file = self.get_config_variable('credentials_file')
+ cred_profiles = botocore.configloader.raw_config_parse(
+ cred_file
+ )
+ for profile in cred_profiles:
+ cred_vars = cred_profiles[profile]
+ if profile not in self._config['profiles']:
+ self._config['profiles'][profile] = cred_vars
+ else:
+ self._config['profiles'][profile].update(cred_vars)
+ except ConfigNotFound:
+ pass
+ return self._config
+
+ def get_default_client_config(self):
+ """Retrieves the default config for creating clients
+
+ :rtype: botocore.client.Config
+ :returns: The default client config object when creating clients. If
+ the value is ``None`` then there is no default config object
+ attached to the session.
+ """
+ return self._client_config
+
+ def set_default_client_config(self, client_config):
+ """Sets the default config for creating clients
+
+ :type client_config: botocore.client.Config
+ :param client_config: The default client config object when creating
+ clients. If the value is ``None`` then there is no default config
+ object attached to the session.
+ """
+ self._client_config = client_config
+
+ def set_credentials(
+ self, access_key, secret_key, token=None, account_id=None
+ ):
+ """
+ Manually create credentials for this session. If you would
+ prefer to use botocore without a config file, environment variables,
+ or IAM roles, you can pass explicit credentials into this
+ method to establish credentials for this session.
+
+ :type access_key: str
+ :param access_key: The access key part of the credentials.
+
+ :type secret_key: str
+ :param secret_key: The secret key part of the credentials.
+
+ :type token: str
+ :param token: An option session token used by STS session
+ credentials.
+
+ :type account_id: str
+ :param account_id: An optional account ID part of the credentials.
+ """
+ self._credentials = botocore.credentials.Credentials(
+ access_key, secret_key, token, account_id=account_id
+ )
+
+ def get_credentials(self):
+ """
+ Return the :class:`botocore.credential.Credential` object
+ associated with this session. If the credentials have not
+ yet been loaded, this will attempt to load them. If they
+ have already been loaded, this will return the cached
+ credentials.
+
+ """
+ if self._credentials is None:
+ self._credentials = self._components.get_component(
+ 'credential_provider'
+ ).load_credentials()
+ return self._credentials
+
+ def get_auth_token(self):
+ """
+ Return the :class:`botocore.tokens.AuthToken` object associated with
+ this session. If the authorization token has not yet been loaded, this
+ will attempt to load it. If it has already been loaded, this will
+ return the cached authorization token.
+
+ """
+ if self._auth_token is None:
+ provider = self._components.get_component('token_provider')
+ self._auth_token = provider.load_token()
+ return self._auth_token
+
+ def user_agent(self):
+ """
+ Return a string suitable for use as a User-Agent header.
+ The string will be of the form:
+
+ <agent_name>/<agent_version> Python/<py_ver> <plat_name>/<plat_ver> <exec_env>
+
+ Where:
+
+ - agent_name is the value of the `user_agent_name` attribute
+ of the session object (`Botocore` by default).
+ - agent_version is the value of the `user_agent_version`
+ attribute of the session object (the botocore version by default).
+ by default.
+ - py_ver is the version of the Python interpreter beng used.
+ - plat_name is the name of the platform (e.g. Darwin)
+ - plat_ver is the version of the platform
+ - exec_env is exec-env/$AWS_EXECUTION_ENV
+
+ If ``user_agent_extra`` is not empty, then this value will be
+ appended to the end of the user agent string.
+
+ """
+ base = (
+ f'{self.user_agent_name}/{self.user_agent_version} '
+ f'Python/{platform.python_version()} '
+ f'{platform.system()}/{platform.release()}'
+ )
+ if HAS_CRT:
+ base += f' awscrt/{self._get_crt_version()}'
+ if os.environ.get('AWS_EXECUTION_ENV') is not None:
+ base += ' exec-env/{}'.format(os.environ.get('AWS_EXECUTION_ENV'))
+ if self.user_agent_extra:
+ base += f' {self.user_agent_extra}'
+
+ return base
+
+ def get_data(self, data_path):
+ """
+ Retrieve the data associated with `data_path`.
+
+ :type data_path: str
+ :param data_path: The path to the data you wish to retrieve.
+ """
+ return self.get_component('data_loader').load_data(data_path)
+
+ def get_service_model(self, service_name, api_version=None):
+ """Get the service model object.
+
+ :type service_name: string
+ :param service_name: The service name
+
+ :type api_version: string
+ :param api_version: The API version of the service. If none is
+ provided, then the latest API version will be used.
+
+ :rtype: L{botocore.model.ServiceModel}
+ :return: The botocore service model for the service.
+
+ """
+ service_description = self.get_service_data(service_name, api_version)
+ return ServiceModel(service_description, service_name=service_name)
+
+ def get_waiter_model(self, service_name, api_version=None):
+ loader = self.get_component('data_loader')
+ waiter_config = loader.load_service_model(
+ service_name, 'waiters-2', api_version
+ )
+ return waiter.WaiterModel(waiter_config)
+
+ def get_paginator_model(self, service_name, api_version=None):
+ loader = self.get_component('data_loader')
+ paginator_config = loader.load_service_model(
+ service_name, 'paginators-1', api_version
+ )
+ return paginate.PaginatorModel(paginator_config)
+
+ def get_service_data(self, service_name, api_version=None):
+ """
+ Retrieve the fully merged data associated with a service.
+ """
+ data_path = service_name
+ service_data = self.get_component('data_loader').load_service_model(
+ data_path, type_name='service-2', api_version=api_version
+ )
+ service_id = EVENT_ALIASES.get(service_name, service_name)
+ self._events.emit(
+ f'service-data-loaded.{service_id}',
+ service_data=service_data,
+ service_name=service_name,
+ session=self,
+ )
+ return service_data
+
+ def get_available_services(self):
+ """
+ Return a list of names of available services.
+ """
+ return self.get_component('data_loader').list_available_services(
+ type_name='service-2'
+ )
+
+ def set_debug_logger(self, logger_name='botocore'):
+ """
+ Convenience function to quickly configure full debug output
+ to go to the console.
+ """
+ self.set_stream_logger(logger_name, logging.DEBUG)
+
+ def set_stream_logger(
+ self, logger_name, log_level, stream=None, format_string=None
+ ):
+ """
+ Convenience method to configure a stream logger.
+
+ :type logger_name: str
+ :param logger_name: The name of the logger to configure
+
+ :type log_level: str
+ :param log_level: The log level to set for the logger. This
+ is any param supported by the ``.setLevel()`` method of
+ a ``Log`` object.
+
+ :type stream: file
+ :param stream: A file like object to log to. If none is provided
+ then sys.stderr will be used.
+
+ :type format_string: str
+ :param format_string: The format string to use for the log
+ formatter. If none is provided this will default to
+ ``self.LOG_FORMAT``.
+
+ """
+ log = logging.getLogger(logger_name)
+ log.setLevel(logging.DEBUG)
+
+ ch = logging.StreamHandler(stream)
+ ch.setLevel(log_level)
+
+ # create formatter
+ if format_string is None:
+ format_string = self.LOG_FORMAT
+ formatter = logging.Formatter(format_string)
+
+ # add formatter to ch
+ ch.setFormatter(formatter)
+
+ # add ch to logger
+ log.addHandler(ch)
+
+ def set_file_logger(self, log_level, path, logger_name='botocore'):
+ """
+ Convenience function to quickly configure any level of logging
+ to a file.
+
+ :type log_level: int
+ :param log_level: A log level as specified in the `logging` module
+
+ :type path: string
+ :param path: Path to the log file. The file will be created
+ if it doesn't already exist.
+ """
+ log = logging.getLogger(logger_name)
+ log.setLevel(logging.DEBUG)
+
+ # create console handler and set level to debug
+ ch = logging.FileHandler(path)
+ ch.setLevel(log_level)
+
+ # create formatter
+ formatter = logging.Formatter(self.LOG_FORMAT)
+
+ # add formatter to ch
+ ch.setFormatter(formatter)
+
+ # add ch to logger
+ log.addHandler(ch)
+
+ def register(
+ self, event_name, handler, unique_id=None, unique_id_uses_count=False
+ ):
+ """Register a handler with an event.
+
+ :type event_name: str
+ :param event_name: The name of the event.
+
+ :type handler: callable
+ :param handler: The callback to invoke when the event
+ is emitted. This object must be callable, and must
+ accept ``**kwargs``. If either of these preconditions are
+ not met, a ``ValueError`` will be raised.
+
+ :type unique_id: str
+ :param unique_id: An optional identifier to associate with the
+ registration. A unique_id can only be used once for
+ the entire session registration (unless it is unregistered).
+ This can be used to prevent an event handler from being
+ registered twice.
+
+ :param unique_id_uses_count: boolean
+ :param unique_id_uses_count: Specifies if the event should maintain
+ a count when a ``unique_id`` is registered and unregisted. The
+ event can only be completely unregistered once every register call
+ using the unique id has been matched by an ``unregister`` call.
+ If ``unique_id`` is specified, subsequent ``register``
+ calls must use the same value for ``unique_id_uses_count``
+ as the ``register`` call that first registered the event.
+
+ :raises ValueError: If the call to ``register`` uses ``unique_id``
+ but the value for ``unique_id_uses_count`` differs from the
+ ``unique_id_uses_count`` value declared by the very first
+ ``register`` call for that ``unique_id``.
+ """
+ self._events.register(
+ event_name,
+ handler,
+ unique_id,
+ unique_id_uses_count=unique_id_uses_count,
+ )
+
+ def unregister(
+ self,
+ event_name,
+ handler=None,
+ unique_id=None,
+ unique_id_uses_count=False,
+ ):
+ """Unregister a handler with an event.
+
+ :type event_name: str
+ :param event_name: The name of the event.
+
+ :type handler: callable
+ :param handler: The callback to unregister.
+
+ :type unique_id: str
+ :param unique_id: A unique identifier identifying the callback
+ to unregister. You can provide either the handler or the
+ unique_id, you do not have to provide both.
+
+ :param unique_id_uses_count: boolean
+ :param unique_id_uses_count: Specifies if the event should maintain
+ a count when a ``unique_id`` is registered and unregisted. The
+ event can only be completely unregistered once every ``register``
+ call using the ``unique_id`` has been matched by an ``unregister``
+ call. If the ``unique_id`` is specified, subsequent
+ ``unregister`` calls must use the same value for
+ ``unique_id_uses_count`` as the ``register`` call that first
+ registered the event.
+
+ :raises ValueError: If the call to ``unregister`` uses ``unique_id``
+ but the value for ``unique_id_uses_count`` differs from the
+ ``unique_id_uses_count`` value declared by the very first
+ ``register`` call for that ``unique_id``.
+ """
+ self._events.unregister(
+ event_name,
+ handler=handler,
+ unique_id=unique_id,
+ unique_id_uses_count=unique_id_uses_count,
+ )
+
+ def emit(self, event_name, **kwargs):
+ return self._events.emit(event_name, **kwargs)
+
+ def emit_first_non_none_response(self, event_name, **kwargs):
+ responses = self._events.emit(event_name, **kwargs)
+ return first_non_none_response(responses)
+
+ def get_component(self, name):
+ try:
+ return self._components.get_component(name)
+ except ValueError:
+ if name in ['endpoint_resolver', 'exceptions_factory']:
+ warnings.warn(
+ f'Fetching the {name} component with the get_component() '
+ 'method is deprecated as the component has always been '
+ 'considered an internal interface of botocore',
+ DeprecationWarning,
+ )
+ return self._internal_components.get_component(name)
+ raise
+
+ def _get_internal_component(self, name):
+ # While this method may be called by botocore classes outside of the
+ # Session, this method should **never** be used by a class that lives
+ # outside of botocore.
+ return self._internal_components.get_component(name)
+
+ def _register_internal_component(self, name, component):
+ # While this method may be called by botocore classes outside of the
+ # Session, this method should **never** be used by a class that lives
+ # outside of botocore.
+ return self._internal_components.register_component(name, component)
+
+ def register_component(self, name, component):
+ self._components.register_component(name, component)
+
+ def lazy_register_component(self, name, component):
+ self._components.lazy_register_component(name, component)
+
+ @with_current_context()
+ def create_client(
+ self,
+ service_name,
+ region_name=None,
+ api_version=None,
+ use_ssl=True,
+ verify=None,
+ endpoint_url=None,
+ aws_access_key_id=None,
+ aws_secret_access_key=None,
+ aws_session_token=None,
+ config=None,
+ aws_account_id=None,
+ ):
+ """Create a botocore client.
+
+ :type service_name: string
+ :param service_name: The name of the service for which a client will
+ be created. You can use the ``Session.get_available_services()``
+ method to get a list of all available service names.
+
+ :type region_name: string
+ :param region_name: The name of the region associated with the client.
+ A client is associated with a single region.
+
+ :type api_version: string
+ :param api_version: The API version to use. By default, botocore will
+ use the latest API version when creating a client. You only need
+ to specify this parameter if you want to use a previous API version
+ of the client.
+
+ :type use_ssl: boolean
+ :param use_ssl: Whether or not to use SSL. By default, SSL is used.
+ Note that not all services support non-ssl connections.
+
+ :type verify: boolean/string
+ :param verify: Whether or not to verify SSL certificates.
+ By default SSL certificates are verified. You can provide the
+ following values:
+
+ * False - do not validate SSL certificates. SSL will still be
+ used (unless use_ssl is False), but SSL certificates
+ will not be verified.
+ * path/to/cert/bundle.pem - A filename of the CA cert bundle to
+ uses. You can specify this argument if you want to use a
+ different CA cert bundle than the one used by botocore.
+
+ :type endpoint_url: string
+ :param endpoint_url: The complete URL to use for the constructed
+ client. Normally, botocore will automatically construct the
+ appropriate URL to use when communicating with a service. You can
+ specify a complete URL (including the "http/https" scheme) to
+ override this behavior. If this value is provided, then
+ ``use_ssl`` is ignored.
+
+ :type aws_access_key_id: string
+ :param aws_access_key_id: The access key to use when creating
+ the client. This is entirely optional, and if not provided,
+ the credentials configured for the session will automatically
+ be used. You only need to provide this argument if you want
+ to override the credentials used for this specific client.
+
+ :type aws_secret_access_key: string
+ :param aws_secret_access_key: The secret key to use when creating
+ the client. Same semantics as aws_access_key_id above.
+
+ :type aws_session_token: string
+ :param aws_session_token: The session token to use when creating
+ the client. Same semantics as aws_access_key_id above.
+
+ :type config: botocore.client.Config
+ :param config: Advanced client configuration options. If a value
+ is specified in the client config, its value will take precedence
+ over environment variables and configuration values, but not over
+ a value passed explicitly to the method. If a default config
+ object is set on the session, the config object used when creating
+ the client will be the result of calling ``merge()`` on the
+ default config with the config provided to this call.
+
+ :type aws_account_id: string
+ :param aws_account_id: The account id to use when creating
+ the client. Same semantics as aws_access_key_id above.
+
+ :rtype: botocore.client.BaseClient
+ :return: A botocore client instance
+
+ """
+ default_client_config = self.get_default_client_config()
+ # If a config is provided and a default config is set, then
+ # use the config resulting from merging the two.
+ if config is not None and default_client_config is not None:
+ config = default_client_config.merge(config)
+ # If a config was not provided then use the default
+ # client config from the session
+ elif default_client_config is not None:
+ config = default_client_config
+
+ region_name = self._resolve_region_name(region_name, config)
+
+ # Figure out the verify value base on the various
+ # configuration options.
+ if verify is None:
+ verify = self.get_config_variable('ca_bundle')
+
+ if api_version is None:
+ api_version = self.get_config_variable('api_versions').get(
+ service_name, None
+ )
+
+ loader = self.get_component('data_loader')
+ event_emitter = self.get_component('event_emitter')
+ response_parser_factory = self.get_component('response_parser_factory')
+ if config is not None and config.signature_version is UNSIGNED:
+ credentials = None
+ elif (
+ aws_access_key_id is not None and aws_secret_access_key is not None
+ ):
+ credentials = botocore.credentials.Credentials(
+ access_key=aws_access_key_id,
+ secret_key=aws_secret_access_key,
+ token=aws_session_token,
+ account_id=aws_account_id,
+ )
+ elif self._missing_cred_vars(aws_access_key_id, aws_secret_access_key):
+ raise PartialCredentialsError(
+ provider='explicit',
+ cred_var=self._missing_cred_vars(
+ aws_access_key_id, aws_secret_access_key
+ ),
+ )
+ else:
+ if ignored_credentials := self._get_ignored_credentials(
+ aws_session_token, aws_account_id
+ ):
+ logger.debug(
+ f"Ignoring the following credential-related values which were set without "
+ f"an access key id and secret key on the session or client: {ignored_credentials}"
+ )
+ credentials = self.get_credentials()
+ auth_token = self.get_auth_token()
+ endpoint_resolver = self._get_internal_component('endpoint_resolver')
+ exceptions_factory = self._get_internal_component('exceptions_factory')
+ config_store = copy.copy(self.get_component('config_store'))
+ user_agent_creator = self.get_component('user_agent_creator')
+ # Session configuration values for the user agent string are applied
+ # just before each client creation because they may have been modified
+ # at any time between session creation and client creation.
+ user_agent_creator.set_session_config(
+ session_user_agent_name=self.user_agent_name,
+ session_user_agent_version=self.user_agent_version,
+ session_user_agent_extra=self.user_agent_extra,
+ )
+ defaults_mode = self._resolve_defaults_mode(config, config_store)
+ if defaults_mode != 'legacy':
+ smart_defaults_factory = self._get_internal_component(
+ 'smart_defaults_factory'
+ )
+ smart_defaults_factory.merge_smart_defaults(
+ config_store, defaults_mode, region_name
+ )
+
+ self._add_configured_endpoint_provider(
+ client_name=service_name,
+ config_store=config_store,
+ )
+
+ user_agent_creator.set_client_features(get_context().features)
+
+ client_creator = botocore.client.ClientCreator(
+ loader,
+ endpoint_resolver,
+ self.user_agent(),
+ event_emitter,
+ retryhandler,
+ translate,
+ response_parser_factory,
+ exceptions_factory,
+ config_store,
+ user_agent_creator=user_agent_creator,
+ )
+ client = client_creator.create_client(
+ service_name=service_name,
+ region_name=region_name,
+ is_secure=use_ssl,
+ endpoint_url=endpoint_url,
+ verify=verify,
+ credentials=credentials,
+ scoped_config=self.get_scoped_config(),
+ client_config=config,
+ api_version=api_version,
+ auth_token=auth_token,
+ )
+ monitor = self._get_internal_component('monitor')
+ if monitor is not None:
+ monitor.register(client.meta.events)
+ return client
+
+ def _resolve_region_name(self, region_name, config):
+ # Figure out the user-provided region based on the various
+ # configuration options.
+ if region_name is None:
+ if config and config.region_name is not None:
+ region_name = config.region_name
+ else:
+ region_name = self.get_config_variable('region')
+
+ validate_region_name(region_name)
+ # For any client that we create in retrieving credentials
+ # we want to create it using the same region as specified in
+ # creating this client. It is important to note though that the
+ # credentials client is only created once per session. So if a new
+ # client is created with a different region, its credential resolver
+ # will use the region of the first client. However, that is not an
+ # issue as of now because the credential resolver uses only STS and
+ # the credentials returned at regional endpoints are valid across
+ # all regions in the partition.
+ self._last_client_region_used = region_name
+ return region_name
+
+ def _resolve_defaults_mode(self, client_config, config_store):
+ mode = config_store.get_config_variable('defaults_mode')
+
+ if client_config and client_config.defaults_mode:
+ mode = client_config.defaults_mode
+
+ default_config_resolver = self._get_internal_component(
+ 'default_config_resolver'
+ )
+ default_modes = default_config_resolver.get_default_modes()
+ lmode = mode.lower()
+ if lmode not in default_modes:
+ raise InvalidDefaultsMode(
+ mode=mode, valid_modes=', '.join(default_modes)
+ )
+
+ return lmode
+
+ def _add_configured_endpoint_provider(self, client_name, config_store):
+ chain = ConfiguredEndpointProvider(
+ full_config=self.full_config,
+ scoped_config=self.get_scoped_config(),
+ client_name=client_name,
+ )
+ config_store.set_config_provider(
+ logical_name='endpoint_url',
+ provider=chain,
+ )
+
+ def _missing_cred_vars(self, access_key, secret_key):
+ if access_key is not None and secret_key is None:
+ return 'aws_secret_access_key'
+ if secret_key is not None and access_key is None:
+ return 'aws_access_key_id'
+ return None
+
+ def get_available_partitions(self):
+ """Lists the available partitions found on disk
+
+ :rtype: list
+ :return: Returns a list of partition names (e.g., ["aws", "aws-cn"])
+ """
+ resolver = self._get_internal_component('endpoint_resolver')
+ return resolver.get_available_partitions()
+
+ def get_partition_for_region(self, region_name):
+ """Lists the partition name of a particular region.
+
+ :type region_name: string
+ :param region_name: Name of the region to list partition for (e.g.,
+ us-east-1).
+
+ :rtype: string
+ :return: Returns the respective partition name (e.g., aws).
+ """
+ resolver = self._get_internal_component('endpoint_resolver')
+ return resolver.get_partition_for_region(region_name)
+
+ def get_available_regions(
+ self, service_name, partition_name='aws', allow_non_regional=False
+ ):
+ """Lists the region and endpoint names of a particular partition.
+
+ :type service_name: string
+ :param service_name: Name of a service to list endpoint for (e.g., s3).
+ This parameter accepts a service name (e.g., "elb") or endpoint
+ prefix (e.g., "elasticloadbalancing").
+
+ :type partition_name: string
+ :param partition_name: Name of the partition to limit endpoints to.
+ (e.g., aws for the public AWS endpoints, aws-cn for AWS China
+ endpoints, aws-us-gov for AWS GovCloud (US) Endpoints, etc.
+
+ :type allow_non_regional: bool
+ :param allow_non_regional: Set to True to include endpoints that are
+ not regional endpoints (e.g., s3-external-1,
+ fips-us-gov-west-1, etc).
+ :return: Returns a list of endpoint names (e.g., ["us-east-1"]).
+ """
+ resolver = self._get_internal_component('endpoint_resolver')
+ results = []
+ try:
+ service_data = self.get_service_data(service_name)
+ endpoint_prefix = service_data['metadata'].get(
+ 'endpointPrefix', service_name
+ )
+ results = resolver.get_available_endpoints(
+ endpoint_prefix, partition_name, allow_non_regional
+ )
+ except UnknownServiceError:
+ pass
+ return results
+
+ def _get_ignored_credentials(self, aws_session_token, aws_account_id):
+ credential_inputs = []
+ if aws_session_token:
+ credential_inputs.append('aws_session_token')
+ if aws_account_id:
+ credential_inputs.append('aws_account_id')
+ return ', '.join(credential_inputs) if credential_inputs else None
+
+
+class ComponentLocator:
+ """Service locator for session components."""
+
+ def __init__(self):
+ self._components = {}
+ self._deferred = {}
+
+ def get_component(self, name):
+ if name in self._deferred:
+ factory = self._deferred[name]
+ self._components[name] = factory()
+ # Only delete the component from the deferred dict after
+ # successfully creating the object from the factory as well as
+ # injecting the instantiated value into the _components dict.
+ try:
+ del self._deferred[name]
+ except KeyError:
+ # If we get here, it's likely that get_component was called
+ # concurrently from multiple threads, and another thread
+ # already deleted the entry. This means the factory was
+ # probably called twice, but cleaning up the deferred entry
+ # should not crash outright.
+ pass
+ try:
+ return self._components[name]
+ except KeyError:
+ raise ValueError(f"Unknown component: {name}")
+
+ def register_component(self, name, component):
+ self._components[name] = component
+ try:
+ del self._deferred[name]
+ except KeyError:
+ pass
+
+ def lazy_register_component(self, name, no_arg_factory):
+ self._deferred[name] = no_arg_factory
+ try:
+ del self._components[name]
+ except KeyError:
+ pass
+
+
+class SessionVarDict(MutableMapping):
+ def __init__(self, session, session_vars):
+ self._session = session
+ self._store = copy.copy(session_vars)
+
+ def __getitem__(self, key):
+ return self._store[key]
+
+ def __setitem__(self, key, value):
+ self._store[key] = value
+ self._update_config_store_from_session_vars(key, value)
+
+ def __delitem__(self, key):
+ del self._store[key]
+
+ def __iter__(self):
+ return iter(self._store)
+
+ def __len__(self):
+ return len(self._store)
+
+ def _update_config_store_from_session_vars(
+ self, logical_name, config_options
+ ):
+ # This is for backwards compatibility. The new preferred way to
+ # modify configuration logic is to use the component system to get
+ # the config_store component from the session, and then update
+ # a key with a custom config provider(s).
+ # This backwards compatibility method takes the old session_vars
+ # list of tuples and and transforms that into a set of updates to
+ # the config_store component.
+ config_chain_builder = ConfigChainFactory(session=self._session)
+ config_name, env_vars, default, typecast = config_options
+ config_store = self._session.get_component('config_store')
+ config_store.set_config_provider(
+ logical_name,
+ config_chain_builder.create_config_chain(
+ instance_name=logical_name,
+ env_var_names=env_vars,
+ config_property_names=config_name,
+ default=default,
+ conversion_func=typecast,
+ ),
+ )
+
+
+class SubsetChainConfigFactory:
+ """A class for creating backwards compatible configuration chains.
+
+ This class can be used instead of
+ :class:`botocore.configprovider.ConfigChainFactory` to make it honor the
+ methods argument to get_config_variable. This class can be used to filter
+ out providers that are not in the methods tuple when creating a new config
+ chain.
+ """
+
+ def __init__(self, session, methods, environ=None):
+ self._factory = ConfigChainFactory(session, environ)
+ self._supported_methods = methods
+
+ def create_config_chain(
+ self,
+ instance_name=None,
+ env_var_names=None,
+ config_property_name=None,
+ default=None,
+ conversion_func=None,
+ ):
+ """Build a config chain following the standard botocore pattern.
+
+ This config chain factory will omit any providers not in the methods
+ tuple provided at initialization. For example if given the tuple
+ ('instance', 'config',) it will not inject the environment provider
+ into the standard config chain. This lets the botocore session support
+ the custom ``methods`` argument for all the default botocore config
+ variables when calling ``get_config_variable``.
+ """
+ if 'instance' not in self._supported_methods:
+ instance_name = None
+ if 'env' not in self._supported_methods:
+ env_var_names = None
+ if 'config' not in self._supported_methods:
+ config_property_name = None
+ return self._factory.create_config_chain(
+ instance_name=instance_name,
+ env_var_names=env_var_names,
+ config_property_names=config_property_name,
+ default=default,
+ conversion_func=conversion_func,
+ )
+
+
+def get_session(env_vars=None):
+ """
+ Return a new session object.
+ """
+ return Session(env_vars)
diff --git a/.venv/lib/python3.12/site-packages/botocore/signers.py b/.venv/lib/python3.12/site-packages/botocore/signers.py
new file mode 100644
index 00000000..cf90fe4a
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/signers.py
@@ -0,0 +1,991 @@
+# Copyright 2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import base64
+import datetime
+import json
+import weakref
+
+import botocore
+import botocore.auth
+from botocore.awsrequest import create_request_object, prepare_request_dict
+from botocore.compat import OrderedDict
+from botocore.exceptions import (
+ ParamValidationError,
+ UnknownClientMethodError,
+ UnknownSignatureVersionError,
+ UnsupportedSignatureVersionError,
+)
+from botocore.utils import ArnParser, datetime2timestamp
+
+# Keep these imported. There's pre-existing code that uses them.
+from botocore.utils import fix_s3_host # noqa
+
+
+class RequestSigner:
+ """
+ An object to sign requests before they go out over the wire using
+ one of the authentication mechanisms defined in ``auth.py``. This
+ class fires two events scoped to a service and operation name:
+
+ * choose-signer: Allows overriding the auth signer name.
+ * before-sign: Allows mutating the request before signing.
+
+ Together these events allow for customization of the request
+ signing pipeline, including overrides, request path manipulation,
+ and disabling signing per operation.
+
+
+ :type service_id: botocore.model.ServiceId
+ :param service_id: The service id for the service, e.g. ``S3``
+
+ :type region_name: string
+ :param region_name: Name of the service region, e.g. ``us-east-1``
+
+ :type signing_name: string
+ :param signing_name: Service signing name. This is usually the
+ same as the service name, but can differ. E.g.
+ ``emr`` vs. ``elasticmapreduce``.
+
+ :type signature_version: string
+ :param signature_version: Signature name like ``v4``.
+
+ :type credentials: :py:class:`~botocore.credentials.Credentials`
+ :param credentials: User credentials with which to sign requests.
+
+ :type event_emitter: :py:class:`~botocore.hooks.BaseEventHooks`
+ :param event_emitter: Extension mechanism to fire events.
+ """
+
+ def __init__(
+ self,
+ service_id,
+ region_name,
+ signing_name,
+ signature_version,
+ credentials,
+ event_emitter,
+ auth_token=None,
+ ):
+ self._region_name = region_name
+ self._signing_name = signing_name
+ self._signature_version = signature_version
+ self._credentials = credentials
+ self._auth_token = auth_token
+ self._service_id = service_id
+
+ # We need weakref to prevent leaking memory in Python 2.6 on Linux 2.6
+ self._event_emitter = weakref.proxy(event_emitter)
+
+ @property
+ def region_name(self):
+ return self._region_name
+
+ @property
+ def signature_version(self):
+ return self._signature_version
+
+ @property
+ def signing_name(self):
+ return self._signing_name
+
+ def handler(self, operation_name=None, request=None, **kwargs):
+ # This is typically hooked up to the "request-created" event
+ # from a client's event emitter. When a new request is created
+ # this method is invoked to sign the request.
+ # Don't call this method directly.
+ return self.sign(operation_name, request)
+
+ def sign(
+ self,
+ operation_name,
+ request,
+ region_name=None,
+ signing_type='standard',
+ expires_in=None,
+ signing_name=None,
+ ):
+ """Sign a request before it goes out over the wire.
+
+ :type operation_name: string
+ :param operation_name: The name of the current operation, e.g.
+ ``ListBuckets``.
+ :type request: AWSRequest
+ :param request: The request object to be sent over the wire.
+
+ :type region_name: str
+ :param region_name: The region to sign the request for.
+
+ :type signing_type: str
+ :param signing_type: The type of signing to perform. This can be one of
+ three possible values:
+
+ * 'standard' - This should be used for most requests.
+ * 'presign-url' - This should be used when pre-signing a request.
+ * 'presign-post' - This should be used when pre-signing an S3 post.
+
+ :type expires_in: int
+ :param expires_in: The number of seconds the presigned url is valid
+ for. This parameter is only valid for signing type 'presign-url'.
+
+ :type signing_name: str
+ :param signing_name: The name to use for the service when signing.
+ """
+ explicit_region_name = region_name
+ if region_name is None:
+ region_name = self._region_name
+
+ if signing_name is None:
+ signing_name = self._signing_name
+
+ signature_version = self._choose_signer(
+ operation_name, signing_type, request.context
+ )
+
+ # Allow mutating request before signing
+ self._event_emitter.emit(
+ f'before-sign.{self._service_id.hyphenize()}.{operation_name}',
+ request=request,
+ signing_name=signing_name,
+ region_name=self._region_name,
+ signature_version=signature_version,
+ request_signer=self,
+ operation_name=operation_name,
+ )
+
+ if signature_version != botocore.UNSIGNED:
+ kwargs = {
+ 'signing_name': signing_name,
+ 'region_name': region_name,
+ 'signature_version': signature_version,
+ }
+ if expires_in is not None:
+ kwargs['expires'] = expires_in
+ signing_context = request.context.get('signing', {})
+ if not explicit_region_name and signing_context.get('region'):
+ kwargs['region_name'] = signing_context['region']
+ if signing_context.get('signing_name'):
+ kwargs['signing_name'] = signing_context['signing_name']
+ if signing_context.get('request_credentials'):
+ kwargs['request_credentials'] = signing_context[
+ 'request_credentials'
+ ]
+ if signing_context.get('identity_cache') is not None:
+ self._resolve_identity_cache(
+ kwargs,
+ signing_context['identity_cache'],
+ signing_context['cache_key'],
+ )
+ try:
+ auth = self.get_auth_instance(**kwargs)
+ except UnknownSignatureVersionError as e:
+ if signing_type != 'standard':
+ raise UnsupportedSignatureVersionError(
+ signature_version=signature_version
+ )
+ else:
+ raise e
+
+ auth.add_auth(request)
+
+ def _resolve_identity_cache(self, kwargs, cache, cache_key):
+ kwargs['identity_cache'] = cache
+ kwargs['cache_key'] = cache_key
+
+ def _choose_signer(self, operation_name, signing_type, context):
+ """
+ Allow setting the signature version via the choose-signer event.
+ A value of `botocore.UNSIGNED` means no signing will be performed.
+
+ :param operation_name: The operation to sign.
+ :param signing_type: The type of signing that the signer is to be used
+ for.
+ :return: The signature version to sign with.
+ """
+ signing_type_suffix_map = {
+ 'presign-post': '-presign-post',
+ 'presign-url': '-query',
+ }
+ suffix = signing_type_suffix_map.get(signing_type, '')
+
+ # operation specific signing context takes precedent over client-level
+ # defaults
+ signature_version = context.get('auth_type') or self._signature_version
+ signing = context.get('signing', {})
+ signing_name = signing.get('signing_name', self._signing_name)
+ region_name = signing.get('region', self._region_name)
+ if (
+ signature_version is not botocore.UNSIGNED
+ and not signature_version.endswith(suffix)
+ ):
+ signature_version += suffix
+
+ handler, response = self._event_emitter.emit_until_response(
+ f'choose-signer.{self._service_id.hyphenize()}.{operation_name}',
+ signing_name=signing_name,
+ region_name=region_name,
+ signature_version=signature_version,
+ context=context,
+ )
+
+ if response is not None:
+ signature_version = response
+ # The suffix needs to be checked again in case we get an improper
+ # signature version from choose-signer.
+ if (
+ signature_version is not botocore.UNSIGNED
+ and not signature_version.endswith(suffix)
+ ):
+ signature_version += suffix
+
+ return signature_version
+
+ def get_auth_instance(
+ self,
+ signing_name,
+ region_name,
+ signature_version=None,
+ request_credentials=None,
+ **kwargs,
+ ):
+ """
+ Get an auth instance which can be used to sign a request
+ using the given signature version.
+
+ :type signing_name: string
+ :param signing_name: Service signing name. This is usually the
+ same as the service name, but can differ. E.g.
+ ``emr`` vs. ``elasticmapreduce``.
+
+ :type region_name: string
+ :param region_name: Name of the service region, e.g. ``us-east-1``
+
+ :type signature_version: string
+ :param signature_version: Signature name like ``v4``.
+
+ :rtype: :py:class:`~botocore.auth.BaseSigner`
+ :return: Auth instance to sign a request.
+ """
+ if signature_version is None:
+ signature_version = self._signature_version
+
+ cls = botocore.auth.AUTH_TYPE_MAPS.get(signature_version)
+ if cls is None:
+ raise UnknownSignatureVersionError(
+ signature_version=signature_version
+ )
+
+ if cls.REQUIRES_TOKEN is True:
+ frozen_token = None
+ if self._auth_token is not None:
+ frozen_token = self._auth_token.get_frozen_token()
+ auth = cls(frozen_token)
+ return auth
+
+ credentials = request_credentials or self._credentials
+ if getattr(cls, "REQUIRES_IDENTITY_CACHE", None) is True:
+ cache = kwargs["identity_cache"]
+ key = kwargs["cache_key"]
+ credentials = cache.get_credentials(key)
+ del kwargs["cache_key"]
+
+ # If there's no credentials provided (i.e credentials is None),
+ # then we'll pass a value of "None" over to the auth classes,
+ # which already handle the cases where no credentials have
+ # been provided.
+ frozen_credentials = None
+ if credentials is not None:
+ frozen_credentials = credentials.get_frozen_credentials()
+ kwargs['credentials'] = frozen_credentials
+ if cls.REQUIRES_REGION:
+ if self._region_name is None:
+ raise botocore.exceptions.NoRegionError()
+ kwargs['region_name'] = region_name
+ kwargs['service_name'] = signing_name
+ auth = cls(**kwargs)
+ return auth
+
+ # Alias get_auth for backwards compatibility.
+ get_auth = get_auth_instance
+
+ def generate_presigned_url(
+ self,
+ request_dict,
+ operation_name,
+ expires_in=3600,
+ region_name=None,
+ signing_name=None,
+ ):
+ """Generates a presigned url
+
+ :type request_dict: dict
+ :param request_dict: The prepared request dictionary returned by
+ ``botocore.awsrequest.prepare_request_dict()``
+
+ :type operation_name: str
+ :param operation_name: The operation being signed.
+
+ :type expires_in: int
+ :param expires_in: The number of seconds the presigned url is valid
+ for. By default it expires in an hour (3600 seconds)
+
+ :type region_name: string
+ :param region_name: The region name to sign the presigned url.
+
+ :type signing_name: str
+ :param signing_name: The name to use for the service when signing.
+
+ :returns: The presigned url
+ """
+ request = create_request_object(request_dict)
+ self.sign(
+ operation_name,
+ request,
+ region_name,
+ 'presign-url',
+ expires_in,
+ signing_name,
+ )
+
+ request.prepare()
+ return request.url
+
+
+class CloudFrontSigner:
+ '''A signer to create a signed CloudFront URL.
+
+ First you create a cloudfront signer based on a normalized RSA signer::
+
+ import rsa
+ def rsa_signer(message):
+ private_key = open('private_key.pem', 'r').read()
+ return rsa.sign(
+ message,
+ rsa.PrivateKey.load_pkcs1(private_key.encode('utf8')),
+ 'SHA-1') # CloudFront requires SHA-1 hash
+ cf_signer = CloudFrontSigner(key_id, rsa_signer)
+
+ To sign with a canned policy::
+
+ signed_url = cf_signer.generate_signed_url(
+ url, date_less_than=datetime(2015, 12, 1))
+
+ To sign with a custom policy::
+
+ signed_url = cf_signer.generate_signed_url(url, policy=my_policy)
+ '''
+
+ def __init__(self, key_id, rsa_signer):
+ """Create a CloudFrontSigner.
+
+ :type key_id: str
+ :param key_id: The CloudFront Key Pair ID
+
+ :type rsa_signer: callable
+ :param rsa_signer: An RSA signer.
+ Its only input parameter will be the message to be signed,
+ and its output will be the signed content as a binary string.
+ The hash algorithm needed by CloudFront is SHA-1.
+ """
+ self.key_id = key_id
+ self.rsa_signer = rsa_signer
+
+ def generate_presigned_url(self, url, date_less_than=None, policy=None):
+ """Creates a signed CloudFront URL based on given parameters.
+
+ :type url: str
+ :param url: The URL of the protected object
+
+ :type date_less_than: datetime
+ :param date_less_than: The URL will expire after that date and time
+
+ :type policy: str
+ :param policy: The custom policy, possibly built by self.build_policy()
+
+ :rtype: str
+ :return: The signed URL.
+ """
+ both_args_supplied = date_less_than is not None and policy is not None
+ neither_arg_supplied = date_less_than is None and policy is None
+ if both_args_supplied or neither_arg_supplied:
+ e = 'Need to provide either date_less_than or policy, but not both'
+ raise ValueError(e)
+ if date_less_than is not None:
+ # We still need to build a canned policy for signing purpose
+ policy = self.build_policy(url, date_less_than)
+ if isinstance(policy, str):
+ policy = policy.encode('utf8')
+ if date_less_than is not None:
+ params = [f'Expires={int(datetime2timestamp(date_less_than))}']
+ else:
+ params = [f"Policy={self._url_b64encode(policy).decode('utf8')}"]
+ signature = self.rsa_signer(policy)
+ params.extend(
+ [
+ f"Signature={self._url_b64encode(signature).decode('utf8')}",
+ f"Key-Pair-Id={self.key_id}",
+ ]
+ )
+ return self._build_url(url, params)
+
+ def _build_url(self, base_url, extra_params):
+ separator = '&' if '?' in base_url else '?'
+ return base_url + separator + '&'.join(extra_params)
+
+ def build_policy(
+ self, resource, date_less_than, date_greater_than=None, ip_address=None
+ ):
+ """A helper to build policy.
+
+ :type resource: str
+ :param resource: The URL or the stream filename of the protected object
+
+ :type date_less_than: datetime
+ :param date_less_than: The URL will expire after the time has passed
+
+ :type date_greater_than: datetime
+ :param date_greater_than: The URL will not be valid until this time
+
+ :type ip_address: str
+ :param ip_address: Use 'x.x.x.x' for an IP, or 'x.x.x.x/x' for a subnet
+
+ :rtype: str
+ :return: The policy in a compact string.
+ """
+ # Note:
+ # 1. Order in canned policy is significant. Special care has been taken
+ # to ensure the output will match the order defined by the document.
+ # There is also a test case to ensure that order.
+ # SEE: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-canned-policy.html#private-content-canned-policy-creating-policy-statement
+ # 2. Albeit the order in custom policy is not required by CloudFront,
+ # we still use OrderedDict internally to ensure the result is stable
+ # and also matches canned policy requirement.
+ # SEE: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html
+ moment = int(datetime2timestamp(date_less_than))
+ condition = OrderedDict({"DateLessThan": {"AWS:EpochTime": moment}})
+ if ip_address:
+ if '/' not in ip_address:
+ ip_address += '/32'
+ condition["IpAddress"] = {"AWS:SourceIp": ip_address}
+ if date_greater_than:
+ moment = int(datetime2timestamp(date_greater_than))
+ condition["DateGreaterThan"] = {"AWS:EpochTime": moment}
+ ordered_payload = [('Resource', resource), ('Condition', condition)]
+ custom_policy = {"Statement": [OrderedDict(ordered_payload)]}
+ return json.dumps(custom_policy, separators=(',', ':'))
+
+ def _url_b64encode(self, data):
+ # Required by CloudFront. See also:
+ # http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-linux-openssl.html
+ return (
+ base64.b64encode(data)
+ .replace(b'+', b'-')
+ .replace(b'=', b'_')
+ .replace(b'/', b'~')
+ )
+
+
+def add_generate_db_auth_token(class_attributes, **kwargs):
+ class_attributes['generate_db_auth_token'] = generate_db_auth_token
+
+
+def add_dsql_generate_db_auth_token_methods(class_attributes, **kwargs):
+ class_attributes['generate_db_connect_auth_token'] = (
+ dsql_generate_db_connect_auth_token
+ )
+ class_attributes['generate_db_connect_admin_auth_token'] = (
+ dsql_generate_db_connect_admin_auth_token
+ )
+
+
+def generate_db_auth_token(self, DBHostname, Port, DBUsername, Region=None):
+ """Generates an auth token used to connect to a db with IAM credentials.
+
+ :type DBHostname: str
+ :param DBHostname: The hostname of the database to connect to.
+
+ :type Port: int
+ :param Port: The port number the database is listening on.
+
+ :type DBUsername: str
+ :param DBUsername: The username to log in as.
+
+ :type Region: str
+ :param Region: The region the database is in. If None, the client
+ region will be used.
+
+ :return: A presigned url which can be used as an auth token.
+ """
+ region = Region
+ if region is None:
+ region = self.meta.region_name
+
+ params = {
+ 'Action': 'connect',
+ 'DBUser': DBUsername,
+ }
+
+ request_dict = {
+ 'url_path': '/',
+ 'query_string': '',
+ 'headers': {},
+ 'body': params,
+ 'method': 'GET',
+ }
+
+ # RDS requires that the scheme not be set when sent over. This can cause
+ # issues when signing because the Python url parsing libraries follow
+ # RFC 1808 closely, which states that a netloc must be introduced by `//`.
+ # Otherwise the url is presumed to be relative, and thus the whole
+ # netloc would be treated as a path component. To work around this we
+ # introduce https here and remove it once we're done processing it.
+ scheme = 'https://'
+ endpoint_url = f'{scheme}{DBHostname}:{Port}'
+ prepare_request_dict(request_dict, endpoint_url)
+ presigned_url = self._request_signer.generate_presigned_url(
+ operation_name='connect',
+ request_dict=request_dict,
+ region_name=region,
+ expires_in=900,
+ signing_name='rds-db',
+ )
+ return presigned_url[len(scheme) :]
+
+
+def _dsql_generate_db_auth_token(
+ self, Hostname, Action, Region=None, ExpiresIn=900
+):
+ """Generate a DSQL database token for an arbitrary action.
+
+ :type Hostname: str
+ :param Hostname: The DSQL endpoint host name.
+
+ :type Action: str
+ :param Action: Action to perform on the cluster (DbConnectAdmin or DbConnect).
+
+ :type Region: str
+ :param Region: The AWS region where the DSQL Cluster is hosted. If None, the client region will be used.
+
+ :type ExpiresIn: int
+ :param ExpiresIn: The token expiry duration in seconds (default is 900 seconds).
+
+ :return: A presigned url which can be used as an auth token.
+ """
+ possible_actions = ("DbConnect", "DbConnectAdmin")
+
+ if Action not in possible_actions:
+ raise ParamValidationError(
+ report=f"Received {Action} for action but expected one of: {', '.join(possible_actions)}"
+ )
+
+ if Region is None:
+ Region = self.meta.region_name
+
+ request_dict = {
+ 'url_path': '/',
+ 'query_string': '',
+ 'headers': {},
+ 'body': {
+ 'Action': Action,
+ },
+ 'method': 'GET',
+ }
+ scheme = 'https://'
+ endpoint_url = f'{scheme}{Hostname}'
+ prepare_request_dict(request_dict, endpoint_url)
+ presigned_url = self._request_signer.generate_presigned_url(
+ operation_name=Action,
+ request_dict=request_dict,
+ region_name=Region,
+ expires_in=ExpiresIn,
+ signing_name='dsql',
+ )
+ return presigned_url[len(scheme) :]
+
+
+def dsql_generate_db_connect_auth_token(
+ self, Hostname, Region=None, ExpiresIn=900
+):
+ """Generate a DSQL database token for the "DbConnect" action.
+
+ :type Hostname: str
+ :param Hostname: The DSQL endpoint host name.
+
+ :type Region: str
+ :param Region: The AWS region where the DSQL Cluster is hosted. If None, the client region will be used.
+
+ :type ExpiresIn: int
+ :param ExpiresIn: The token expiry duration in seconds (default is 900 seconds).
+
+ :return: A presigned url which can be used as an auth token.
+ """
+ return _dsql_generate_db_auth_token(
+ self, Hostname, "DbConnect", Region, ExpiresIn
+ )
+
+
+def dsql_generate_db_connect_admin_auth_token(
+ self, Hostname, Region=None, ExpiresIn=900
+):
+ """Generate a DSQL database token for the "DbConnectAdmin" action.
+
+ :type Hostname: str
+ :param Hostname: The DSQL endpoint host name.
+
+ :type Region: str
+ :param Region: The AWS region where the DSQL Cluster is hosted. If None, the client region will be used.
+
+ :type ExpiresIn: int
+ :param ExpiresIn: The token expiry duration in seconds (default is 900 seconds).
+
+ :return: A presigned url which can be used as an auth token.
+ """
+ return _dsql_generate_db_auth_token(
+ self, Hostname, "DbConnectAdmin", Region, ExpiresIn
+ )
+
+
+class S3PostPresigner:
+ def __init__(self, request_signer):
+ self._request_signer = request_signer
+
+ def generate_presigned_post(
+ self,
+ request_dict,
+ fields=None,
+ conditions=None,
+ expires_in=3600,
+ region_name=None,
+ ):
+ """Generates the url and the form fields used for a presigned s3 post
+
+ :type request_dict: dict
+ :param request_dict: The prepared request dictionary returned by
+ ``botocore.awsrequest.prepare_request_dict()``
+
+ :type fields: dict
+ :param fields: A dictionary of prefilled form fields to build on top
+ of.
+
+ :type conditions: list
+ :param conditions: A list of conditions to include in the policy. Each
+ element can be either a list or a structure. For example:
+
+ .. code:: python
+
+ [
+ {"acl": "public-read"},
+ {"bucket": "amzn-s3-demo-bucket"},
+ ["starts-with", "$key", "mykey"]
+ ]
+
+ :type expires_in: int
+ :param expires_in: The number of seconds the presigned post is valid
+ for.
+
+ :type region_name: string
+ :param region_name: The region name to sign the presigned post to.
+
+ :rtype: dict
+ :returns: A dictionary with two elements: ``url`` and ``fields``.
+ Url is the url to post to. Fields is a dictionary filled with
+ the form fields and respective values to use when submitting the
+ post. For example:
+
+ .. code:: python
+
+ {
+ 'url': 'https://amzn-s3-demo-bucket.s3.amazonaws.com',
+ 'fields': {
+ 'acl': 'public-read',
+ 'key': 'mykey',
+ 'signature': 'mysignature',
+ 'policy': 'mybase64 encoded policy'
+ }
+ }
+ """
+ if fields is None:
+ fields = {}
+
+ if conditions is None:
+ conditions = []
+
+ # Create the policy for the post.
+ policy = {}
+
+ # Create an expiration date for the policy
+ datetime_now = datetime.datetime.utcnow()
+ expire_date = datetime_now + datetime.timedelta(seconds=expires_in)
+ policy['expiration'] = expire_date.strftime(botocore.auth.ISO8601)
+
+ # Append all of the conditions that the user supplied.
+ policy['conditions'] = []
+ for condition in conditions:
+ policy['conditions'].append(condition)
+
+ # Store the policy and the fields in the request for signing
+ request = create_request_object(request_dict)
+ request.context['s3-presign-post-fields'] = fields
+ request.context['s3-presign-post-policy'] = policy
+
+ self._request_signer.sign(
+ 'PutObject', request, region_name, 'presign-post'
+ )
+ # Return the url and the fields for th form to post.
+ return {'url': request.url, 'fields': fields}
+
+
+def add_generate_presigned_url(class_attributes, **kwargs):
+ class_attributes['generate_presigned_url'] = generate_presigned_url
+
+
+def generate_presigned_url(
+ self, ClientMethod, Params=None, ExpiresIn=3600, HttpMethod=None
+):
+ """Generate a presigned url given a client, its method, and arguments
+
+ :type ClientMethod: string
+ :param ClientMethod: The client method to presign for
+
+ :type Params: dict
+ :param Params: The parameters normally passed to
+ ``ClientMethod``.
+
+ :type ExpiresIn: int
+ :param ExpiresIn: The number of seconds the presigned url is valid
+ for. By default it expires in an hour (3600 seconds)
+
+ :type HttpMethod: string
+ :param HttpMethod: The http method to use on the generated url. By
+ default, the http method is whatever is used in the method's model.
+
+ :returns: The presigned url
+ """
+ client_method = ClientMethod
+ params = Params
+ if params is None:
+ params = {}
+ expires_in = ExpiresIn
+ http_method = HttpMethod
+ context = {
+ 'is_presign_request': True,
+ 'use_global_endpoint': _should_use_global_endpoint(self),
+ }
+
+ request_signer = self._request_signer
+
+ try:
+ operation_name = self._PY_TO_OP_NAME[client_method]
+ except KeyError:
+ raise UnknownClientMethodError(method_name=client_method)
+
+ operation_model = self.meta.service_model.operation_model(operation_name)
+ params = self._emit_api_params(
+ api_params=params,
+ operation_model=operation_model,
+ context=context,
+ )
+ bucket_is_arn = ArnParser.is_arn(params.get('Bucket', ''))
+ (
+ endpoint_url,
+ additional_headers,
+ properties,
+ ) = self._resolve_endpoint_ruleset(
+ operation_model,
+ params,
+ context,
+ ignore_signing_region=(not bucket_is_arn),
+ )
+
+ request_dict = self._convert_to_request_dict(
+ api_params=params,
+ operation_model=operation_model,
+ endpoint_url=endpoint_url,
+ context=context,
+ headers=additional_headers,
+ set_user_agent_header=False,
+ )
+
+ # Switch out the http method if user specified it.
+ if http_method is not None:
+ request_dict['method'] = http_method
+
+ # Generate the presigned url.
+ return request_signer.generate_presigned_url(
+ request_dict=request_dict,
+ expires_in=expires_in,
+ operation_name=operation_name,
+ )
+
+
+def add_generate_presigned_post(class_attributes, **kwargs):
+ class_attributes['generate_presigned_post'] = generate_presigned_post
+
+
+def generate_presigned_post(
+ self, Bucket, Key, Fields=None, Conditions=None, ExpiresIn=3600
+):
+ """Builds the url and the form fields used for a presigned s3 post
+
+ :type Bucket: string
+ :param Bucket: The name of the bucket to presign the post to. Note that
+ bucket related conditions should not be included in the
+ ``conditions`` parameter.
+
+ :type Key: string
+ :param Key: Key name, optionally add ${filename} to the end to
+ attach the submitted filename. Note that key related conditions and
+ fields are filled out for you and should not be included in the
+ ``Fields`` or ``Conditions`` parameter.
+
+ :type Fields: dict
+ :param Fields: A dictionary of prefilled form fields to build on top
+ of. Elements that may be included are acl, Cache-Control,
+ Content-Type, Content-Disposition, Content-Encoding, Expires,
+ success_action_redirect, redirect, success_action_status,
+ and x-amz-meta-.
+
+ Note that if a particular element is included in the fields
+ dictionary it will not be automatically added to the conditions
+ list. You must specify a condition for the element as well.
+
+ :type Conditions: list
+ :param Conditions: A list of conditions to include in the policy. Each
+ element can be either a list or a structure. For example:
+
+ .. code:: python
+
+ [
+ {"acl": "public-read"},
+ ["content-length-range", 2, 5],
+ ["starts-with", "$success_action_redirect", ""]
+ ]
+
+ Conditions that are included may pertain to acl,
+ content-length-range, Cache-Control, Content-Type,
+ Content-Disposition, Content-Encoding, Expires,
+ success_action_redirect, redirect, success_action_status,
+ and/or x-amz-meta-.
+
+ Note that if you include a condition, you must specify
+ a valid value in the fields dictionary as well. A value will
+ not be added automatically to the fields dictionary based on the
+ conditions.
+
+ :type ExpiresIn: int
+ :param ExpiresIn: The number of seconds the presigned post
+ is valid for.
+
+ :rtype: dict
+ :returns: A dictionary with two elements: ``url`` and ``fields``.
+ Url is the url to post to. Fields is a dictionary filled with
+ the form fields and respective values to use when submitting the
+ post. For example:
+
+ .. code:: python
+
+ {
+ 'url': 'https://amzn-s3-demo-bucket.s3.amazonaws.com',
+ 'fields': {
+ 'acl': 'public-read',
+ 'key': 'mykey',
+ 'signature': 'mysignature',
+ 'policy': 'mybase64 encoded policy'
+ }
+ }
+ """
+ bucket = Bucket
+ key = Key
+ fields = Fields
+ conditions = Conditions
+ expires_in = ExpiresIn
+
+ if fields is None:
+ fields = {}
+ else:
+ fields = fields.copy()
+
+ if conditions is None:
+ conditions = []
+
+ context = {
+ 'is_presign_request': True,
+ 'use_global_endpoint': _should_use_global_endpoint(self),
+ }
+
+ post_presigner = S3PostPresigner(self._request_signer)
+
+ # We choose the CreateBucket operation model because its url gets
+ # serialized to what a presign post requires.
+ operation_model = self.meta.service_model.operation_model('CreateBucket')
+ params = self._emit_api_params(
+ api_params={'Bucket': bucket},
+ operation_model=operation_model,
+ context=context,
+ )
+ bucket_is_arn = ArnParser.is_arn(params.get('Bucket', ''))
+ (
+ endpoint_url,
+ additional_headers,
+ properties,
+ ) = self._resolve_endpoint_ruleset(
+ operation_model,
+ params,
+ context,
+ ignore_signing_region=(not bucket_is_arn),
+ )
+
+ request_dict = self._convert_to_request_dict(
+ api_params=params,
+ operation_model=operation_model,
+ endpoint_url=endpoint_url,
+ context=context,
+ headers=additional_headers,
+ set_user_agent_header=False,
+ )
+
+ # Append that the bucket name to the list of conditions.
+ conditions.append({'bucket': bucket})
+
+ # If the key ends with filename, the only constraint that can be
+ # imposed is if it starts with the specified prefix.
+ if key.endswith('${filename}'):
+ conditions.append(["starts-with", '$key', key[: -len('${filename}')]])
+ else:
+ conditions.append({'key': key})
+
+ # Add the key to the fields.
+ fields['key'] = key
+
+ return post_presigner.generate_presigned_post(
+ request_dict=request_dict,
+ fields=fields,
+ conditions=conditions,
+ expires_in=expires_in,
+ )
+
+
+def _should_use_global_endpoint(client):
+ if client.meta.partition != 'aws':
+ return False
+ s3_config = client.meta.config.s3
+ if s3_config:
+ if s3_config.get('use_dualstack_endpoint', False):
+ return False
+ if (
+ s3_config.get('us_east_1_regional_endpoint') == 'regional'
+ and client.meta.config.region_name == 'us-east-1'
+ ):
+ return False
+ if s3_config.get('addressing_style') == 'virtual':
+ return False
+ return True
diff --git a/.venv/lib/python3.12/site-packages/botocore/stub.py b/.venv/lib/python3.12/site-packages/botocore/stub.py
new file mode 100644
index 00000000..018fc087
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/stub.py
@@ -0,0 +1,433 @@
+# Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import copy
+from collections import deque
+from pprint import pformat
+
+from botocore.awsrequest import AWSResponse
+from botocore.exceptions import (
+ ParamValidationError,
+ StubAssertionError,
+ StubResponseError,
+ UnStubbedResponseError,
+)
+from botocore.validate import validate_parameters
+
+
+class _ANY:
+ """
+ A helper object that compares equal to everything. Copied from
+ unittest.mock
+ """
+
+ def __eq__(self, other):
+ return True
+
+ def __ne__(self, other):
+ return False
+
+ def __repr__(self):
+ return '<ANY>'
+
+
+ANY = _ANY()
+
+
+class Stubber:
+ """
+ This class will allow you to stub out requests so you don't have to hit
+ an endpoint to write tests. Responses are returned first in, first out.
+ If operations are called out of order, or are called with no remaining
+ queued responses, an error will be raised.
+
+ **Example:**
+ ::
+ import datetime
+ import botocore.session
+ from botocore.stub import Stubber
+
+
+ s3 = botocore.session.get_session().create_client('s3')
+ stubber = Stubber(s3)
+
+ response = {
+ 'IsTruncated': False,
+ 'Name': 'test-bucket',
+ 'MaxKeys': 1000, 'Prefix': '',
+ 'Contents': [{
+ 'Key': 'test.txt',
+ 'ETag': '"abc123"',
+ 'StorageClass': 'STANDARD',
+ 'LastModified': datetime.datetime(2016, 1, 20, 22, 9),
+ 'Owner': {'ID': 'abc123', 'DisplayName': 'myname'},
+ 'Size': 14814
+ }],
+ 'EncodingType': 'url',
+ 'ResponseMetadata': {
+ 'RequestId': 'abc123',
+ 'HTTPStatusCode': 200,
+ 'HostId': 'abc123'
+ },
+ 'Marker': ''
+ }
+
+ expected_params = {'Bucket': 'test-bucket'}
+
+ stubber.add_response('list_objects', response, expected_params)
+ stubber.activate()
+
+ service_response = s3.list_objects(Bucket='test-bucket')
+ assert service_response == response
+
+
+ This class can also be called as a context manager, which will handle
+ activation / deactivation for you.
+
+ **Example:**
+ ::
+ import datetime
+ import botocore.session
+ from botocore.stub import Stubber
+
+
+ s3 = botocore.session.get_session().create_client('s3')
+
+ response = {
+ "Owner": {
+ "ID": "foo",
+ "DisplayName": "bar"
+ },
+ "Buckets": [{
+ "CreationDate": datetime.datetime(2016, 1, 20, 22, 9),
+ "Name": "baz"
+ }]
+ }
+
+
+ with Stubber(s3) as stubber:
+ stubber.add_response('list_buckets', response, {})
+ service_response = s3.list_buckets()
+
+ assert service_response == response
+
+
+ If you have an input parameter that is a randomly generated value, or you
+ otherwise don't care about its value, you can use ``stub.ANY`` to ignore
+ it in validation.
+
+ **Example:**
+ ::
+ import datetime
+ import botocore.session
+ from botocore.stub import Stubber, ANY
+
+
+ s3 = botocore.session.get_session().create_client('s3')
+ stubber = Stubber(s3)
+
+ response = {
+ 'IsTruncated': False,
+ 'Name': 'test-bucket',
+ 'MaxKeys': 1000, 'Prefix': '',
+ 'Contents': [{
+ 'Key': 'test.txt',
+ 'ETag': '"abc123"',
+ 'StorageClass': 'STANDARD',
+ 'LastModified': datetime.datetime(2016, 1, 20, 22, 9),
+ 'Owner': {'ID': 'abc123', 'DisplayName': 'myname'},
+ 'Size': 14814
+ }],
+ 'EncodingType': 'url',
+ 'ResponseMetadata': {
+ 'RequestId': 'abc123',
+ 'HTTPStatusCode': 200,
+ 'HostId': 'abc123'
+ },
+ 'Marker': ''
+ }
+
+ expected_params = {'Bucket': ANY}
+ stubber.add_response('list_objects', response, expected_params)
+
+ with stubber:
+ service_response = s3.list_objects(Bucket='test-bucket')
+
+ assert service_response == response
+ """
+
+ def __init__(self, client):
+ """
+ :param client: The client to add your stubs to.
+ """
+ self.client = client
+ self._event_id = 'boto_stubber'
+ self._expected_params_event_id = 'boto_stubber_expected_params'
+ self._queue = deque()
+
+ def __enter__(self):
+ self.activate()
+ return self
+
+ def __exit__(self, exception_type, exception_value, traceback):
+ self.deactivate()
+
+ def activate(self):
+ """
+ Activates the stubber on the client
+ """
+ self.client.meta.events.register_first(
+ 'before-parameter-build.*.*',
+ self._assert_expected_params,
+ unique_id=self._expected_params_event_id,
+ )
+ self.client.meta.events.register(
+ 'before-call.*.*',
+ self._get_response_handler,
+ unique_id=self._event_id,
+ )
+
+ def deactivate(self):
+ """
+ Deactivates the stubber on the client
+ """
+ self.client.meta.events.unregister(
+ 'before-parameter-build.*.*',
+ self._assert_expected_params,
+ unique_id=self._expected_params_event_id,
+ )
+ self.client.meta.events.unregister(
+ 'before-call.*.*',
+ self._get_response_handler,
+ unique_id=self._event_id,
+ )
+
+ def add_response(self, method, service_response, expected_params=None):
+ """
+ Adds a service response to the response queue. This will be validated
+ against the service model to ensure correctness. It should be noted,
+ however, that while missing attributes are often considered correct,
+ your code may not function properly if you leave them out. Therefore
+ you should always fill in every value you see in a typical response for
+ your particular request.
+
+ :param method: The name of the client method to stub.
+ :type method: str
+
+ :param service_response: A dict response stub. Provided parameters will
+ be validated against the service model.
+ :type service_response: dict
+
+ :param expected_params: A dictionary of the expected parameters to
+ be called for the provided service response. The parameters match
+ the names of keyword arguments passed to that client call. If
+ any of the parameters differ a ``StubResponseError`` is thrown.
+ You can use stub.ANY to indicate a particular parameter to ignore
+ in validation. stub.ANY is only valid for top level params.
+ """
+ self._add_response(method, service_response, expected_params)
+
+ def _add_response(self, method, service_response, expected_params):
+ if not hasattr(self.client, method):
+ raise ValueError(
+ f"Client {self.client.meta.service_model.service_name} "
+ f"does not have method: {method}"
+ )
+
+ # Create a successful http response
+ http_response = AWSResponse(None, 200, {}, None)
+
+ operation_name = self.client.meta.method_to_api_mapping.get(method)
+ self._validate_operation_response(operation_name, service_response)
+
+ # Add the service_response to the queue for returning responses
+ response = {
+ 'operation_name': operation_name,
+ 'response': (http_response, service_response),
+ 'expected_params': expected_params,
+ }
+ self._queue.append(response)
+
+ def add_client_error(
+ self,
+ method,
+ service_error_code='',
+ service_message='',
+ http_status_code=400,
+ service_error_meta=None,
+ expected_params=None,
+ response_meta=None,
+ modeled_fields=None,
+ ):
+ """
+ Adds a ``ClientError`` to the response queue.
+
+ :param method: The name of the service method to return the error on.
+ :type method: str
+
+ :param service_error_code: The service error code to return,
+ e.g. ``NoSuchBucket``
+ :type service_error_code: str
+
+ :param service_message: The service message to return, e.g.
+ 'The specified bucket does not exist.'
+ :type service_message: str
+
+ :param http_status_code: The HTTP status code to return, e.g. 404, etc
+ :type http_status_code: int
+
+ :param service_error_meta: Additional keys to be added to the
+ service Error
+ :type service_error_meta: dict
+
+ :param expected_params: A dictionary of the expected parameters to
+ be called for the provided service response. The parameters match
+ the names of keyword arguments passed to that client call. If
+ any of the parameters differ a ``StubResponseError`` is thrown.
+ You can use stub.ANY to indicate a particular parameter to ignore
+ in validation.
+
+ :param response_meta: Additional keys to be added to the
+ response's ResponseMetadata
+ :type response_meta: dict
+
+ :param modeled_fields: Additional keys to be added to the response
+ based on fields that are modeled for the particular error code.
+ These keys will be validated against the particular error shape
+ designated by the error code.
+ :type modeled_fields: dict
+
+ """
+ http_response = AWSResponse(None, http_status_code, {}, None)
+
+ # We don't look to the model to build this because the caller would
+ # need to know the details of what the HTTP body would need to
+ # look like.
+ parsed_response = {
+ 'ResponseMetadata': {'HTTPStatusCode': http_status_code},
+ 'Error': {'Message': service_message, 'Code': service_error_code},
+ }
+
+ if service_error_meta is not None:
+ parsed_response['Error'].update(service_error_meta)
+
+ if response_meta is not None:
+ parsed_response['ResponseMetadata'].update(response_meta)
+
+ if modeled_fields is not None:
+ service_model = self.client.meta.service_model
+ shape = service_model.shape_for_error_code(service_error_code)
+ self._validate_response(shape, modeled_fields)
+ parsed_response.update(modeled_fields)
+
+ operation_name = self.client.meta.method_to_api_mapping.get(method)
+ # Note that we do not allow for expected_params while
+ # adding errors into the queue yet.
+ response = {
+ 'operation_name': operation_name,
+ 'response': (http_response, parsed_response),
+ 'expected_params': expected_params,
+ }
+ self._queue.append(response)
+
+ def assert_no_pending_responses(self):
+ """
+ Asserts that all expected calls were made.
+ """
+ remaining = len(self._queue)
+ if remaining != 0:
+ raise AssertionError(f"{remaining} responses remaining in queue.")
+
+ def _assert_expected_call_order(self, model, params):
+ if not self._queue:
+ raise UnStubbedResponseError(
+ operation_name=model.name,
+ reason=(
+ 'Unexpected API Call: A call was made but no additional '
+ 'calls expected. Either the API Call was not stubbed or '
+ 'it was called multiple times.'
+ ),
+ )
+
+ name = self._queue[0]['operation_name']
+ if name != model.name:
+ raise StubResponseError(
+ operation_name=model.name,
+ reason=f'Operation mismatch: found response for {name}.',
+ )
+
+ def _get_response_handler(self, model, params, context, **kwargs):
+ self._assert_expected_call_order(model, params)
+ # Pop off the entire response once everything has been validated
+ return self._queue.popleft()['response']
+
+ def _assert_expected_params(self, model, params, context, **kwargs):
+ if self._should_not_stub(context):
+ return
+ self._assert_expected_call_order(model, params)
+ expected_params = self._queue[0]['expected_params']
+ if expected_params is None:
+ return
+
+ # Validate the parameters are equal
+ for param, value in expected_params.items():
+ if param not in params or expected_params[param] != params[param]:
+ raise StubAssertionError(
+ operation_name=model.name,
+ reason=(
+ f'Expected parameters:\n{pformat(expected_params)},\n'
+ f'but received:\n{pformat(params)}'
+ ),
+ )
+
+ # Ensure there are no extra params hanging around
+ if sorted(expected_params.keys()) != sorted(params.keys()):
+ raise StubAssertionError(
+ operation_name=model.name,
+ reason=(
+ f'Expected parameters:\n{pformat(expected_params)},\n'
+ f'but received:\n{pformat(params)}'
+ ),
+ )
+
+ def _should_not_stub(self, context):
+ # Do not include presign requests when processing stubbed client calls
+ # as a presign request will never have an HTTP request sent over the
+ # wire for it and therefore not receive a response back.
+ if context and context.get('is_presign_request'):
+ return True
+
+ def _validate_operation_response(self, operation_name, service_response):
+ service_model = self.client.meta.service_model
+ operation_model = service_model.operation_model(operation_name)
+ output_shape = operation_model.output_shape
+
+ # Remove ResponseMetadata so that the validator doesn't attempt to
+ # perform validation on it.
+ response = service_response
+ if 'ResponseMetadata' in response:
+ response = copy.copy(service_response)
+ del response['ResponseMetadata']
+
+ self._validate_response(output_shape, response)
+
+ def _validate_response(self, shape, response):
+ if shape is not None:
+ validate_parameters(response, shape)
+ elif response:
+ # If the output shape is None, that means the response should be
+ # empty apart from ResponseMetadata
+ raise ParamValidationError(
+ report=(
+ "Service response should only contain ResponseMetadata."
+ )
+ )
diff --git a/.venv/lib/python3.12/site-packages/botocore/tokens.py b/.venv/lib/python3.12/site-packages/botocore/tokens.py
new file mode 100644
index 00000000..6e616946
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/tokens.py
@@ -0,0 +1,330 @@
+# Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import json
+import logging
+import os
+import threading
+from datetime import datetime, timedelta
+from typing import NamedTuple, Optional
+
+import dateutil.parser
+from dateutil.tz import tzutc
+
+from botocore import UNSIGNED
+from botocore.compat import total_seconds
+from botocore.config import Config
+from botocore.exceptions import (
+ ClientError,
+ InvalidConfigError,
+ TokenRetrievalError,
+)
+from botocore.utils import CachedProperty, JSONFileCache, SSOTokenLoader
+
+logger = logging.getLogger(__name__)
+
+
+def _utc_now():
+ return datetime.now(tzutc())
+
+
+def create_token_resolver(session):
+ providers = [
+ SSOTokenProvider(session),
+ ]
+ return TokenProviderChain(providers=providers)
+
+
+def _serialize_utc_timestamp(obj):
+ if isinstance(obj, datetime):
+ return obj.strftime("%Y-%m-%dT%H:%M:%SZ")
+ return obj
+
+
+def _sso_json_dumps(obj):
+ return json.dumps(obj, default=_serialize_utc_timestamp)
+
+
+class FrozenAuthToken(NamedTuple):
+ token: str
+ expiration: Optional[datetime] = None
+
+
+class DeferredRefreshableToken:
+ # The time at which we'll attempt to refresh, but not block if someone else
+ # is refreshing.
+ _advisory_refresh_timeout = 15 * 60
+ # The time at which all threads will block waiting for a refreshed token
+ _mandatory_refresh_timeout = 10 * 60
+ # Refresh at most once every minute to avoid blocking every request
+ _attempt_timeout = 60
+
+ def __init__(self, method, refresh_using, time_fetcher=_utc_now):
+ self._time_fetcher = time_fetcher
+ self._refresh_using = refresh_using
+ self.method = method
+
+ # The frozen token is protected by this lock
+ self._refresh_lock = threading.Lock()
+ self._frozen_token = None
+ self._next_refresh = None
+
+ def get_frozen_token(self):
+ self._refresh()
+ return self._frozen_token
+
+ def _refresh(self):
+ # If we don't need to refresh just return
+ refresh_type = self._should_refresh()
+ if not refresh_type:
+ return None
+
+ # Block for refresh if we're in the mandatory refresh window
+ block_for_refresh = refresh_type == "mandatory"
+ if self._refresh_lock.acquire(block_for_refresh):
+ try:
+ self._protected_refresh()
+ finally:
+ self._refresh_lock.release()
+
+ def _protected_refresh(self):
+ # This should only be called after acquiring the refresh lock
+ # Another thread may have already refreshed, double check refresh
+ refresh_type = self._should_refresh()
+ if not refresh_type:
+ return None
+
+ try:
+ now = self._time_fetcher()
+ self._next_refresh = now + timedelta(seconds=self._attempt_timeout)
+ self._frozen_token = self._refresh_using()
+ except Exception:
+ logger.warning(
+ "Refreshing token failed during the %s refresh period.",
+ refresh_type,
+ exc_info=True,
+ )
+ if refresh_type == "mandatory":
+ # This refresh was mandatory, error must be propagated back
+ raise
+
+ if self._is_expired():
+ # Fresh credentials should never be expired
+ raise TokenRetrievalError(
+ provider=self.method,
+ error_msg="Token has expired and refresh failed",
+ )
+
+ def _is_expired(self):
+ if self._frozen_token is None:
+ return False
+
+ expiration = self._frozen_token.expiration
+ remaining = total_seconds(expiration - self._time_fetcher())
+ return remaining <= 0
+
+ def _should_refresh(self):
+ if self._frozen_token is None:
+ # We don't have a token yet, mandatory refresh
+ return "mandatory"
+
+ expiration = self._frozen_token.expiration
+ if expiration is None:
+ # No expiration, so assume we don't need to refresh.
+ return None
+
+ now = self._time_fetcher()
+ if now < self._next_refresh:
+ return None
+
+ remaining = total_seconds(expiration - now)
+
+ if remaining < self._mandatory_refresh_timeout:
+ return "mandatory"
+ elif remaining < self._advisory_refresh_timeout:
+ return "advisory"
+
+ return None
+
+
+class TokenProviderChain:
+ def __init__(self, providers=None):
+ if providers is None:
+ providers = []
+ self._providers = providers
+
+ def load_token(self):
+ for provider in self._providers:
+ token = provider.load_token()
+ if token is not None:
+ return token
+ return None
+
+
+class SSOTokenProvider:
+ METHOD = "sso"
+ _REFRESH_WINDOW = 15 * 60
+ _SSO_TOKEN_CACHE_DIR = os.path.expanduser(
+ os.path.join("~", ".aws", "sso", "cache")
+ )
+ _SSO_CONFIG_VARS = [
+ "sso_start_url",
+ "sso_region",
+ ]
+ _GRANT_TYPE = "refresh_token"
+ DEFAULT_CACHE_CLS = JSONFileCache
+
+ def __init__(
+ self, session, cache=None, time_fetcher=_utc_now, profile_name=None
+ ):
+ self._session = session
+ if cache is None:
+ cache = self.DEFAULT_CACHE_CLS(
+ self._SSO_TOKEN_CACHE_DIR,
+ dumps_func=_sso_json_dumps,
+ )
+ self._now = time_fetcher
+ self._cache = cache
+ self._token_loader = SSOTokenLoader(cache=self._cache)
+ self._profile_name = (
+ profile_name
+ or self._session.get_config_variable("profile")
+ or 'default'
+ )
+
+ def _load_sso_config(self):
+ loaded_config = self._session.full_config
+ profiles = loaded_config.get("profiles", {})
+ sso_sessions = loaded_config.get("sso_sessions", {})
+ profile_config = profiles.get(self._profile_name, {})
+
+ if "sso_session" not in profile_config:
+ return
+
+ sso_session_name = profile_config["sso_session"]
+ sso_config = sso_sessions.get(sso_session_name, None)
+
+ if not sso_config:
+ error_msg = (
+ f'The profile "{self._profile_name}" is configured to use the SSO '
+ f'token provider but the "{sso_session_name}" sso_session '
+ f"configuration does not exist."
+ )
+ raise InvalidConfigError(error_msg=error_msg)
+
+ missing_configs = []
+ for var in self._SSO_CONFIG_VARS:
+ if var not in sso_config:
+ missing_configs.append(var)
+
+ if missing_configs:
+ error_msg = (
+ f'The profile "{self._profile_name}" is configured to use the SSO '
+ f"token provider but is missing the following configuration: "
+ f"{missing_configs}."
+ )
+ raise InvalidConfigError(error_msg=error_msg)
+
+ return {
+ "session_name": sso_session_name,
+ "sso_region": sso_config["sso_region"],
+ "sso_start_url": sso_config["sso_start_url"],
+ }
+
+ @CachedProperty
+ def _sso_config(self):
+ return self._load_sso_config()
+
+ @CachedProperty
+ def _client(self):
+ config = Config(
+ region_name=self._sso_config["sso_region"],
+ signature_version=UNSIGNED,
+ )
+ return self._session.create_client("sso-oidc", config=config)
+
+ def _attempt_create_token(self, token):
+ response = self._client.create_token(
+ grantType=self._GRANT_TYPE,
+ clientId=token["clientId"],
+ clientSecret=token["clientSecret"],
+ refreshToken=token["refreshToken"],
+ )
+ expires_in = timedelta(seconds=response["expiresIn"])
+ new_token = {
+ "startUrl": self._sso_config["sso_start_url"],
+ "region": self._sso_config["sso_region"],
+ "accessToken": response["accessToken"],
+ "expiresAt": self._now() + expires_in,
+ # Cache the registration alongside the token
+ "clientId": token["clientId"],
+ "clientSecret": token["clientSecret"],
+ "registrationExpiresAt": token["registrationExpiresAt"],
+ }
+ if "refreshToken" in response:
+ new_token["refreshToken"] = response["refreshToken"]
+ logger.info("SSO Token refresh succeeded")
+ return new_token
+
+ def _refresh_access_token(self, token):
+ keys = (
+ "refreshToken",
+ "clientId",
+ "clientSecret",
+ "registrationExpiresAt",
+ )
+ missing_keys = [k for k in keys if k not in token]
+ if missing_keys:
+ msg = f"Unable to refresh SSO token: missing keys: {missing_keys}"
+ logger.info(msg)
+ return None
+
+ expiry = dateutil.parser.parse(token["registrationExpiresAt"])
+ if total_seconds(expiry - self._now()) <= 0:
+ logger.info(f"SSO token registration expired at {expiry}")
+ return None
+
+ try:
+ return self._attempt_create_token(token)
+ except ClientError:
+ logger.warning("SSO token refresh attempt failed", exc_info=True)
+ return None
+
+ def _refresher(self):
+ start_url = self._sso_config["sso_start_url"]
+ session_name = self._sso_config["session_name"]
+ logger.info(f"Loading cached SSO token for {session_name}")
+ token_dict = self._token_loader(start_url, session_name=session_name)
+ expiration = dateutil.parser.parse(token_dict["expiresAt"])
+ logger.debug(f"Cached SSO token expires at {expiration}")
+
+ remaining = total_seconds(expiration - self._now())
+ if remaining < self._REFRESH_WINDOW:
+ new_token_dict = self._refresh_access_token(token_dict)
+ if new_token_dict is not None:
+ token_dict = new_token_dict
+ expiration = token_dict["expiresAt"]
+ self._token_loader.save_token(
+ start_url, token_dict, session_name=session_name
+ )
+
+ return FrozenAuthToken(
+ token_dict["accessToken"], expiration=expiration
+ )
+
+ def load_token(self):
+ if self._sso_config is None:
+ return None
+
+ return DeferredRefreshableToken(
+ self.METHOD, self._refresher, time_fetcher=self._now
+ )
diff --git a/.venv/lib/python3.12/site-packages/botocore/translate.py b/.venv/lib/python3.12/site-packages/botocore/translate.py
new file mode 100644
index 00000000..ecfe3bca
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/translate.py
@@ -0,0 +1,78 @@
+# Copyright (c) 2012-2013 Mitch Garnaat http://garnaat.org/
+# Copyright 2012-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import copy
+
+from botocore.utils import merge_dicts
+
+
+def build_retry_config(
+ endpoint_prefix, retry_model, definitions, client_retry_config=None
+):
+ service_config = retry_model.get(endpoint_prefix, {})
+ resolve_references(service_config, definitions)
+ # We want to merge the global defaults with the service specific
+ # defaults, with the service specific defaults taking precedence.
+ # So we use the global defaults as the base.
+ #
+ # A deepcopy is done on the retry defaults because it ensures the
+ # retry model has no chance of getting mutated when the service specific
+ # configuration or client retry config is merged in.
+ final_retry_config = {
+ '__default__': copy.deepcopy(retry_model.get('__default__', {}))
+ }
+ resolve_references(final_retry_config, definitions)
+ # The merge the service specific config on top.
+ merge_dicts(final_retry_config, service_config)
+ if client_retry_config is not None:
+ _merge_client_retry_config(final_retry_config, client_retry_config)
+ return final_retry_config
+
+
+def _merge_client_retry_config(retry_config, client_retry_config):
+ max_retry_attempts_override = client_retry_config.get('max_attempts')
+ if max_retry_attempts_override is not None:
+ # In the retry config, the max_attempts refers to the maximum number
+ # of requests in general will be made. However, for the client's
+ # retry config it refers to how many retry attempts will be made at
+ # most. So to translate this number from the client config, one is
+ # added to convert it to the maximum number request that will be made
+ # by including the initial request.
+ #
+ # It is also important to note that if we ever support per operation
+ # configuration in the retry model via the client, we will need to
+ # revisit this logic to make sure max_attempts gets applied
+ # per operation.
+ retry_config['__default__']['max_attempts'] = (
+ max_retry_attempts_override + 1
+ )
+
+
+def resolve_references(config, definitions):
+ """Recursively replace $ref keys.
+
+ To cut down on duplication, common definitions can be declared
+ (and passed in via the ``definitions`` attribute) and then
+ references as {"$ref": "name"}, when this happens the reference
+ dict is placed with the value from the ``definition`` dict.
+
+ This is recursively done.
+
+ """
+ for key, value in config.items():
+ if isinstance(value, dict):
+ if len(value) == 1 and list(value.keys())[0] == '$ref':
+ # Then we need to resolve this reference.
+ config[key] = definitions[list(value.values())[0]]
+ else:
+ resolve_references(value, definitions)
diff --git a/.venv/lib/python3.12/site-packages/botocore/useragent.py b/.venv/lib/python3.12/site-packages/botocore/useragent.py
new file mode 100644
index 00000000..f4ac39cb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/useragent.py
@@ -0,0 +1,617 @@
+# Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+"""
+NOTE: All classes and functions in this module are considered private and are
+subject to abrupt breaking changes. Please do not use them directly.
+
+To modify the User-Agent header sent by botocore, use one of these
+configuration options:
+* The ``AWS_SDK_UA_APP_ID`` environment variable.
+* The ``sdk_ua_app_id`` setting in the shared AWS config file.
+* The ``user_agent_appid`` field in the :py:class:`botocore.config.Config`.
+* The ``user_agent_extra`` field in the :py:class:`botocore.config.Config`.
+
+"""
+
+import logging
+import os
+import platform
+from copy import copy
+from string import ascii_letters, digits
+from typing import NamedTuple, Optional
+
+from botocore import __version__ as botocore_version
+from botocore.compat import HAS_CRT
+from botocore.context import get_context
+
+logger = logging.getLogger(__name__)
+
+
+_USERAGENT_ALLOWED_CHARACTERS = ascii_letters + digits + "!$%&'*+-.^_`|~,"
+_USERAGENT_ALLOWED_OS_NAMES = (
+ 'windows',
+ 'linux',
+ 'macos',
+ 'android',
+ 'ios',
+ 'watchos',
+ 'tvos',
+ 'other',
+)
+_USERAGENT_PLATFORM_NAME_MAPPINGS = {'darwin': 'macos'}
+# The name by which botocore is identified in the User-Agent header. While most
+# AWS SDKs follow a naming pattern of "aws-sdk-*", botocore and boto3 continue
+# using their existing values. Uses uppercase "B" with all other characters
+# lowercase.
+_USERAGENT_SDK_NAME = 'Botocore'
+_USERAGENT_FEATURE_MAPPINGS = {
+ 'WAITER': 'B',
+ 'PAGINATOR': 'C',
+ 'S3_TRANSFER': 'G',
+ 'ENDPOINT_OVERRIDE': 'N',
+ 'SIGV4A_SIGNING': 'S',
+}
+
+
+def register_feature_id(feature_id):
+ """Adds metric value to the current context object's ``features`` set.
+
+ :type feature_id: str
+ :param feature_id: The name of the feature to register. Value must be a key
+ in the ``_USERAGENT_FEATURE_MAPPINGS`` dict.
+ """
+ ctx = get_context()
+ if ctx is None:
+ # Never register features outside the scope of a
+ # ``botocore.context.start_as_current_context`` context manager.
+ # Otherwise, the context variable won't be reset and features will
+ # bleed into all subsequent requests. Return instead of raising an
+ # exception since this function could be invoked in a public interface.
+ return
+ if val := _USERAGENT_FEATURE_MAPPINGS.get(feature_id):
+ ctx.features.add(val)
+
+
+def sanitize_user_agent_string_component(raw_str, allow_hash):
+ """Replaces all not allowed characters in the string with a dash ("-").
+
+ Allowed characters are ASCII alphanumerics and ``!$%&'*+-.^_`|~,``. If
+ ``allow_hash`` is ``True``, "#"``" is also allowed.
+
+ :type raw_str: str
+ :param raw_str: The input string to be sanitized.
+
+ :type allow_hash: bool
+ :param allow_hash: Whether "#" is considered an allowed character.
+ """
+ return ''.join(
+ c
+ if c in _USERAGENT_ALLOWED_CHARACTERS or (allow_hash and c == '#')
+ else '-'
+ for c in raw_str
+ )
+
+
+class UserAgentComponentSizeConfig:
+ """
+ Configures the max size of a built user agent string component and the
+ delimiter used to truncate the string if the size is above the max.
+ """
+
+ def __init__(self, max_size_in_bytes: int, delimiter: str):
+ self.max_size_in_bytes = max_size_in_bytes
+ self.delimiter = delimiter
+ self._validate_input()
+
+ def _validate_input(self):
+ if self.max_size_in_bytes < 1:
+ raise ValueError(
+ f'Invalid `max_size_in_bytes`: {self.max_size_in_bytes}. '
+ 'Value must be a positive integer.'
+ )
+
+
+class UserAgentComponent(NamedTuple):
+ """
+ Component of a Botocore User-Agent header string in the standard format.
+
+ Each component consists of a prefix, a name, a value, and a size_config.
+ In the string representation these are combined in the format
+ ``prefix/name#value``.
+
+ ``size_config`` configures the max size and truncation strategy for the
+ built user agent string component.
+
+ This class is considered private and is subject to abrupt breaking changes.
+ """
+
+ prefix: str
+ name: str
+ value: Optional[str] = None
+ size_config: Optional[UserAgentComponentSizeConfig] = None
+
+ def to_string(self):
+ """Create string like 'prefix/name#value' from a UserAgentComponent."""
+ clean_prefix = sanitize_user_agent_string_component(
+ self.prefix, allow_hash=True
+ )
+ clean_name = sanitize_user_agent_string_component(
+ self.name, allow_hash=False
+ )
+ if self.value is None or self.value == '':
+ clean_string = f'{clean_prefix}/{clean_name}'
+ else:
+ clean_value = sanitize_user_agent_string_component(
+ self.value, allow_hash=True
+ )
+ clean_string = f'{clean_prefix}/{clean_name}#{clean_value}'
+ if self.size_config is not None:
+ clean_string = self._truncate_string(
+ clean_string,
+ self.size_config.max_size_in_bytes,
+ self.size_config.delimiter,
+ )
+ return clean_string
+
+ def _truncate_string(self, string, max_size, delimiter):
+ """
+ Pop ``delimiter``-separated values until encoded string is less than or
+ equal to ``max_size``.
+ """
+ orig = string
+ while len(string.encode('utf-8')) > max_size:
+ parts = string.split(delimiter)
+ parts.pop()
+ string = delimiter.join(parts)
+
+ if string == '':
+ logger.debug(
+ f"User agent component `{orig}` could not be truncated to "
+ f"`{max_size}` bytes with delimiter "
+ f"`{delimiter}` without losing all contents. "
+ f"Value will be omitted from user agent string."
+ )
+ return string
+
+
+class RawStringUserAgentComponent:
+ """
+ UserAgentComponent interface wrapper around ``str``.
+
+ Use for User-Agent header components that are not constructed from
+ prefix+name+value but instead are provided as strings. No sanitization is
+ performed.
+ """
+
+ def __init__(self, value):
+ self._value = value
+
+ def to_string(self):
+ return self._value
+
+
+# This is not a public interface and is subject to abrupt breaking changes.
+# Any usage is not advised or supported in external code bases.
+try:
+ from botocore.customizations.useragent import modify_components
+except ImportError:
+ # Default implementation that returns unmodified User-Agent components.
+ def modify_components(components):
+ return components
+
+
+class UserAgentString:
+ """
+ Generator for AWS SDK User-Agent header strings.
+
+ The User-Agent header format contains information from session, client, and
+ request context. ``UserAgentString`` provides methods for collecting the
+ information and ``to_string`` for assembling it into the standardized
+ string format.
+
+ Example usage:
+
+ ua_session = UserAgentString.from_environment()
+ ua_session.set_session_config(...)
+ ua_client = ua_session.with_client_config(Config(...))
+ ua_string = ua_request.to_string()
+
+ For testing or when information from all sources is available at the same
+ time, the methods can be chained:
+
+ ua_string = (
+ UserAgentString
+ .from_environment()
+ .set_session_config(...)
+ .with_client_config(Config(...))
+ .to_string()
+ )
+
+ """
+
+ def __init__(
+ self,
+ platform_name,
+ platform_version,
+ platform_machine,
+ python_version,
+ python_implementation,
+ execution_env,
+ crt_version=None,
+ ):
+ """
+ :type platform_name: str
+ :param platform_name: Name of the operating system or equivalent
+ platform name. Should be sourced from :py:meth:`platform.system`.
+ :type platform_version: str
+ :param platform_version: Version of the operating system or equivalent
+ platform name. Should be sourced from :py:meth:`platform.version`.
+ :type platform_machine: str
+ :param platform_version: Processor architecture or machine type. For
+ example "x86_64". Should be sourced from :py:meth:`platform.machine`.
+ :type python_version: str
+ :param python_version: Version of the python implementation as str.
+ Should be sourced from :py:meth:`platform.python_version`.
+ :type python_implementation: str
+ :param python_implementation: Name of the python implementation.
+ Should be sourced from :py:meth:`platform.python_implementation`.
+ :type execution_env: str
+ :param execution_env: The value of the AWS execution environment.
+ Should be sourced from the ``AWS_EXECUTION_ENV` environment
+ variable.
+ :type crt_version: str
+ :param crt_version: Version string of awscrt package, if installed.
+ """
+ self._platform_name = platform_name
+ self._platform_version = platform_version
+ self._platform_machine = platform_machine
+ self._python_version = python_version
+ self._python_implementation = python_implementation
+ self._execution_env = execution_env
+ self._crt_version = crt_version
+
+ # Components that can be added with ``set_session_config()``
+ self._session_user_agent_name = None
+ self._session_user_agent_version = None
+ self._session_user_agent_extra = None
+
+ self._client_config = None
+
+ # Component that can be set with ``set_client_features()``
+ self._client_features = None
+
+ @classmethod
+ def from_environment(cls):
+ crt_version = None
+ if HAS_CRT:
+ crt_version = _get_crt_version() or 'Unknown'
+ return cls(
+ platform_name=platform.system(),
+ platform_version=platform.release(),
+ platform_machine=platform.machine(),
+ python_version=platform.python_version(),
+ python_implementation=platform.python_implementation(),
+ execution_env=os.environ.get('AWS_EXECUTION_ENV'),
+ crt_version=crt_version,
+ )
+
+ def set_session_config(
+ self,
+ session_user_agent_name,
+ session_user_agent_version,
+ session_user_agent_extra,
+ ):
+ """
+ Set the user agent configuration values that apply at session level.
+
+ :param user_agent_name: The user agent name configured in the
+ :py:class:`botocore.session.Session` object. For backwards
+ compatibility, this will always be at the beginning of the
+ User-Agent string, together with ``user_agent_version``.
+ :param user_agent_version: The user agent version configured in the
+ :py:class:`botocore.session.Session` object.
+ :param user_agent_extra: The user agent "extra" configured in the
+ :py:class:`botocore.session.Session` object.
+ """
+ self._session_user_agent_name = session_user_agent_name
+ self._session_user_agent_version = session_user_agent_version
+ self._session_user_agent_extra = session_user_agent_extra
+ return self
+
+ def set_client_features(self, features):
+ """
+ Persist client-specific features registered before or during client
+ creation.
+
+ :type features: Set[str]
+ :param features: A set of client-specific features.
+ """
+ self._client_features = features
+
+ def with_client_config(self, client_config):
+ """
+ Create a copy with all original values and client-specific values.
+
+ :type client_config: botocore.config.Config
+ :param client_config: The client configuration object.
+ """
+ cp = copy(self)
+ cp._client_config = client_config
+ return cp
+
+ def to_string(self):
+ """
+ Build User-Agent header string from the object's properties.
+ """
+ config_ua_override = None
+ if self._client_config:
+ if hasattr(self._client_config, '_supplied_user_agent'):
+ config_ua_override = self._client_config._supplied_user_agent
+ else:
+ config_ua_override = self._client_config.user_agent
+
+ if config_ua_override is not None:
+ return self._build_legacy_ua_string(config_ua_override)
+
+ components = [
+ *self._build_sdk_metadata(),
+ RawStringUserAgentComponent('ua/2.1'),
+ *self._build_os_metadata(),
+ *self._build_architecture_metadata(),
+ *self._build_language_metadata(),
+ *self._build_execution_env_metadata(),
+ *self._build_feature_metadata(),
+ *self._build_config_metadata(),
+ *self._build_app_id(),
+ *self._build_extra(),
+ ]
+
+ components = modify_components(components)
+
+ return ' '.join(
+ [comp.to_string() for comp in components if comp.to_string()]
+ )
+
+ def _build_sdk_metadata(self):
+ """
+ Build the SDK name and version component of the User-Agent header.
+
+ For backwards-compatibility both session-level and client-level config
+ of custom tool names are honored. If this removes the Botocore
+ information from the start of the string, Botocore's name and version
+ are included as a separate field with "md" prefix.
+ """
+ sdk_md = []
+ if (
+ self._session_user_agent_name
+ and self._session_user_agent_version
+ and (
+ self._session_user_agent_name != _USERAGENT_SDK_NAME
+ or self._session_user_agent_version != botocore_version
+ )
+ ):
+ sdk_md.extend(
+ [
+ UserAgentComponent(
+ self._session_user_agent_name,
+ self._session_user_agent_version,
+ ),
+ UserAgentComponent(
+ 'md', _USERAGENT_SDK_NAME, botocore_version
+ ),
+ ]
+ )
+ else:
+ sdk_md.append(
+ UserAgentComponent(_USERAGENT_SDK_NAME, botocore_version)
+ )
+
+ if self._crt_version is not None:
+ sdk_md.append(
+ UserAgentComponent('md', 'awscrt', self._crt_version)
+ )
+
+ return sdk_md
+
+ def _build_os_metadata(self):
+ """
+ Build the OS/platform components of the User-Agent header string.
+
+ For recognized platform names that match or map to an entry in the list
+ of standardized OS names, a single component with prefix "os" is
+ returned. Otherwise, one component "os/other" is returned and a second
+ with prefix "md" and the raw platform name.
+
+ String representations of example return values:
+ * ``os/macos#10.13.6``
+ * ``os/linux``
+ * ``os/other``
+ * ``os/other md/foobar#1.2.3``
+ """
+ if self._platform_name is None:
+ return [UserAgentComponent('os', 'other')]
+
+ plt_name_lower = self._platform_name.lower()
+ if plt_name_lower in _USERAGENT_ALLOWED_OS_NAMES:
+ os_family = plt_name_lower
+ elif plt_name_lower in _USERAGENT_PLATFORM_NAME_MAPPINGS:
+ os_family = _USERAGENT_PLATFORM_NAME_MAPPINGS[plt_name_lower]
+ else:
+ os_family = None
+
+ if os_family is not None:
+ return [
+ UserAgentComponent('os', os_family, self._platform_version)
+ ]
+ else:
+ return [
+ UserAgentComponent('os', 'other'),
+ UserAgentComponent(
+ 'md', self._platform_name, self._platform_version
+ ),
+ ]
+
+ def _build_architecture_metadata(self):
+ """
+ Build architecture component of the User-Agent header string.
+
+ Returns the machine type with prefix "md" and name "arch", if one is
+ available. Common values include "x86_64", "arm64", "i386".
+ """
+ if self._platform_machine:
+ return [
+ UserAgentComponent(
+ 'md', 'arch', self._platform_machine.lower()
+ )
+ ]
+ return []
+
+ def _build_language_metadata(self):
+ """
+ Build the language components of the User-Agent header string.
+
+ Returns the Python version in a component with prefix "lang" and name
+ "python". The Python implementation (e.g. CPython, PyPy) is returned as
+ separate metadata component with prefix "md" and name "pyimpl".
+
+ String representation of an example return value:
+ ``lang/python#3.10.4 md/pyimpl#CPython``
+ """
+ lang_md = [
+ UserAgentComponent('lang', 'python', self._python_version),
+ ]
+ if self._python_implementation:
+ lang_md.append(
+ UserAgentComponent('md', 'pyimpl', self._python_implementation)
+ )
+ return lang_md
+
+ def _build_execution_env_metadata(self):
+ """
+ Build the execution environment component of the User-Agent header.
+
+ Returns a single component prefixed with "exec-env", usually sourced
+ from the environment variable AWS_EXECUTION_ENV.
+ """
+ if self._execution_env:
+ return [UserAgentComponent('exec-env', self._execution_env)]
+ else:
+ return []
+
+ def _build_feature_metadata(self):
+ """
+ Build the features component of the User-Agent header string.
+
+ Returns a single component with prefix "m" followed by a list of
+ comma-separated metric values.
+ """
+ ctx = get_context()
+ context_features = set() if ctx is None else ctx.features
+ client_features = self._client_features or set()
+ features = client_features.union(context_features)
+ if not features:
+ return []
+ size_config = UserAgentComponentSizeConfig(1024, ',')
+ return [
+ UserAgentComponent(
+ 'm', ','.join(features), size_config=size_config
+ )
+ ]
+
+ def _build_config_metadata(self):
+ """
+ Build the configuration components of the User-Agent header string.
+
+ Returns a list of components with prefix "cfg" followed by the config
+ setting name and its value. Tracked configuration settings may be
+ added or removed in future versions.
+ """
+ if not self._client_config or not self._client_config.retries:
+ return []
+ retry_mode = self._client_config.retries.get('mode')
+ cfg_md = [UserAgentComponent('cfg', 'retry-mode', retry_mode)]
+ if self._client_config.endpoint_discovery_enabled:
+ cfg_md.append(UserAgentComponent('cfg', 'endpoint-discovery'))
+ return cfg_md
+
+ def _build_app_id(self):
+ """
+ Build app component of the User-Agent header string.
+
+ Returns a single component with prefix "app" and value sourced from the
+ ``user_agent_appid`` field in :py:class:`botocore.config.Config` or
+ the ``sdk_ua_app_id`` setting in the shared configuration file, or the
+ ``AWS_SDK_UA_APP_ID`` environment variable. These are the recommended
+ ways for apps built with Botocore to insert their identifer into the
+ User-Agent header.
+ """
+ if self._client_config and self._client_config.user_agent_appid:
+ return [
+ UserAgentComponent('app', self._client_config.user_agent_appid)
+ ]
+ else:
+ return []
+
+ def _build_extra(self):
+ """User agent string components based on legacy "extra" settings.
+
+ Creates components from the session-level and client-level
+ ``user_agent_extra`` setting, if present. Both are passed through
+ verbatim and should be appended at the end of the string.
+
+ Preferred ways to inject application-specific information into
+ botocore's User-Agent header string are the ``user_agent_appid` field
+ in :py:class:`botocore.config.Config`. The ``AWS_SDK_UA_APP_ID``
+ environment variable and the ``sdk_ua_app_id`` configuration file
+ setting are alternative ways to set the ``user_agent_appid`` config.
+ """
+ extra = []
+ if self._session_user_agent_extra:
+ extra.append(
+ RawStringUserAgentComponent(self._session_user_agent_extra)
+ )
+ if self._client_config and self._client_config.user_agent_extra:
+ extra.append(
+ RawStringUserAgentComponent(
+ self._client_config.user_agent_extra
+ )
+ )
+ return extra
+
+ def _build_legacy_ua_string(self, config_ua_override):
+ components = [config_ua_override]
+ if self._session_user_agent_extra:
+ components.append(self._session_user_agent_extra)
+ if self._client_config.user_agent_extra:
+ components.append(self._client_config.user_agent_extra)
+ return ' '.join(components)
+
+ def rebuild_and_replace_user_agent_handler(
+ self, operation_name, request, **kwargs
+ ):
+ ua_string = self.to_string()
+ if request.headers.get('User-Agent'):
+ request.headers.replace_header('User-Agent', ua_string)
+
+
+def _get_crt_version():
+ """
+ This function is considered private and is subject to abrupt breaking
+ changes.
+ """
+ try:
+ import awscrt
+
+ return awscrt.__version__
+ except AttributeError:
+ return None
diff --git a/.venv/lib/python3.12/site-packages/botocore/utils.py b/.venv/lib/python3.12/site-packages/botocore/utils.py
new file mode 100644
index 00000000..30a513ea
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/utils.py
@@ -0,0 +1,3635 @@
+# Copyright 2012-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import base64
+import binascii
+import datetime
+import email.message
+import functools
+import hashlib
+import io
+import logging
+import os
+import random
+import re
+import socket
+import time
+import warnings
+import weakref
+from datetime import datetime as _DatetimeClass
+from ipaddress import ip_address
+from pathlib import Path
+from urllib.request import getproxies, proxy_bypass
+
+import dateutil.parser
+from dateutil.tz import tzutc
+from urllib3.exceptions import LocationParseError
+
+import botocore
+import botocore.awsrequest
+import botocore.httpsession
+
+# IP Regexes retained for backwards compatibility
+from botocore.compat import HEX_PAT # noqa: F401
+from botocore.compat import IPV4_PAT # noqa: F401
+from botocore.compat import IPV6_ADDRZ_PAT # noqa: F401
+from botocore.compat import IPV6_PAT # noqa: F401
+from botocore.compat import LS32_PAT # noqa: F401
+from botocore.compat import UNRESERVED_PAT # noqa: F401
+from botocore.compat import ZONE_ID_PAT # noqa: F401
+from botocore.compat import (
+ HAS_CRT,
+ IPV4_RE,
+ IPV6_ADDRZ_RE,
+ MD5_AVAILABLE,
+ UNSAFE_URL_CHARS,
+ OrderedDict,
+ get_md5,
+ get_tzinfo_options,
+ json,
+ quote,
+ urlparse,
+ urlsplit,
+ urlunsplit,
+ zip_longest,
+)
+from botocore.exceptions import (
+ ClientError,
+ ConfigNotFound,
+ ConnectionClosedError,
+ ConnectTimeoutError,
+ EndpointConnectionError,
+ HTTPClientError,
+ InvalidDNSNameError,
+ InvalidEndpointConfigurationError,
+ InvalidExpressionError,
+ InvalidHostLabelError,
+ InvalidIMDSEndpointError,
+ InvalidIMDSEndpointModeError,
+ InvalidRegionError,
+ MetadataRetrievalError,
+ MissingDependencyException,
+ ReadTimeoutError,
+ SSOTokenLoadError,
+ UnsupportedOutpostResourceError,
+ UnsupportedS3AccesspointConfigurationError,
+ UnsupportedS3ArnError,
+ UnsupportedS3ConfigurationError,
+ UnsupportedS3ControlArnError,
+ UnsupportedS3ControlConfigurationError,
+)
+
+logger = logging.getLogger(__name__)
+DEFAULT_METADATA_SERVICE_TIMEOUT = 1
+METADATA_BASE_URL = 'http://169.254.169.254/'
+METADATA_BASE_URL_IPv6 = 'http://[fd00:ec2::254]/'
+METADATA_ENDPOINT_MODES = ('ipv4', 'ipv6')
+
+# These are chars that do not need to be urlencoded.
+# Based on rfc2986, section 2.3
+SAFE_CHARS = '-._~'
+LABEL_RE = re.compile(r'[a-z0-9][a-z0-9\-]*[a-z0-9]')
+RETRYABLE_HTTP_ERRORS = (
+ ReadTimeoutError,
+ EndpointConnectionError,
+ ConnectionClosedError,
+ ConnectTimeoutError,
+)
+S3_ACCELERATE_WHITELIST = ['dualstack']
+# In switching events from using service name / endpoint prefix to service
+# id, we have to preserve compatibility. This maps the instances where either
+# is different than the transformed service id.
+EVENT_ALIASES = {
+ "api.mediatailor": "mediatailor",
+ "api.pricing": "pricing",
+ "api.sagemaker": "sagemaker",
+ "apigateway": "api-gateway",
+ "application-autoscaling": "application-auto-scaling",
+ "appstream2": "appstream",
+ "autoscaling": "auto-scaling",
+ "autoscaling-plans": "auto-scaling-plans",
+ "ce": "cost-explorer",
+ "cloudhsmv2": "cloudhsm-v2",
+ "cloudsearchdomain": "cloudsearch-domain",
+ "cognito-idp": "cognito-identity-provider",
+ "config": "config-service",
+ "cur": "cost-and-usage-report-service",
+ "data.iot": "iot-data-plane",
+ "data.jobs.iot": "iot-jobs-data-plane",
+ "data.mediastore": "mediastore-data",
+ "datapipeline": "data-pipeline",
+ "devicefarm": "device-farm",
+ "directconnect": "direct-connect",
+ "discovery": "application-discovery-service",
+ "dms": "database-migration-service",
+ "ds": "directory-service",
+ "dynamodbstreams": "dynamodb-streams",
+ "elasticbeanstalk": "elastic-beanstalk",
+ "elasticfilesystem": "efs",
+ "elasticloadbalancing": "elastic-load-balancing",
+ "elasticmapreduce": "emr",
+ "elastictranscoder": "elastic-transcoder",
+ "elb": "elastic-load-balancing",
+ "elbv2": "elastic-load-balancing-v2",
+ "email": "ses",
+ "entitlement.marketplace": "marketplace-entitlement-service",
+ "es": "elasticsearch-service",
+ "events": "eventbridge",
+ "cloudwatch-events": "eventbridge",
+ "iot-data": "iot-data-plane",
+ "iot-jobs-data": "iot-jobs-data-plane",
+ "kinesisanalytics": "kinesis-analytics",
+ "kinesisvideo": "kinesis-video",
+ "lex-models": "lex-model-building-service",
+ "lex-runtime": "lex-runtime-service",
+ "logs": "cloudwatch-logs",
+ "machinelearning": "machine-learning",
+ "marketplace-entitlement": "marketplace-entitlement-service",
+ "marketplacecommerceanalytics": "marketplace-commerce-analytics",
+ "metering.marketplace": "marketplace-metering",
+ "meteringmarketplace": "marketplace-metering",
+ "mgh": "migration-hub",
+ "models.lex": "lex-model-building-service",
+ "monitoring": "cloudwatch",
+ "mturk-requester": "mturk",
+ "opsworks-cm": "opsworkscm",
+ "resourcegroupstaggingapi": "resource-groups-tagging-api",
+ "route53": "route-53",
+ "route53domains": "route-53-domains",
+ "runtime.lex": "lex-runtime-service",
+ "runtime.sagemaker": "sagemaker-runtime",
+ "sdb": "simpledb",
+ "secretsmanager": "secrets-manager",
+ "serverlessrepo": "serverlessapplicationrepository",
+ "servicecatalog": "service-catalog",
+ "states": "sfn",
+ "stepfunctions": "sfn",
+ "storagegateway": "storage-gateway",
+ "streams.dynamodb": "dynamodb-streams",
+ "tagging": "resource-groups-tagging-api",
+}
+
+
+# This pattern can be used to detect if a header is a flexible checksum header
+CHECKSUM_HEADER_PATTERN = re.compile(
+ r'^X-Amz-Checksum-([a-z0-9]*)$',
+ flags=re.IGNORECASE,
+)
+
+
+def ensure_boolean(val):
+ """Ensures a boolean value if a string or boolean is provided
+
+ For strings, the value for True/False is case insensitive
+ """
+ if isinstance(val, bool):
+ return val
+ elif isinstance(val, str):
+ return val.lower() == 'true'
+ else:
+ return False
+
+
+def resolve_imds_endpoint_mode(session):
+ """Resolving IMDS endpoint mode to either IPv6 or IPv4.
+
+ ec2_metadata_service_endpoint_mode takes precedence over imds_use_ipv6.
+ """
+ endpoint_mode = session.get_config_variable(
+ 'ec2_metadata_service_endpoint_mode'
+ )
+ if endpoint_mode is not None:
+ lendpoint_mode = endpoint_mode.lower()
+ if lendpoint_mode not in METADATA_ENDPOINT_MODES:
+ error_msg_kwargs = {
+ 'mode': endpoint_mode,
+ 'valid_modes': METADATA_ENDPOINT_MODES,
+ }
+ raise InvalidIMDSEndpointModeError(**error_msg_kwargs)
+ return lendpoint_mode
+ elif session.get_config_variable('imds_use_ipv6'):
+ return 'ipv6'
+ return 'ipv4'
+
+
+def is_json_value_header(shape):
+ """Determines if the provided shape is the special header type jsonvalue.
+
+ :type shape: botocore.shape
+ :param shape: Shape to be inspected for the jsonvalue trait.
+
+ :return: True if this type is a jsonvalue, False otherwise
+ :rtype: Bool
+ """
+ return (
+ hasattr(shape, 'serialization')
+ and shape.serialization.get('jsonvalue', False)
+ and shape.serialization.get('location') == 'header'
+ and shape.type_name == 'string'
+ )
+
+
+def has_header(header_name, headers):
+ """Case-insensitive check for header key."""
+ if header_name is None:
+ return False
+ elif isinstance(headers, botocore.awsrequest.HeadersDict):
+ return header_name in headers
+ else:
+ return header_name.lower() in [key.lower() for key in headers.keys()]
+
+
+def get_service_module_name(service_model):
+ """Returns the module name for a service
+
+ This is the value used in both the documentation and client class name
+ """
+ name = service_model.metadata.get(
+ 'serviceAbbreviation',
+ service_model.metadata.get(
+ 'serviceFullName', service_model.service_name
+ ),
+ )
+ name = name.replace('Amazon', '')
+ name = name.replace('AWS', '')
+ name = re.sub(r'\W+', '', name)
+ return name
+
+
+def normalize_url_path(path):
+ if not path:
+ return '/'
+ return remove_dot_segments(path)
+
+
+def normalize_boolean(val):
+ """Returns None if val is None, otherwise ensure value
+ converted to boolean"""
+ if val is None:
+ return val
+ else:
+ return ensure_boolean(val)
+
+
+def remove_dot_segments(url):
+ # RFC 3986, section 5.2.4 "Remove Dot Segments"
+ # Also, AWS services require consecutive slashes to be removed,
+ # so that's done here as well
+ if not url:
+ return ''
+ input_url = url.split('/')
+ output_list = []
+ for x in input_url:
+ if x and x != '.':
+ if x == '..':
+ if output_list:
+ output_list.pop()
+ else:
+ output_list.append(x)
+
+ if url[0] == '/':
+ first = '/'
+ else:
+ first = ''
+ if url[-1] == '/' and output_list:
+ last = '/'
+ else:
+ last = ''
+ return first + '/'.join(output_list) + last
+
+
+def validate_jmespath_for_set(expression):
+ # Validates a limited jmespath expression to determine if we can set a
+ # value based on it. Only works with dotted paths.
+ if not expression or expression == '.':
+ raise InvalidExpressionError(expression=expression)
+
+ for invalid in ['[', ']', '*']:
+ if invalid in expression:
+ raise InvalidExpressionError(expression=expression)
+
+
+def set_value_from_jmespath(source, expression, value, is_first=True):
+ # This takes a (limited) jmespath-like expression & can set a value based
+ # on it.
+ # Limitations:
+ # * Only handles dotted lookups
+ # * No offsets/wildcards/slices/etc.
+ if is_first:
+ validate_jmespath_for_set(expression)
+
+ bits = expression.split('.', 1)
+ current_key, remainder = bits[0], bits[1] if len(bits) > 1 else ''
+
+ if not current_key:
+ raise InvalidExpressionError(expression=expression)
+
+ if remainder:
+ if current_key not in source:
+ # We've got something in the expression that's not present in the
+ # source (new key). If there's any more bits, we'll set the key
+ # with an empty dictionary.
+ source[current_key] = {}
+
+ return set_value_from_jmespath(
+ source[current_key], remainder, value, is_first=False
+ )
+
+ # If we're down to a single key, set it.
+ source[current_key] = value
+
+
+def is_global_accesspoint(context):
+ """Determine if request is intended for an MRAP accesspoint."""
+ s3_accesspoint = context.get('s3_accesspoint', {})
+ is_global = s3_accesspoint.get('region') == ''
+ return is_global
+
+
+class _RetriesExceededError(Exception):
+ """Internal exception used when the number of retries are exceeded."""
+
+ pass
+
+
+class BadIMDSRequestError(Exception):
+ def __init__(self, request):
+ self.request = request
+
+
+class IMDSFetcher:
+ _RETRIES_EXCEEDED_ERROR_CLS = _RetriesExceededError
+ _TOKEN_PATH = 'latest/api/token'
+ _TOKEN_TTL = '21600'
+
+ def __init__(
+ self,
+ timeout=DEFAULT_METADATA_SERVICE_TIMEOUT,
+ num_attempts=1,
+ base_url=METADATA_BASE_URL,
+ env=None,
+ user_agent=None,
+ config=None,
+ ):
+ self._timeout = timeout
+ self._num_attempts = num_attempts
+ if config is None:
+ config = {}
+ self._base_url = self._select_base_url(base_url, config)
+ self._config = config
+
+ if env is None:
+ env = os.environ.copy()
+ self._disabled = (
+ env.get('AWS_EC2_METADATA_DISABLED', 'false').lower() == 'true'
+ )
+ self._imds_v1_disabled = config.get('ec2_metadata_v1_disabled')
+ self._user_agent = user_agent
+ self._session = botocore.httpsession.URLLib3Session(
+ timeout=self._timeout,
+ proxies=get_environ_proxies(self._base_url),
+ )
+
+ def get_base_url(self):
+ return self._base_url
+
+ def _select_base_url(self, base_url, config):
+ if config is None:
+ config = {}
+
+ requires_ipv6 = (
+ config.get('ec2_metadata_service_endpoint_mode') == 'ipv6'
+ )
+ custom_metadata_endpoint = config.get('ec2_metadata_service_endpoint')
+
+ if requires_ipv6 and custom_metadata_endpoint:
+ logger.warning(
+ "Custom endpoint and IMDS_USE_IPV6 are both set. Using custom endpoint."
+ )
+
+ chosen_base_url = None
+
+ if base_url != METADATA_BASE_URL:
+ chosen_base_url = base_url
+ elif custom_metadata_endpoint:
+ chosen_base_url = custom_metadata_endpoint
+ elif requires_ipv6:
+ chosen_base_url = METADATA_BASE_URL_IPv6
+ else:
+ chosen_base_url = METADATA_BASE_URL
+
+ logger.debug(f"IMDS ENDPOINT: {chosen_base_url}")
+ if not is_valid_uri(chosen_base_url):
+ raise InvalidIMDSEndpointError(endpoint=chosen_base_url)
+
+ return chosen_base_url
+
+ def _construct_url(self, path):
+ sep = ''
+ if self._base_url and not self._base_url.endswith('/'):
+ sep = '/'
+ return f'{self._base_url}{sep}{path}'
+
+ def _fetch_metadata_token(self):
+ self._assert_enabled()
+ url = self._construct_url(self._TOKEN_PATH)
+ headers = {
+ 'x-aws-ec2-metadata-token-ttl-seconds': self._TOKEN_TTL,
+ }
+ self._add_user_agent(headers)
+ request = botocore.awsrequest.AWSRequest(
+ method='PUT', url=url, headers=headers
+ )
+ for i in range(self._num_attempts):
+ try:
+ response = self._session.send(request.prepare())
+ if response.status_code == 200:
+ return response.text
+ elif response.status_code in (404, 403, 405):
+ return None
+ elif response.status_code in (400,):
+ raise BadIMDSRequestError(request)
+ except ReadTimeoutError:
+ return None
+ except RETRYABLE_HTTP_ERRORS as e:
+ logger.debug(
+ "Caught retryable HTTP exception while making metadata "
+ "service request to %s: %s",
+ url,
+ e,
+ exc_info=True,
+ )
+ except HTTPClientError as e:
+ if isinstance(e.kwargs.get('error'), LocationParseError):
+ raise InvalidIMDSEndpointError(endpoint=url, error=e)
+ else:
+ raise
+ return None
+
+ def _get_request(self, url_path, retry_func, token=None):
+ """Make a get request to the Instance Metadata Service.
+
+ :type url_path: str
+ :param url_path: The path component of the URL to make a get request.
+ This arg is appended to the base_url that was provided in the
+ initializer.
+
+ :type retry_func: callable
+ :param retry_func: A function that takes the response as an argument
+ and determines if it needs to retry. By default empty and non
+ 200 OK responses are retried.
+
+ :type token: str
+ :param token: Metadata token to send along with GET requests to IMDS.
+ """
+ self._assert_enabled()
+ if not token:
+ self._assert_v1_enabled()
+ if retry_func is None:
+ retry_func = self._default_retry
+ url = self._construct_url(url_path)
+ headers = {}
+ if token is not None:
+ headers['x-aws-ec2-metadata-token'] = token
+ self._add_user_agent(headers)
+ for i in range(self._num_attempts):
+ try:
+ request = botocore.awsrequest.AWSRequest(
+ method='GET', url=url, headers=headers
+ )
+ response = self._session.send(request.prepare())
+ if not retry_func(response):
+ return response
+ except RETRYABLE_HTTP_ERRORS as e:
+ logger.debug(
+ "Caught retryable HTTP exception while making metadata "
+ "service request to %s: %s",
+ url,
+ e,
+ exc_info=True,
+ )
+ raise self._RETRIES_EXCEEDED_ERROR_CLS()
+
+ def _add_user_agent(self, headers):
+ if self._user_agent is not None:
+ headers['User-Agent'] = self._user_agent
+
+ def _assert_enabled(self):
+ if self._disabled:
+ logger.debug("Access to EC2 metadata has been disabled.")
+ raise self._RETRIES_EXCEEDED_ERROR_CLS()
+
+ def _assert_v1_enabled(self):
+ if self._imds_v1_disabled:
+ raise MetadataRetrievalError(
+ error_msg="Unable to retrieve token for use in IMDSv2 call and IMDSv1 has been disabled"
+ )
+
+ def _default_retry(self, response):
+ return self._is_non_ok_response(response) or self._is_empty(response)
+
+ def _is_non_ok_response(self, response):
+ if response.status_code != 200:
+ self._log_imds_response(response, 'non-200', log_body=True)
+ return True
+ return False
+
+ def _is_empty(self, response):
+ if not response.content:
+ self._log_imds_response(response, 'no body', log_body=True)
+ return True
+ return False
+
+ def _log_imds_response(self, response, reason_to_log, log_body=False):
+ statement = (
+ "Metadata service returned %s response "
+ "with status code of %s for url: %s"
+ )
+ logger_args = [reason_to_log, response.status_code, response.url]
+ if log_body:
+ statement += ", content body: %s"
+ logger_args.append(response.content)
+ logger.debug(statement, *logger_args)
+
+
+class InstanceMetadataFetcher(IMDSFetcher):
+ _URL_PATH = 'latest/meta-data/iam/security-credentials/'
+ _REQUIRED_CREDENTIAL_FIELDS = [
+ 'AccessKeyId',
+ 'SecretAccessKey',
+ 'Token',
+ 'Expiration',
+ ]
+
+ def retrieve_iam_role_credentials(self):
+ try:
+ token = self._fetch_metadata_token()
+ role_name = self._get_iam_role(token)
+ credentials = self._get_credentials(role_name, token)
+ if self._contains_all_credential_fields(credentials):
+ credentials = {
+ 'role_name': role_name,
+ 'access_key': credentials['AccessKeyId'],
+ 'secret_key': credentials['SecretAccessKey'],
+ 'token': credentials['Token'],
+ 'expiry_time': credentials['Expiration'],
+ }
+ self._evaluate_expiration(credentials)
+ return credentials
+ else:
+ # IMDS can return a 200 response that has a JSON formatted
+ # error message (i.e. if ec2 is not trusted entity for the
+ # attached role). We do not necessarily want to retry for
+ # these and we also do not necessarily want to raise a key
+ # error. So at least log the problematic response and return
+ # an empty dictionary to signal that it was not able to
+ # retrieve credentials. These error will contain both a
+ # Code and Message key.
+ if 'Code' in credentials and 'Message' in credentials:
+ logger.debug(
+ 'Error response received when retrieving'
+ 'credentials: %s.',
+ credentials,
+ )
+ return {}
+ except self._RETRIES_EXCEEDED_ERROR_CLS:
+ logger.debug(
+ "Max number of attempts exceeded (%s) when "
+ "attempting to retrieve data from metadata service.",
+ self._num_attempts,
+ )
+ except BadIMDSRequestError as e:
+ logger.debug("Bad IMDS request: %s", e.request)
+ return {}
+
+ def _get_iam_role(self, token=None):
+ return self._get_request(
+ url_path=self._URL_PATH,
+ retry_func=self._needs_retry_for_role_name,
+ token=token,
+ ).text
+
+ def _get_credentials(self, role_name, token=None):
+ r = self._get_request(
+ url_path=self._URL_PATH + role_name,
+ retry_func=self._needs_retry_for_credentials,
+ token=token,
+ )
+ return json.loads(r.text)
+
+ def _is_invalid_json(self, response):
+ try:
+ json.loads(response.text)
+ return False
+ except ValueError:
+ self._log_imds_response(response, 'invalid json')
+ return True
+
+ def _needs_retry_for_role_name(self, response):
+ return self._is_non_ok_response(response) or self._is_empty(response)
+
+ def _needs_retry_for_credentials(self, response):
+ return (
+ self._is_non_ok_response(response)
+ or self._is_empty(response)
+ or self._is_invalid_json(response)
+ )
+
+ def _contains_all_credential_fields(self, credentials):
+ for field in self._REQUIRED_CREDENTIAL_FIELDS:
+ if field not in credentials:
+ logger.debug(
+ 'Retrieved credentials is missing required field: %s',
+ field,
+ )
+ return False
+ return True
+
+ def _evaluate_expiration(self, credentials):
+ expiration = credentials.get("expiry_time")
+ if expiration is None:
+ return
+ try:
+ expiration = datetime.datetime.strptime(
+ expiration, "%Y-%m-%dT%H:%M:%SZ"
+ )
+ refresh_interval = self._config.get(
+ "ec2_credential_refresh_window", 60 * 10
+ )
+ jitter = random.randint(120, 600) # Between 2 to 10 minutes
+ refresh_interval_with_jitter = refresh_interval + jitter
+ current_time = datetime.datetime.utcnow()
+ refresh_offset = datetime.timedelta(
+ seconds=refresh_interval_with_jitter
+ )
+ extension_time = expiration - refresh_offset
+ if current_time >= extension_time:
+ new_time = current_time + refresh_offset
+ credentials["expiry_time"] = new_time.strftime(
+ "%Y-%m-%dT%H:%M:%SZ"
+ )
+ logger.info(
+ f"Attempting credential expiration extension due to a "
+ f"credential service availability issue. A refresh of "
+ f"these credentials will be attempted again within "
+ f"the next {refresh_interval_with_jitter/60:.0f} minutes."
+ )
+ except ValueError:
+ logger.debug(
+ f"Unable to parse expiry_time in {credentials['expiry_time']}"
+ )
+
+
+class IMDSRegionProvider:
+ def __init__(self, session, environ=None, fetcher=None):
+ """Initialize IMDSRegionProvider.
+ :type session: :class:`botocore.session.Session`
+ :param session: The session is needed to look up configuration for
+ how to contact the instance metadata service. Specifically the
+ whether or not it should use the IMDS region at all, and if so how
+ to configure the timeout and number of attempts to reach the
+ service.
+ :type environ: None or dict
+ :param environ: A dictionary of environment variables to use. If
+ ``None`` is the argument then ``os.environ`` will be used by
+ default.
+ :type fecther: :class:`botocore.utils.InstanceMetadataRegionFetcher`
+ :param fetcher: The class to actually handle the fetching of the region
+ from the IMDS. If not provided a default one will be created.
+ """
+ self._session = session
+ if environ is None:
+ environ = os.environ
+ self._environ = environ
+ self._fetcher = fetcher
+
+ def provide(self):
+ """Provide the region value from IMDS."""
+ instance_region = self._get_instance_metadata_region()
+ return instance_region
+
+ def _get_instance_metadata_region(self):
+ fetcher = self._get_fetcher()
+ region = fetcher.retrieve_region()
+ return region
+
+ def _get_fetcher(self):
+ if self._fetcher is None:
+ self._fetcher = self._create_fetcher()
+ return self._fetcher
+
+ def _create_fetcher(self):
+ metadata_timeout = self._session.get_config_variable(
+ 'metadata_service_timeout'
+ )
+ metadata_num_attempts = self._session.get_config_variable(
+ 'metadata_service_num_attempts'
+ )
+ imds_config = {
+ 'ec2_metadata_service_endpoint': self._session.get_config_variable(
+ 'ec2_metadata_service_endpoint'
+ ),
+ 'ec2_metadata_service_endpoint_mode': resolve_imds_endpoint_mode(
+ self._session
+ ),
+ 'ec2_metadata_v1_disabled': self._session.get_config_variable(
+ 'ec2_metadata_v1_disabled'
+ ),
+ }
+ fetcher = InstanceMetadataRegionFetcher(
+ timeout=metadata_timeout,
+ num_attempts=metadata_num_attempts,
+ env=self._environ,
+ user_agent=self._session.user_agent(),
+ config=imds_config,
+ )
+ return fetcher
+
+
+class InstanceMetadataRegionFetcher(IMDSFetcher):
+ _URL_PATH = 'latest/meta-data/placement/availability-zone/'
+
+ def retrieve_region(self):
+ """Get the current region from the instance metadata service.
+ :rvalue: str
+ :returns: The region the current instance is running in or None
+ if the instance metadata service cannot be contacted or does not
+ give a valid response.
+ :rtype: None or str
+ :returns: Returns the region as a string if it is configured to use
+ IMDS as a region source. Otherwise returns ``None``. It will also
+ return ``None`` if it fails to get the region from IMDS due to
+ exhausting its retries or not being able to connect.
+ """
+ try:
+ region = self._get_region()
+ return region
+ except self._RETRIES_EXCEEDED_ERROR_CLS:
+ logger.debug(
+ "Max number of attempts exceeded (%s) when "
+ "attempting to retrieve data from metadata service.",
+ self._num_attempts,
+ )
+ return None
+
+ def _get_region(self):
+ token = self._fetch_metadata_token()
+ response = self._get_request(
+ url_path=self._URL_PATH,
+ retry_func=self._default_retry,
+ token=token,
+ )
+ availability_zone = response.text
+ region = availability_zone[:-1]
+ return region
+
+
+def merge_dicts(dict1, dict2, append_lists=False):
+ """Given two dict, merge the second dict into the first.
+
+ The dicts can have arbitrary nesting.
+
+ :param append_lists: If true, instead of clobbering a list with the new
+ value, append all of the new values onto the original list.
+ """
+ for key in dict2:
+ if isinstance(dict2[key], dict):
+ if key in dict1 and key in dict2:
+ merge_dicts(dict1[key], dict2[key])
+ else:
+ dict1[key] = dict2[key]
+ # If the value is a list and the ``append_lists`` flag is set,
+ # append the new values onto the original list
+ elif isinstance(dict2[key], list) and append_lists:
+ # The value in dict1 must be a list in order to append new
+ # values onto it.
+ if key in dict1 and isinstance(dict1[key], list):
+ dict1[key].extend(dict2[key])
+ else:
+ dict1[key] = dict2[key]
+ else:
+ # At scalar types, we iterate and merge the
+ # current dict that we're on.
+ dict1[key] = dict2[key]
+
+
+def lowercase_dict(original):
+ """Copies the given dictionary ensuring all keys are lowercase strings."""
+ copy = {}
+ for key in original:
+ copy[key.lower()] = original[key]
+ return copy
+
+
+def parse_key_val_file(filename, _open=open):
+ try:
+ with _open(filename) as f:
+ contents = f.read()
+ return parse_key_val_file_contents(contents)
+ except OSError:
+ raise ConfigNotFound(path=filename)
+
+
+def parse_key_val_file_contents(contents):
+ # This was originally extracted from the EC2 credential provider, which was
+ # fairly lenient in its parsing. We only try to parse key/val pairs if
+ # there's a '=' in the line.
+ final = {}
+ for line in contents.splitlines():
+ if '=' not in line:
+ continue
+ key, val = line.split('=', 1)
+ key = key.strip()
+ val = val.strip()
+ final[key] = val
+ return final
+
+
+def percent_encode_sequence(mapping, safe=SAFE_CHARS):
+ """Urlencode a dict or list into a string.
+
+ This is similar to urllib.urlencode except that:
+
+ * It uses quote, and not quote_plus
+ * It has a default list of safe chars that don't need
+ to be encoded, which matches what AWS services expect.
+
+ If any value in the input ``mapping`` is a list type,
+ then each list element wil be serialized. This is the equivalent
+ to ``urlencode``'s ``doseq=True`` argument.
+
+ This function should be preferred over the stdlib
+ ``urlencode()`` function.
+
+ :param mapping: Either a dict to urlencode or a list of
+ ``(key, value)`` pairs.
+
+ """
+ encoded_pairs = []
+ if hasattr(mapping, 'items'):
+ pairs = mapping.items()
+ else:
+ pairs = mapping
+ for key, value in pairs:
+ if isinstance(value, list):
+ for element in value:
+ encoded_pairs.append(
+ f'{percent_encode(key)}={percent_encode(element)}'
+ )
+ else:
+ encoded_pairs.append(
+ f'{percent_encode(key)}={percent_encode(value)}'
+ )
+ return '&'.join(encoded_pairs)
+
+
+def percent_encode(input_str, safe=SAFE_CHARS):
+ """Urlencodes a string.
+
+ Whereas percent_encode_sequence handles taking a dict/sequence and
+ producing a percent encoded string, this function deals only with
+ taking a string (not a dict/sequence) and percent encoding it.
+
+ If given the binary type, will simply URL encode it. If given the
+ text type, will produce the binary type by UTF-8 encoding the
+ text. If given something else, will convert it to the text type
+ first.
+ """
+ # If its not a binary or text string, make it a text string.
+ if not isinstance(input_str, (bytes, str)):
+ input_str = str(input_str)
+ # If it's not bytes, make it bytes by UTF-8 encoding it.
+ if not isinstance(input_str, bytes):
+ input_str = input_str.encode('utf-8')
+ return quote(input_str, safe=safe)
+
+
+def _epoch_seconds_to_datetime(value, tzinfo):
+ """Parse numerical epoch timestamps (seconds since 1970) into a
+ ``datetime.datetime`` in UTC using ``datetime.timedelta``. This is intended
+ as fallback when ``fromtimestamp`` raises ``OverflowError`` or ``OSError``.
+
+ :type value: float or int
+ :param value: The Unix timestamps as number.
+
+ :type tzinfo: callable
+ :param tzinfo: A ``datetime.tzinfo`` class or compatible callable.
+ """
+ epoch_zero = datetime.datetime(1970, 1, 1, 0, 0, 0, tzinfo=tzutc())
+ epoch_zero_localized = epoch_zero.astimezone(tzinfo())
+ return epoch_zero_localized + datetime.timedelta(seconds=value)
+
+
+def _parse_timestamp_with_tzinfo(value, tzinfo):
+ """Parse timestamp with pluggable tzinfo options."""
+ if isinstance(value, (int, float)):
+ # Possibly an epoch time.
+ return datetime.datetime.fromtimestamp(value, tzinfo())
+ else:
+ try:
+ return datetime.datetime.fromtimestamp(float(value), tzinfo())
+ except (TypeError, ValueError):
+ pass
+ try:
+ # In certain cases, a timestamp marked with GMT can be parsed into a
+ # different time zone, so here we provide a context which will
+ # enforce that GMT == UTC.
+ return dateutil.parser.parse(value, tzinfos={'GMT': tzutc()})
+ except (TypeError, ValueError) as e:
+ raise ValueError(f'Invalid timestamp "{value}": {e}')
+
+
+def parse_timestamp(value):
+ """Parse a timestamp into a datetime object.
+
+ Supported formats:
+
+ * iso8601
+ * rfc822
+ * epoch (value is an integer)
+
+ This will return a ``datetime.datetime`` object.
+
+ """
+ tzinfo_options = get_tzinfo_options()
+ for tzinfo in tzinfo_options:
+ try:
+ return _parse_timestamp_with_tzinfo(value, tzinfo)
+ except (OSError, OverflowError) as e:
+ logger.debug(
+ 'Unable to parse timestamp with "%s" timezone info.',
+ tzinfo.__name__,
+ exc_info=e,
+ )
+ # For numeric values attempt fallback to using fromtimestamp-free method.
+ # From Python's ``datetime.datetime.fromtimestamp`` documentation: "This
+ # may raise ``OverflowError``, if the timestamp is out of the range of
+ # values supported by the platform C localtime() function, and ``OSError``
+ # on localtime() failure. It's common for this to be restricted to years
+ # from 1970 through 2038."
+ try:
+ numeric_value = float(value)
+ except (TypeError, ValueError):
+ pass
+ else:
+ try:
+ for tzinfo in tzinfo_options:
+ return _epoch_seconds_to_datetime(numeric_value, tzinfo=tzinfo)
+ except (OSError, OverflowError) as e:
+ logger.debug(
+ 'Unable to parse timestamp using fallback method with "%s" '
+ 'timezone info.',
+ tzinfo.__name__,
+ exc_info=e,
+ )
+ raise RuntimeError(
+ f'Unable to calculate correct timezone offset for "{value}"'
+ )
+
+
+def parse_to_aware_datetime(value):
+ """Converted the passed in value to a datetime object with tzinfo.
+
+ This function can be used to normalize all timestamp inputs. This
+ function accepts a number of different types of inputs, but
+ will always return a datetime.datetime object with time zone
+ information.
+
+ The input param ``value`` can be one of several types:
+
+ * A datetime object (both naive and aware)
+ * An integer representing the epoch time (can also be a string
+ of the integer, i.e '0', instead of 0). The epoch time is
+ considered to be UTC.
+ * An iso8601 formatted timestamp. This does not need to be
+ a complete timestamp, it can contain just the date portion
+ without the time component.
+
+ The returned value will be a datetime object that will have tzinfo.
+ If no timezone info was provided in the input value, then UTC is
+ assumed, not local time.
+
+ """
+ # This is a general purpose method that handles several cases of
+ # converting the provided value to a string timestamp suitable to be
+ # serialized to an http request. It can handle:
+ # 1) A datetime.datetime object.
+ if isinstance(value, _DatetimeClass):
+ datetime_obj = value
+ else:
+ # 2) A string object that's formatted as a timestamp.
+ # We document this as being an iso8601 timestamp, although
+ # parse_timestamp is a bit more flexible.
+ datetime_obj = parse_timestamp(value)
+ if datetime_obj.tzinfo is None:
+ # I think a case would be made that if no time zone is provided,
+ # we should use the local time. However, to restore backwards
+ # compat, the previous behavior was to assume UTC, which is
+ # what we're going to do here.
+ datetime_obj = datetime_obj.replace(tzinfo=tzutc())
+ else:
+ datetime_obj = datetime_obj.astimezone(tzutc())
+ return datetime_obj
+
+
+def datetime2timestamp(dt, default_timezone=None):
+ """Calculate the timestamp based on the given datetime instance.
+
+ :type dt: datetime
+ :param dt: A datetime object to be converted into timestamp
+ :type default_timezone: tzinfo
+ :param default_timezone: If it is provided as None, we treat it as tzutc().
+ But it is only used when dt is a naive datetime.
+ :returns: The timestamp
+ """
+ epoch = datetime.datetime(1970, 1, 1)
+ if dt.tzinfo is None:
+ if default_timezone is None:
+ default_timezone = tzutc()
+ dt = dt.replace(tzinfo=default_timezone)
+ d = dt.replace(tzinfo=None) - dt.utcoffset() - epoch
+ return d.total_seconds()
+
+
+def calculate_sha256(body, as_hex=False):
+ """Calculate a sha256 checksum.
+
+ This method will calculate the sha256 checksum of a file like
+ object. Note that this method will iterate through the entire
+ file contents. The caller is responsible for ensuring the proper
+ starting position of the file and ``seek()``'ing the file back
+ to its starting location if other consumers need to read from
+ the file like object.
+
+ :param body: Any file like object. The file must be opened
+ in binary mode such that a ``.read()`` call returns bytes.
+ :param as_hex: If True, then the hex digest is returned.
+ If False, then the digest (as binary bytes) is returned.
+
+ :returns: The sha256 checksum
+
+ """
+ checksum = hashlib.sha256()
+ for chunk in iter(lambda: body.read(1024 * 1024), b''):
+ checksum.update(chunk)
+ if as_hex:
+ return checksum.hexdigest()
+ else:
+ return checksum.digest()
+
+
+def calculate_tree_hash(body):
+ """Calculate a tree hash checksum.
+
+ For more information see:
+
+ http://docs.aws.amazon.com/amazonglacier/latest/dev/checksum-calculations.html
+
+ :param body: Any file like object. This has the same constraints as
+ the ``body`` param in calculate_sha256
+
+ :rtype: str
+ :returns: The hex version of the calculated tree hash
+
+ """
+ chunks = []
+ required_chunk_size = 1024 * 1024
+ sha256 = hashlib.sha256
+ for chunk in iter(lambda: body.read(required_chunk_size), b''):
+ chunks.append(sha256(chunk).digest())
+ if not chunks:
+ return sha256(b'').hexdigest()
+ while len(chunks) > 1:
+ new_chunks = []
+ for first, second in _in_pairs(chunks):
+ if second is not None:
+ new_chunks.append(sha256(first + second).digest())
+ else:
+ # We're at the end of the list and there's no pair left.
+ new_chunks.append(first)
+ chunks = new_chunks
+ return binascii.hexlify(chunks[0]).decode('ascii')
+
+
+def _in_pairs(iterable):
+ # Creates iterator that iterates over the list in pairs:
+ # for a, b in _in_pairs([0, 1, 2, 3, 4]):
+ # print(a, b)
+ #
+ # will print:
+ # 0, 1
+ # 2, 3
+ # 4, None
+ shared_iter = iter(iterable)
+ # Note that zip_longest is a compat import that uses
+ # the itertools izip_longest. This creates an iterator,
+ # this call below does _not_ immediately create the list
+ # of pairs.
+ return zip_longest(shared_iter, shared_iter)
+
+
+class CachedProperty:
+ """A read only property that caches the initially computed value.
+
+ This descriptor will only call the provided ``fget`` function once.
+ Subsequent access to this property will return the cached value.
+
+ """
+
+ def __init__(self, fget):
+ self._fget = fget
+
+ def __get__(self, obj, cls):
+ if obj is None:
+ return self
+ else:
+ computed_value = self._fget(obj)
+ obj.__dict__[self._fget.__name__] = computed_value
+ return computed_value
+
+
+class ArgumentGenerator:
+ """Generate sample input based on a shape model.
+
+ This class contains a ``generate_skeleton`` method that will take
+ an input/output shape (created from ``botocore.model``) and generate
+ a sample dictionary corresponding to the input/output shape.
+
+ The specific values used are place holder values. For strings either an
+ empty string or the member name can be used, for numbers 0 or 0.0 is used.
+ The intended usage of this class is to generate the *shape* of the input
+ structure.
+
+ This can be useful for operations that have complex input shapes.
+ This allows a user to just fill in the necessary data instead of
+ worrying about the specific structure of the input arguments.
+
+ Example usage::
+
+ s = botocore.session.get_session()
+ ddb = s.get_service_model('dynamodb')
+ arg_gen = ArgumentGenerator()
+ sample_input = arg_gen.generate_skeleton(
+ ddb.operation_model('CreateTable').input_shape)
+ print("Sample input for dynamodb.CreateTable: %s" % sample_input)
+
+ """
+
+ def __init__(self, use_member_names=False):
+ self._use_member_names = use_member_names
+
+ def generate_skeleton(self, shape):
+ """Generate a sample input.
+
+ :type shape: ``botocore.model.Shape``
+ :param shape: The input shape.
+
+ :return: The generated skeleton input corresponding to the
+ provided input shape.
+
+ """
+ stack = []
+ return self._generate_skeleton(shape, stack)
+
+ def _generate_skeleton(self, shape, stack, name=''):
+ stack.append(shape.name)
+ try:
+ if shape.type_name == 'structure':
+ return self._generate_type_structure(shape, stack)
+ elif shape.type_name == 'list':
+ return self._generate_type_list(shape, stack)
+ elif shape.type_name == 'map':
+ return self._generate_type_map(shape, stack)
+ elif shape.type_name == 'string':
+ if self._use_member_names:
+ return name
+ if shape.enum:
+ return random.choice(shape.enum)
+ return ''
+ elif shape.type_name in ['integer', 'long']:
+ return 0
+ elif shape.type_name in ['float', 'double']:
+ return 0.0
+ elif shape.type_name == 'boolean':
+ return True
+ elif shape.type_name == 'timestamp':
+ return datetime.datetime(1970, 1, 1, 0, 0, 0)
+ finally:
+ stack.pop()
+
+ def _generate_type_structure(self, shape, stack):
+ if stack.count(shape.name) > 1:
+ return {}
+ skeleton = OrderedDict()
+ for member_name, member_shape in shape.members.items():
+ skeleton[member_name] = self._generate_skeleton(
+ member_shape, stack, name=member_name
+ )
+ return skeleton
+
+ def _generate_type_list(self, shape, stack):
+ # For list elements we've arbitrarily decided to
+ # return two elements for the skeleton list.
+ name = ''
+ if self._use_member_names:
+ name = shape.member.name
+ return [
+ self._generate_skeleton(shape.member, stack, name),
+ ]
+
+ def _generate_type_map(self, shape, stack):
+ key_shape = shape.key
+ value_shape = shape.value
+ assert key_shape.type_name == 'string'
+ return OrderedDict(
+ [
+ ('KeyName', self._generate_skeleton(value_shape, stack)),
+ ]
+ )
+
+
+def is_valid_ipv6_endpoint_url(endpoint_url):
+ if UNSAFE_URL_CHARS.intersection(endpoint_url):
+ return False
+ hostname = f'[{urlparse(endpoint_url).hostname}]'
+ return IPV6_ADDRZ_RE.match(hostname) is not None
+
+
+def is_valid_ipv4_endpoint_url(endpoint_url):
+ hostname = urlparse(endpoint_url).hostname
+ return IPV4_RE.match(hostname) is not None
+
+
+def is_valid_endpoint_url(endpoint_url):
+ """Verify the endpoint_url is valid.
+
+ :type endpoint_url: string
+ :param endpoint_url: An endpoint_url. Must have at least a scheme
+ and a hostname.
+
+ :return: True if the endpoint url is valid. False otherwise.
+
+ """
+ # post-bpo-43882 urlsplit() strips unsafe characters from URL, causing
+ # it to pass hostname validation below. Detect them early to fix that.
+ if UNSAFE_URL_CHARS.intersection(endpoint_url):
+ return False
+ parts = urlsplit(endpoint_url)
+ hostname = parts.hostname
+ if hostname is None:
+ return False
+ if len(hostname) > 255:
+ return False
+ if hostname[-1] == ".":
+ hostname = hostname[:-1]
+ allowed = re.compile(
+ r"^((?!-)[A-Z\d-]{1,63}(?<!-)\.)*((?!-)[A-Z\d-]{1,63}(?<!-))$",
+ re.IGNORECASE,
+ )
+ return allowed.match(hostname)
+
+
+def is_valid_uri(endpoint_url):
+ return is_valid_endpoint_url(endpoint_url) or is_valid_ipv6_endpoint_url(
+ endpoint_url
+ )
+
+
+def validate_region_name(region_name):
+ """Provided region_name must be a valid host label."""
+ if region_name is None:
+ return
+ valid_host_label = re.compile(r'^(?![0-9]+$)(?!-)[a-zA-Z0-9-]{,63}(?<!-)$')
+ valid = valid_host_label.match(region_name)
+ if not valid:
+ raise InvalidRegionError(region_name=region_name)
+
+
+def check_dns_name(bucket_name):
+ """
+ Check to see if the ``bucket_name`` complies with the
+ restricted DNS naming conventions necessary to allow
+ access via virtual-hosting style.
+
+ Even though "." characters are perfectly valid in this DNS
+ naming scheme, we are going to punt on any name containing a
+ "." character because these will cause SSL cert validation
+ problems if we try to use virtual-hosting style addressing.
+ """
+ if '.' in bucket_name:
+ return False
+ n = len(bucket_name)
+ if n < 3 or n > 63:
+ # Wrong length
+ return False
+ match = LABEL_RE.match(bucket_name)
+ if match is None or match.end() != len(bucket_name):
+ return False
+ return True
+
+
+def fix_s3_host(
+ request,
+ signature_version,
+ region_name,
+ default_endpoint_url=None,
+ **kwargs,
+):
+ """
+ This handler looks at S3 requests just before they are signed.
+ If there is a bucket name on the path (true for everything except
+ ListAllBuckets) it checks to see if that bucket name conforms to
+ the DNS naming conventions. If it does, it alters the request to
+ use ``virtual hosting`` style addressing rather than ``path-style``
+ addressing.
+
+ """
+ if request.context.get('use_global_endpoint', False):
+ default_endpoint_url = 's3.amazonaws.com'
+ try:
+ switch_to_virtual_host_style(
+ request, signature_version, default_endpoint_url
+ )
+ except InvalidDNSNameError as e:
+ bucket_name = e.kwargs['bucket_name']
+ logger.debug(
+ 'Not changing URI, bucket is not DNS compatible: %s', bucket_name
+ )
+
+
+def switch_to_virtual_host_style(
+ request, signature_version, default_endpoint_url=None, **kwargs
+):
+ """
+ This is a handler to force virtual host style s3 addressing no matter
+ the signature version (which is taken in consideration for the default
+ case). If the bucket is not DNS compatible an InvalidDNSName is thrown.
+
+ :param request: A AWSRequest object that is about to be sent.
+ :param signature_version: The signature version to sign with
+ :param default_endpoint_url: The endpoint to use when switching to a
+ virtual style. If None is supplied, the virtual host will be
+ constructed from the url of the request.
+ """
+ if request.auth_path is not None:
+ # The auth_path has already been applied (this may be a
+ # retried request). We don't need to perform this
+ # customization again.
+ return
+ elif _is_get_bucket_location_request(request):
+ # For the GetBucketLocation response, we should not be using
+ # the virtual host style addressing so we can avoid any sigv4
+ # issues.
+ logger.debug(
+ "Request is GetBucketLocation operation, not checking "
+ "for DNS compatibility."
+ )
+ return
+ parts = urlsplit(request.url)
+ request.auth_path = parts.path
+ path_parts = parts.path.split('/')
+
+ # Retrieve what the endpoint we will be prepending the bucket name to.
+ if default_endpoint_url is None:
+ default_endpoint_url = parts.netloc
+
+ if len(path_parts) > 1:
+ bucket_name = path_parts[1]
+ if not bucket_name:
+ # If the bucket name is empty we should not be checking for
+ # dns compatibility.
+ return
+ logger.debug('Checking for DNS compatible bucket for: %s', request.url)
+ if check_dns_name(bucket_name):
+ # If the operation is on a bucket, the auth_path must be
+ # terminated with a '/' character.
+ if len(path_parts) == 2:
+ if request.auth_path[-1] != '/':
+ request.auth_path += '/'
+ path_parts.remove(bucket_name)
+ # At the very least the path must be a '/', such as with the
+ # CreateBucket operation when DNS style is being used. If this
+ # is not used you will get an empty path which is incorrect.
+ path = '/'.join(path_parts) or '/'
+ global_endpoint = default_endpoint_url
+ host = bucket_name + '.' + global_endpoint
+ new_tuple = (parts.scheme, host, path, parts.query, '')
+ new_uri = urlunsplit(new_tuple)
+ request.url = new_uri
+ logger.debug('URI updated to: %s', new_uri)
+ else:
+ raise InvalidDNSNameError(bucket_name=bucket_name)
+
+
+def _is_get_bucket_location_request(request):
+ return request.url.endswith('?location')
+
+
+def instance_cache(func):
+ """Method decorator for caching method calls to a single instance.
+
+ **This is not a general purpose caching decorator.**
+
+ In order to use this, you *must* provide an ``_instance_cache``
+ attribute on the instance.
+
+ This decorator is used to cache method calls. The cache is only
+ scoped to a single instance though such that multiple instances
+ will maintain their own cache. In order to keep things simple,
+ this decorator requires that you provide an ``_instance_cache``
+ attribute on your instance.
+
+ """
+ func_name = func.__name__
+
+ @functools.wraps(func)
+ def _cache_guard(self, *args, **kwargs):
+ cache_key = (func_name, args)
+ if kwargs:
+ kwarg_items = tuple(sorted(kwargs.items()))
+ cache_key = (func_name, args, kwarg_items)
+ result = self._instance_cache.get(cache_key)
+ if result is not None:
+ return result
+ result = func(self, *args, **kwargs)
+ self._instance_cache[cache_key] = result
+ return result
+
+ return _cache_guard
+
+
+def lru_cache_weakref(*cache_args, **cache_kwargs):
+ """
+ Version of functools.lru_cache that stores a weak reference to ``self``.
+
+ Serves the same purpose as :py:func:`instance_cache` but uses Python's
+ functools implementation which offers ``max_size`` and ``typed`` properties.
+
+ lru_cache is a global cache even when used on a method. The cache's
+ reference to ``self`` will prevent garbage collection of the object. This
+ wrapper around functools.lru_cache replaces the reference to ``self`` with
+ a weak reference to not interfere with garbage collection.
+ """
+
+ def wrapper(func):
+ @functools.lru_cache(*cache_args, **cache_kwargs)
+ def func_with_weakref(weakref_to_self, *args, **kwargs):
+ return func(weakref_to_self(), *args, **kwargs)
+
+ @functools.wraps(func)
+ def inner(self, *args, **kwargs):
+ for kwarg_key, kwarg_value in kwargs.items():
+ if isinstance(kwarg_value, list):
+ kwargs[kwarg_key] = tuple(kwarg_value)
+ return func_with_weakref(weakref.ref(self), *args, **kwargs)
+
+ inner.cache_info = func_with_weakref.cache_info
+ return inner
+
+ return wrapper
+
+
+def switch_host_s3_accelerate(request, operation_name, **kwargs):
+ """Switches the current s3 endpoint with an S3 Accelerate endpoint"""
+
+ # Note that when registered the switching of the s3 host happens
+ # before it gets changed to virtual. So we are not concerned with ensuring
+ # that the bucket name is translated to the virtual style here and we
+ # can hard code the Accelerate endpoint.
+ parts = urlsplit(request.url).netloc.split('.')
+ parts = [p for p in parts if p in S3_ACCELERATE_WHITELIST]
+ endpoint = 'https://s3-accelerate.'
+ if len(parts) > 0:
+ endpoint += '.'.join(parts) + '.'
+ endpoint += 'amazonaws.com'
+
+ if operation_name in ['ListBuckets', 'CreateBucket', 'DeleteBucket']:
+ return
+ _switch_hosts(request, endpoint, use_new_scheme=False)
+
+
+def switch_host_with_param(request, param_name):
+ """Switches the host using a parameter value from a JSON request body"""
+ request_json = json.loads(request.data.decode('utf-8'))
+ if request_json.get(param_name):
+ new_endpoint = request_json[param_name]
+ _switch_hosts(request, new_endpoint)
+
+
+def _switch_hosts(request, new_endpoint, use_new_scheme=True):
+ final_endpoint = _get_new_endpoint(
+ request.url, new_endpoint, use_new_scheme
+ )
+ request.url = final_endpoint
+
+
+def _get_new_endpoint(original_endpoint, new_endpoint, use_new_scheme=True):
+ new_endpoint_components = urlsplit(new_endpoint)
+ original_endpoint_components = urlsplit(original_endpoint)
+ scheme = original_endpoint_components.scheme
+ if use_new_scheme:
+ scheme = new_endpoint_components.scheme
+ final_endpoint_components = (
+ scheme,
+ new_endpoint_components.netloc,
+ original_endpoint_components.path,
+ original_endpoint_components.query,
+ '',
+ )
+ final_endpoint = urlunsplit(final_endpoint_components)
+ logger.debug(f'Updating URI from {original_endpoint} to {final_endpoint}')
+ return final_endpoint
+
+
+def deep_merge(base, extra):
+ """Deeply two dictionaries, overriding existing keys in the base.
+
+ :param base: The base dictionary which will be merged into.
+ :param extra: The dictionary to merge into the base. Keys from this
+ dictionary will take precedence.
+ """
+ for key in extra:
+ # If the key represents a dict on both given dicts, merge the sub-dicts
+ if (
+ key in base
+ and isinstance(base[key], dict)
+ and isinstance(extra[key], dict)
+ ):
+ deep_merge(base[key], extra[key])
+ continue
+
+ # Otherwise, set the key on the base to be the value of the extra.
+ base[key] = extra[key]
+
+
+def hyphenize_service_id(service_id):
+ """Translate the form used for event emitters.
+
+ :param service_id: The service_id to convert.
+ """
+ return service_id.replace(' ', '-').lower()
+
+
+class IdentityCache:
+ """Base IdentityCache implementation for storing and retrieving
+ highly accessed credentials.
+
+ This class is not intended to be instantiated in user code.
+ """
+
+ METHOD = "base_identity_cache"
+
+ def __init__(self, client, credential_cls):
+ self._client = client
+ self._credential_cls = credential_cls
+
+ def get_credentials(self, **kwargs):
+ callback = self.build_refresh_callback(**kwargs)
+ metadata = callback()
+ credential_entry = self._credential_cls.create_from_metadata(
+ metadata=metadata,
+ refresh_using=callback,
+ method=self.METHOD,
+ advisory_timeout=45,
+ mandatory_timeout=10,
+ )
+ return credential_entry
+
+ def build_refresh_callback(**kwargs):
+ """Callback to be implemented by subclasses.
+
+ Returns a set of metadata to be converted into a new
+ credential instance.
+ """
+ raise NotImplementedError()
+
+
+class S3ExpressIdentityCache(IdentityCache):
+ """S3Express IdentityCache for retrieving and storing
+ credentials from CreateSession calls.
+
+ This class is not intended to be instantiated in user code.
+ """
+
+ METHOD = "s3express"
+
+ def __init__(self, client, credential_cls):
+ self._client = client
+ self._credential_cls = credential_cls
+
+ @functools.lru_cache(maxsize=100)
+ def get_credentials(self, bucket):
+ return super().get_credentials(bucket=bucket)
+
+ def build_refresh_callback(self, bucket):
+ def refresher():
+ response = self._client.create_session(Bucket=bucket)
+ creds = response['Credentials']
+ expiration = self._serialize_if_needed(
+ creds['Expiration'], iso=True
+ )
+ return {
+ "access_key": creds['AccessKeyId'],
+ "secret_key": creds['SecretAccessKey'],
+ "token": creds['SessionToken'],
+ "expiry_time": expiration,
+ }
+
+ return refresher
+
+ def _serialize_if_needed(self, value, iso=False):
+ if isinstance(value, _DatetimeClass):
+ if iso:
+ return value.isoformat()
+ return value.strftime('%Y-%m-%dT%H:%M:%S%Z')
+ return value
+
+
+class S3ExpressIdentityResolver:
+ def __init__(self, client, credential_cls, cache=None):
+ self._client = weakref.proxy(client)
+
+ if cache is None:
+ cache = S3ExpressIdentityCache(self._client, credential_cls)
+ self._cache = cache
+
+ def register(self, event_emitter=None):
+ logger.debug('Registering S3Express Identity Resolver')
+ emitter = event_emitter or self._client.meta.events
+ emitter.register('before-call.s3', self.apply_signing_cache_key)
+ emitter.register('before-sign.s3', self.resolve_s3express_identity)
+
+ def apply_signing_cache_key(self, params, context, **kwargs):
+ endpoint_properties = context.get('endpoint_properties', {})
+ backend = endpoint_properties.get('backend', None)
+
+ # Add cache key if Bucket supplied for s3express request
+ bucket_name = context.get('input_params', {}).get('Bucket')
+ if backend == 'S3Express' and bucket_name is not None:
+ context.setdefault('signing', {})
+ context['signing']['cache_key'] = bucket_name
+
+ def resolve_s3express_identity(
+ self,
+ request,
+ signing_name,
+ region_name,
+ signature_version,
+ request_signer,
+ operation_name,
+ **kwargs,
+ ):
+ signing_context = request.context.get('signing', {})
+ signing_name = signing_context.get('signing_name')
+ if signing_name == 's3express' and signature_version.startswith(
+ 'v4-s3express'
+ ):
+ signing_context['identity_cache'] = self._cache
+ if 'cache_key' not in signing_context:
+ signing_context['cache_key'] = (
+ request.context.get('s3_redirect', {})
+ .get('params', {})
+ .get('Bucket')
+ )
+
+
+class S3RegionRedirectorv2:
+ """Updated version of S3RegionRedirector for use when
+ EndpointRulesetResolver is in use for endpoint resolution.
+
+ This class is considered private and subject to abrupt breaking changes or
+ removal without prior announcement. Please do not use it directly.
+ """
+
+ def __init__(self, endpoint_bridge, client, cache=None):
+ self._cache = cache or {}
+ self._client = weakref.proxy(client)
+
+ def register(self, event_emitter=None):
+ logger.debug('Registering S3 region redirector handler')
+ emitter = event_emitter or self._client.meta.events
+ emitter.register('needs-retry.s3', self.redirect_from_error)
+ emitter.register(
+ 'before-parameter-build.s3', self.annotate_request_context
+ )
+ emitter.register(
+ 'before-endpoint-resolution.s3', self.redirect_from_cache
+ )
+
+ def redirect_from_error(self, request_dict, response, operation, **kwargs):
+ """
+ An S3 request sent to the wrong region will return an error that
+ contains the endpoint the request should be sent to. This handler
+ will add the redirect information to the signing context and then
+ redirect the request.
+ """
+ if response is None:
+ # This could be none if there was a ConnectionError or other
+ # transport error.
+ return
+
+ redirect_ctx = request_dict.get('context', {}).get('s3_redirect', {})
+ if ArnParser.is_arn(redirect_ctx.get('bucket')):
+ logger.debug(
+ 'S3 request was previously for an Accesspoint ARN, not '
+ 'redirecting.'
+ )
+ return
+
+ if redirect_ctx.get('redirected'):
+ logger.debug(
+ 'S3 request was previously redirected, not redirecting.'
+ )
+ return
+
+ error = response[1].get('Error', {})
+ error_code = error.get('Code')
+ response_metadata = response[1].get('ResponseMetadata', {})
+
+ # We have to account for 400 responses because
+ # if we sign a Head* request with the wrong region,
+ # we'll get a 400 Bad Request but we won't get a
+ # body saying it's an "AuthorizationHeaderMalformed".
+ is_special_head_object = (
+ error_code in ('301', '400') and operation.name == 'HeadObject'
+ )
+ is_special_head_bucket = (
+ error_code in ('301', '400')
+ and operation.name == 'HeadBucket'
+ and 'x-amz-bucket-region'
+ in response_metadata.get('HTTPHeaders', {})
+ )
+ is_wrong_signing_region = (
+ error_code == 'AuthorizationHeaderMalformed' and 'Region' in error
+ )
+ is_redirect_status = response[0] is not None and response[
+ 0
+ ].status_code in (301, 302, 307)
+ is_permanent_redirect = error_code == 'PermanentRedirect'
+ is_opt_in_region_redirect = (
+ error_code == 'IllegalLocationConstraintException'
+ and operation.name != 'CreateBucket'
+ )
+ if not any(
+ [
+ is_special_head_object,
+ is_wrong_signing_region,
+ is_permanent_redirect,
+ is_special_head_bucket,
+ is_redirect_status,
+ is_opt_in_region_redirect,
+ ]
+ ):
+ return
+
+ bucket = request_dict['context']['s3_redirect']['bucket']
+ client_region = request_dict['context'].get('client_region')
+ new_region = self.get_bucket_region(bucket, response)
+
+ if new_region is None:
+ logger.debug(
+ f"S3 client configured for region {client_region} but the "
+ f"bucket {bucket} is not in that region and the proper region "
+ "could not be automatically determined."
+ )
+ return
+
+ logger.debug(
+ f"S3 client configured for region {client_region} but the bucket {bucket} "
+ f"is in region {new_region}; Please configure the proper region to "
+ f"avoid multiple unnecessary redirects and signing attempts."
+ )
+ # Adding the new region to _cache will make construct_endpoint() to
+ # use the new region as value for the AWS::Region builtin parameter.
+ self._cache[bucket] = new_region
+
+ # Re-resolve endpoint with new region and modify request_dict with
+ # the new URL, auth scheme, and signing context.
+ ep_resolver = self._client._ruleset_resolver
+ ep_info = ep_resolver.construct_endpoint(
+ operation_model=operation,
+ call_args=request_dict['context']['s3_redirect']['params'],
+ request_context=request_dict['context'],
+ )
+ request_dict['url'] = self.set_request_url(
+ request_dict['url'], ep_info.url
+ )
+ request_dict['context']['s3_redirect']['redirected'] = True
+ auth_schemes = ep_info.properties.get('authSchemes')
+ if auth_schemes is not None:
+ auth_info = ep_resolver.auth_schemes_to_signing_ctx(auth_schemes)
+ auth_type, signing_context = auth_info
+ request_dict['context']['auth_type'] = auth_type
+ request_dict['context']['signing'] = {
+ **request_dict['context'].get('signing', {}),
+ **signing_context,
+ }
+
+ # Return 0 so it doesn't wait to retry
+ return 0
+
+ def get_bucket_region(self, bucket, response):
+ """
+ There are multiple potential sources for the new region to redirect to,
+ but they aren't all universally available for use. This will try to
+ find region from response elements, but will fall back to calling
+ HEAD on the bucket if all else fails.
+
+ :param bucket: The bucket to find the region for. This is necessary if
+ the region is not available in the error response.
+ :param response: A response representing a service request that failed
+ due to incorrect region configuration.
+ """
+ # First try to source the region from the headers.
+ service_response = response[1]
+ response_headers = service_response['ResponseMetadata']['HTTPHeaders']
+ if 'x-amz-bucket-region' in response_headers:
+ return response_headers['x-amz-bucket-region']
+
+ # Next, check the error body
+ region = service_response.get('Error', {}).get('Region', None)
+ if region is not None:
+ return region
+
+ # Finally, HEAD the bucket. No other choice sadly.
+ try:
+ response = self._client.head_bucket(Bucket=bucket)
+ headers = response['ResponseMetadata']['HTTPHeaders']
+ except ClientError as e:
+ headers = e.response['ResponseMetadata']['HTTPHeaders']
+
+ region = headers.get('x-amz-bucket-region', None)
+ return region
+
+ def set_request_url(self, old_url, new_endpoint, **kwargs):
+ """
+ Splice a new endpoint into an existing URL. Note that some endpoints
+ from the the endpoint provider have a path component which will be
+ discarded by this function.
+ """
+ return _get_new_endpoint(old_url, new_endpoint, False)
+
+ def redirect_from_cache(self, builtins, params, **kwargs):
+ """
+ If a bucket name has been redirected before, it is in the cache. This
+ handler will update the AWS::Region endpoint resolver builtin param
+ to use the region from cache instead of the client region to avoid the
+ redirect.
+ """
+ bucket = params.get('Bucket')
+ if bucket is not None and bucket in self._cache:
+ new_region = self._cache.get(bucket)
+ builtins['AWS::Region'] = new_region
+
+ def annotate_request_context(self, params, context, **kwargs):
+ """Store the bucket name in context for later use when redirecting.
+ The bucket name may be an access point ARN or alias.
+ """
+ bucket = params.get('Bucket')
+ context['s3_redirect'] = {
+ 'redirected': False,
+ 'bucket': bucket,
+ 'params': params,
+ }
+
+
+class S3RegionRedirector:
+ """This handler has been replaced by S3RegionRedirectorv2. The original
+ version remains in place for any third-party libraries that import it.
+ """
+
+ def __init__(self, endpoint_bridge, client, cache=None):
+ self._endpoint_resolver = endpoint_bridge
+ self._cache = cache
+ if self._cache is None:
+ self._cache = {}
+
+ # This needs to be a weak ref in order to prevent memory leaks on
+ # python 2.6
+ self._client = weakref.proxy(client)
+
+ warnings.warn(
+ 'The S3RegionRedirector class has been deprecated for a new '
+ 'internal replacement. A future version of botocore may remove '
+ 'this class.',
+ category=FutureWarning,
+ )
+
+ def register(self, event_emitter=None):
+ emitter = event_emitter or self._client.meta.events
+ emitter.register('needs-retry.s3', self.redirect_from_error)
+ emitter.register('before-call.s3', self.set_request_url)
+ emitter.register('before-parameter-build.s3', self.redirect_from_cache)
+
+ def redirect_from_error(self, request_dict, response, operation, **kwargs):
+ """
+ An S3 request sent to the wrong region will return an error that
+ contains the endpoint the request should be sent to. This handler
+ will add the redirect information to the signing context and then
+ redirect the request.
+ """
+ if response is None:
+ # This could be none if there was a ConnectionError or other
+ # transport error.
+ return
+
+ if self._is_s3_accesspoint(request_dict.get('context', {})):
+ logger.debug(
+ 'S3 request was previously to an accesspoint, not redirecting.'
+ )
+ return
+
+ if request_dict.get('context', {}).get('s3_redirected'):
+ logger.debug(
+ 'S3 request was previously redirected, not redirecting.'
+ )
+ return
+
+ error = response[1].get('Error', {})
+ error_code = error.get('Code')
+ response_metadata = response[1].get('ResponseMetadata', {})
+
+ # We have to account for 400 responses because
+ # if we sign a Head* request with the wrong region,
+ # we'll get a 400 Bad Request but we won't get a
+ # body saying it's an "AuthorizationHeaderMalformed".
+ is_special_head_object = (
+ error_code in ('301', '400') and operation.name == 'HeadObject'
+ )
+ is_special_head_bucket = (
+ error_code in ('301', '400')
+ and operation.name == 'HeadBucket'
+ and 'x-amz-bucket-region'
+ in response_metadata.get('HTTPHeaders', {})
+ )
+ is_wrong_signing_region = (
+ error_code == 'AuthorizationHeaderMalformed' and 'Region' in error
+ )
+ is_redirect_status = response[0] is not None and response[
+ 0
+ ].status_code in (301, 302, 307)
+ is_permanent_redirect = error_code == 'PermanentRedirect'
+ if not any(
+ [
+ is_special_head_object,
+ is_wrong_signing_region,
+ is_permanent_redirect,
+ is_special_head_bucket,
+ is_redirect_status,
+ ]
+ ):
+ return
+
+ bucket = request_dict['context']['signing']['bucket']
+ client_region = request_dict['context'].get('client_region')
+ new_region = self.get_bucket_region(bucket, response)
+
+ if new_region is None:
+ logger.debug(
+ f"S3 client configured for region {client_region} but the bucket {bucket} is not "
+ "in that region and the proper region could not be "
+ "automatically determined."
+ )
+ return
+
+ logger.debug(
+ f"S3 client configured for region {client_region} but the bucket {bucket} is in region"
+ f" {new_region}; Please configure the proper region to avoid multiple "
+ "unnecessary redirects and signing attempts."
+ )
+ endpoint = self._endpoint_resolver.resolve('s3', new_region)
+ endpoint = endpoint['endpoint_url']
+
+ signing_context = {
+ 'region': new_region,
+ 'bucket': bucket,
+ 'endpoint': endpoint,
+ }
+ request_dict['context']['signing'] = signing_context
+
+ self._cache[bucket] = signing_context
+ self.set_request_url(request_dict, request_dict['context'])
+
+ request_dict['context']['s3_redirected'] = True
+
+ # Return 0 so it doesn't wait to retry
+ return 0
+
+ def get_bucket_region(self, bucket, response):
+ """
+ There are multiple potential sources for the new region to redirect to,
+ but they aren't all universally available for use. This will try to
+ find region from response elements, but will fall back to calling
+ HEAD on the bucket if all else fails.
+
+ :param bucket: The bucket to find the region for. This is necessary if
+ the region is not available in the error response.
+ :param response: A response representing a service request that failed
+ due to incorrect region configuration.
+ """
+ # First try to source the region from the headers.
+ service_response = response[1]
+ response_headers = service_response['ResponseMetadata']['HTTPHeaders']
+ if 'x-amz-bucket-region' in response_headers:
+ return response_headers['x-amz-bucket-region']
+
+ # Next, check the error body
+ region = service_response.get('Error', {}).get('Region', None)
+ if region is not None:
+ return region
+
+ # Finally, HEAD the bucket. No other choice sadly.
+ try:
+ response = self._client.head_bucket(Bucket=bucket)
+ headers = response['ResponseMetadata']['HTTPHeaders']
+ except ClientError as e:
+ headers = e.response['ResponseMetadata']['HTTPHeaders']
+
+ region = headers.get('x-amz-bucket-region', None)
+ return region
+
+ def set_request_url(self, params, context, **kwargs):
+ endpoint = context.get('signing', {}).get('endpoint', None)
+ if endpoint is not None:
+ params['url'] = _get_new_endpoint(params['url'], endpoint, False)
+
+ def redirect_from_cache(self, params, context, **kwargs):
+ """
+ This handler retrieves a given bucket's signing context from the cache
+ and adds it into the request context.
+ """
+ if self._is_s3_accesspoint(context):
+ return
+ bucket = params.get('Bucket')
+ signing_context = self._cache.get(bucket)
+ if signing_context is not None:
+ context['signing'] = signing_context
+ else:
+ context['signing'] = {'bucket': bucket}
+
+ def _is_s3_accesspoint(self, context):
+ return 's3_accesspoint' in context
+
+
+class InvalidArnException(ValueError):
+ pass
+
+
+class ArnParser:
+ def parse_arn(self, arn):
+ arn_parts = arn.split(':', 5)
+ if len(arn_parts) < 6:
+ raise InvalidArnException(
+ f'Provided ARN: {arn} must be of the format: '
+ 'arn:partition:service:region:account:resource'
+ )
+ return {
+ 'partition': arn_parts[1],
+ 'service': arn_parts[2],
+ 'region': arn_parts[3],
+ 'account': arn_parts[4],
+ 'resource': arn_parts[5],
+ }
+
+ @staticmethod
+ def is_arn(value):
+ if not isinstance(value, str) or not value.startswith('arn:'):
+ return False
+ arn_parser = ArnParser()
+ try:
+ arn_parser.parse_arn(value)
+ return True
+ except InvalidArnException:
+ return False
+
+
+class S3ArnParamHandler:
+ _RESOURCE_REGEX = re.compile(
+ r'^(?P<resource_type>accesspoint|outpost)[/:](?P<resource_name>.+)$'
+ )
+ _OUTPOST_RESOURCE_REGEX = re.compile(
+ r'^(?P<outpost_name>[a-zA-Z0-9\-]{1,63})[/:]accesspoint[/:]'
+ r'(?P<accesspoint_name>[a-zA-Z0-9\-]{1,63}$)'
+ )
+ _BLACKLISTED_OPERATIONS = ['CreateBucket']
+
+ def __init__(self, arn_parser=None):
+ self._arn_parser = arn_parser
+ if arn_parser is None:
+ self._arn_parser = ArnParser()
+
+ def register(self, event_emitter):
+ event_emitter.register('before-parameter-build.s3', self.handle_arn)
+
+ def handle_arn(self, params, model, context, **kwargs):
+ if model.name in self._BLACKLISTED_OPERATIONS:
+ return
+ arn_details = self._get_arn_details_from_bucket_param(params)
+ if arn_details is None:
+ return
+ if arn_details['resource_type'] == 'accesspoint':
+ self._store_accesspoint(params, context, arn_details)
+ elif arn_details['resource_type'] == 'outpost':
+ self._store_outpost(params, context, arn_details)
+
+ def _get_arn_details_from_bucket_param(self, params):
+ if 'Bucket' in params:
+ try:
+ arn = params['Bucket']
+ arn_details = self._arn_parser.parse_arn(arn)
+ self._add_resource_type_and_name(arn, arn_details)
+ return arn_details
+ except InvalidArnException:
+ pass
+ return None
+
+ def _add_resource_type_and_name(self, arn, arn_details):
+ match = self._RESOURCE_REGEX.match(arn_details['resource'])
+ if match:
+ arn_details['resource_type'] = match.group('resource_type')
+ arn_details['resource_name'] = match.group('resource_name')
+ else:
+ raise UnsupportedS3ArnError(arn=arn)
+
+ def _store_accesspoint(self, params, context, arn_details):
+ # Ideally the access-point would be stored as a parameter in the
+ # request where the serializer would then know how to serialize it,
+ # but access-points are not modeled in S3 operations so it would fail
+ # validation. Instead, we set the access-point to the bucket parameter
+ # to have some value set when serializing the request and additional
+ # information on the context from the arn to use in forming the
+ # access-point endpoint.
+ params['Bucket'] = arn_details['resource_name']
+ context['s3_accesspoint'] = {
+ 'name': arn_details['resource_name'],
+ 'account': arn_details['account'],
+ 'partition': arn_details['partition'],
+ 'region': arn_details['region'],
+ 'service': arn_details['service'],
+ }
+
+ def _store_outpost(self, params, context, arn_details):
+ resource_name = arn_details['resource_name']
+ match = self._OUTPOST_RESOURCE_REGEX.match(resource_name)
+ if not match:
+ raise UnsupportedOutpostResourceError(resource_name=resource_name)
+ # Because we need to set the bucket name to something to pass
+ # validation we're going to use the access point name to be consistent
+ # with normal access point arns.
+ accesspoint_name = match.group('accesspoint_name')
+ params['Bucket'] = accesspoint_name
+ context['s3_accesspoint'] = {
+ 'outpost_name': match.group('outpost_name'),
+ 'name': accesspoint_name,
+ 'account': arn_details['account'],
+ 'partition': arn_details['partition'],
+ 'region': arn_details['region'],
+ 'service': arn_details['service'],
+ }
+
+
+class S3EndpointSetter:
+ _DEFAULT_PARTITION = 'aws'
+ _DEFAULT_DNS_SUFFIX = 'amazonaws.com'
+
+ def __init__(
+ self,
+ endpoint_resolver,
+ region=None,
+ s3_config=None,
+ endpoint_url=None,
+ partition=None,
+ use_fips_endpoint=False,
+ ):
+ # This is calling the endpoint_resolver in regions.py
+ self._endpoint_resolver = endpoint_resolver
+ self._region = region
+ self._s3_config = s3_config
+ self._use_fips_endpoint = use_fips_endpoint
+ if s3_config is None:
+ self._s3_config = {}
+ self._endpoint_url = endpoint_url
+ self._partition = partition
+ if partition is None:
+ self._partition = self._DEFAULT_PARTITION
+
+ def register(self, event_emitter):
+ event_emitter.register('before-sign.s3', self.set_endpoint)
+ event_emitter.register('choose-signer.s3', self.set_signer)
+ event_emitter.register(
+ 'before-call.s3.WriteGetObjectResponse',
+ self.update_endpoint_to_s3_object_lambda,
+ )
+
+ def update_endpoint_to_s3_object_lambda(self, params, context, **kwargs):
+ if self._use_accelerate_endpoint:
+ raise UnsupportedS3ConfigurationError(
+ msg='S3 client does not support accelerate endpoints for S3 Object Lambda operations',
+ )
+
+ self._override_signing_name(context, 's3-object-lambda')
+ if self._endpoint_url:
+ # Only update the url if an explicit url was not provided
+ return
+
+ resolver = self._endpoint_resolver
+ # Constructing endpoints as s3-object-lambda as region
+ resolved = resolver.construct_endpoint(
+ 's3-object-lambda', self._region
+ )
+
+ # Ideally we would be able to replace the endpoint before
+ # serialization but there's no event to do that currently
+ # host_prefix is all the arn/bucket specs
+ new_endpoint = 'https://{host_prefix}{hostname}'.format(
+ host_prefix=params['host_prefix'],
+ hostname=resolved['hostname'],
+ )
+
+ params['url'] = _get_new_endpoint(params['url'], new_endpoint, False)
+
+ def set_endpoint(self, request, **kwargs):
+ if self._use_accesspoint_endpoint(request):
+ self._validate_accesspoint_supported(request)
+ self._validate_fips_supported(request)
+ self._validate_global_regions(request)
+ region_name = self._resolve_region_for_accesspoint_endpoint(
+ request
+ )
+ self._resolve_signing_name_for_accesspoint_endpoint(request)
+ self._switch_to_accesspoint_endpoint(request, region_name)
+ return
+ if self._use_accelerate_endpoint:
+ if self._use_fips_endpoint:
+ raise UnsupportedS3ConfigurationError(
+ msg=(
+ 'Client is configured to use the FIPS psuedo region '
+ f'for "{self._region}", but S3 Accelerate does not have any FIPS '
+ 'compatible endpoints.'
+ )
+ )
+ switch_host_s3_accelerate(request=request, **kwargs)
+ if self._s3_addressing_handler:
+ self._s3_addressing_handler(request=request, **kwargs)
+
+ def _use_accesspoint_endpoint(self, request):
+ return 's3_accesspoint' in request.context
+
+ def _validate_fips_supported(self, request):
+ if not self._use_fips_endpoint:
+ return
+ if 'fips' in request.context['s3_accesspoint']['region']:
+ raise UnsupportedS3AccesspointConfigurationError(
+ msg={'Invalid ARN, FIPS region not allowed in ARN.'}
+ )
+ if 'outpost_name' in request.context['s3_accesspoint']:
+ raise UnsupportedS3AccesspointConfigurationError(
+ msg=(
+ f'Client is configured to use the FIPS psuedo-region "{self._region}", '
+ 'but outpost ARNs do not support FIPS endpoints.'
+ )
+ )
+ # Transforming psuedo region to actual region
+ accesspoint_region = request.context['s3_accesspoint']['region']
+ if accesspoint_region != self._region:
+ if not self._s3_config.get('use_arn_region', True):
+ # TODO: Update message to reflect use_arn_region
+ # is not set
+ raise UnsupportedS3AccesspointConfigurationError(
+ msg=(
+ 'Client is configured to use the FIPS psuedo-region '
+ f'for "{self._region}", but the access-point ARN provided is for '
+ f'the "{accesspoint_region}" region. For clients using a FIPS '
+ 'psuedo-region calls to access-point ARNs in another '
+ 'region are not allowed.'
+ )
+ )
+
+ def _validate_global_regions(self, request):
+ if self._s3_config.get('use_arn_region', True):
+ return
+ if self._region in ['aws-global', 's3-external-1']:
+ raise UnsupportedS3AccesspointConfigurationError(
+ msg=(
+ 'Client is configured to use the global psuedo-region '
+ f'"{self._region}". When providing access-point ARNs a regional '
+ 'endpoint must be specified.'
+ )
+ )
+
+ def _validate_accesspoint_supported(self, request):
+ if self._use_accelerate_endpoint:
+ raise UnsupportedS3AccesspointConfigurationError(
+ msg=(
+ 'Client does not support s3 accelerate configuration '
+ 'when an access-point ARN is specified.'
+ )
+ )
+ request_partition = request.context['s3_accesspoint']['partition']
+ if request_partition != self._partition:
+ raise UnsupportedS3AccesspointConfigurationError(
+ msg=(
+ f'Client is configured for "{self._partition}" partition, but access-point'
+ f' ARN provided is for "{request_partition}" partition. The client and '
+ ' access-point partition must be the same.'
+ )
+ )
+ s3_service = request.context['s3_accesspoint'].get('service')
+ if s3_service == 's3-object-lambda' and self._s3_config.get(
+ 'use_dualstack_endpoint'
+ ):
+ raise UnsupportedS3AccesspointConfigurationError(
+ msg=(
+ 'Client does not support s3 dualstack configuration '
+ 'when an S3 Object Lambda access point ARN is specified.'
+ )
+ )
+ outpost_name = request.context['s3_accesspoint'].get('outpost_name')
+ if outpost_name and self._s3_config.get('use_dualstack_endpoint'):
+ raise UnsupportedS3AccesspointConfigurationError(
+ msg=(
+ 'Client does not support s3 dualstack configuration '
+ 'when an outpost ARN is specified.'
+ )
+ )
+ self._validate_mrap_s3_config(request)
+
+ def _validate_mrap_s3_config(self, request):
+ if not is_global_accesspoint(request.context):
+ return
+ if self._s3_config.get('s3_disable_multiregion_access_points'):
+ raise UnsupportedS3AccesspointConfigurationError(
+ msg=(
+ 'Invalid configuration, Multi-Region Access Point '
+ 'ARNs are disabled.'
+ )
+ )
+ elif self._s3_config.get('use_dualstack_endpoint'):
+ raise UnsupportedS3AccesspointConfigurationError(
+ msg=(
+ 'Client does not support s3 dualstack configuration '
+ 'when a Multi-Region Access Point ARN is specified.'
+ )
+ )
+
+ def _resolve_region_for_accesspoint_endpoint(self, request):
+ if is_global_accesspoint(request.context):
+ # Requests going to MRAP endpoints MUST be set to any (*) region.
+ self._override_signing_region(request, '*')
+ elif self._s3_config.get('use_arn_region', True):
+ accesspoint_region = request.context['s3_accesspoint']['region']
+ # If we are using the region from the access point,
+ # we will also want to make sure that we set it as the
+ # signing region as well
+ self._override_signing_region(request, accesspoint_region)
+ return accesspoint_region
+ return self._region
+
+ def set_signer(self, context, **kwargs):
+ if is_global_accesspoint(context):
+ if HAS_CRT:
+ return 's3v4a'
+ else:
+ raise MissingDependencyException(
+ msg="Using S3 with an MRAP arn requires an additional "
+ "dependency. You will need to pip install "
+ "botocore[crt] before proceeding."
+ )
+
+ def _resolve_signing_name_for_accesspoint_endpoint(self, request):
+ accesspoint_service = request.context['s3_accesspoint']['service']
+ self._override_signing_name(request.context, accesspoint_service)
+
+ def _switch_to_accesspoint_endpoint(self, request, region_name):
+ original_components = urlsplit(request.url)
+ accesspoint_endpoint = urlunsplit(
+ (
+ original_components.scheme,
+ self._get_netloc(request.context, region_name),
+ self._get_accesspoint_path(
+ original_components.path, request.context
+ ),
+ original_components.query,
+ '',
+ )
+ )
+ logger.debug(
+ f'Updating URI from {request.url} to {accesspoint_endpoint}'
+ )
+ request.url = accesspoint_endpoint
+
+ def _get_netloc(self, request_context, region_name):
+ if is_global_accesspoint(request_context):
+ return self._get_mrap_netloc(request_context)
+ else:
+ return self._get_accesspoint_netloc(request_context, region_name)
+
+ def _get_mrap_netloc(self, request_context):
+ s3_accesspoint = request_context['s3_accesspoint']
+ region_name = 's3-global'
+ mrap_netloc_components = [s3_accesspoint['name']]
+ if self._endpoint_url:
+ endpoint_url_netloc = urlsplit(self._endpoint_url).netloc
+ mrap_netloc_components.append(endpoint_url_netloc)
+ else:
+ partition = s3_accesspoint['partition']
+ mrap_netloc_components.extend(
+ [
+ 'accesspoint',
+ region_name,
+ self._get_partition_dns_suffix(partition),
+ ]
+ )
+ return '.'.join(mrap_netloc_components)
+
+ def _get_accesspoint_netloc(self, request_context, region_name):
+ s3_accesspoint = request_context['s3_accesspoint']
+ accesspoint_netloc_components = [
+ '{}-{}'.format(s3_accesspoint['name'], s3_accesspoint['account']),
+ ]
+ outpost_name = s3_accesspoint.get('outpost_name')
+ if self._endpoint_url:
+ if outpost_name:
+ accesspoint_netloc_components.append(outpost_name)
+ endpoint_url_netloc = urlsplit(self._endpoint_url).netloc
+ accesspoint_netloc_components.append(endpoint_url_netloc)
+ else:
+ if outpost_name:
+ outpost_host = [outpost_name, 's3-outposts']
+ accesspoint_netloc_components.extend(outpost_host)
+ elif s3_accesspoint['service'] == 's3-object-lambda':
+ component = self._inject_fips_if_needed(
+ 's3-object-lambda', request_context
+ )
+ accesspoint_netloc_components.append(component)
+ else:
+ component = self._inject_fips_if_needed(
+ 's3-accesspoint', request_context
+ )
+ accesspoint_netloc_components.append(component)
+ if self._s3_config.get('use_dualstack_endpoint'):
+ accesspoint_netloc_components.append('dualstack')
+ accesspoint_netloc_components.extend(
+ [region_name, self._get_dns_suffix(region_name)]
+ )
+ return '.'.join(accesspoint_netloc_components)
+
+ def _inject_fips_if_needed(self, component, request_context):
+ if self._use_fips_endpoint:
+ return f'{component}-fips'
+ return component
+
+ def _get_accesspoint_path(self, original_path, request_context):
+ # The Bucket parameter was substituted with the access-point name as
+ # some value was required in serializing the bucket name. Now that
+ # we are making the request directly to the access point, we will
+ # want to remove that access-point name from the path.
+ name = request_context['s3_accesspoint']['name']
+ # All S3 operations require at least a / in their path.
+ return original_path.replace('/' + name, '', 1) or '/'
+
+ def _get_partition_dns_suffix(self, partition_name):
+ dns_suffix = self._endpoint_resolver.get_partition_dns_suffix(
+ partition_name
+ )
+ if dns_suffix is None:
+ dns_suffix = self._DEFAULT_DNS_SUFFIX
+ return dns_suffix
+
+ def _get_dns_suffix(self, region_name):
+ resolved = self._endpoint_resolver.construct_endpoint(
+ 's3', region_name
+ )
+ dns_suffix = self._DEFAULT_DNS_SUFFIX
+ if resolved and 'dnsSuffix' in resolved:
+ dns_suffix = resolved['dnsSuffix']
+ return dns_suffix
+
+ def _override_signing_region(self, request, region_name):
+ signing_context = request.context.get('signing', {})
+ # S3SigV4Auth will use the context['signing']['region'] value to
+ # sign with if present. This is used by the Bucket redirector
+ # as well but we should be fine because the redirector is never
+ # used in combination with the accesspoint setting logic.
+ signing_context['region'] = region_name
+ request.context['signing'] = signing_context
+
+ def _override_signing_name(self, context, signing_name):
+ signing_context = context.get('signing', {})
+ # S3SigV4Auth will use the context['signing']['signing_name'] value to
+ # sign with if present. This is used by the Bucket redirector
+ # as well but we should be fine because the redirector is never
+ # used in combination with the accesspoint setting logic.
+ signing_context['signing_name'] = signing_name
+ context['signing'] = signing_context
+
+ @CachedProperty
+ def _use_accelerate_endpoint(self):
+ # Enable accelerate if the configuration is set to to true or the
+ # endpoint being used matches one of the accelerate endpoints.
+
+ # Accelerate has been explicitly configured.
+ if self._s3_config.get('use_accelerate_endpoint'):
+ return True
+
+ # Accelerate mode is turned on automatically if an endpoint url is
+ # provided that matches the accelerate scheme.
+ if self._endpoint_url is None:
+ return False
+
+ # Accelerate is only valid for Amazon endpoints.
+ netloc = urlsplit(self._endpoint_url).netloc
+ if not netloc.endswith('amazonaws.com'):
+ return False
+
+ # The first part of the url should always be s3-accelerate.
+ parts = netloc.split('.')
+ if parts[0] != 's3-accelerate':
+ return False
+
+ # Url parts between 's3-accelerate' and 'amazonaws.com' which
+ # represent different url features.
+ feature_parts = parts[1:-2]
+
+ # There should be no duplicate url parts.
+ if len(feature_parts) != len(set(feature_parts)):
+ return False
+
+ # Remaining parts must all be in the whitelist.
+ return all(p in S3_ACCELERATE_WHITELIST for p in feature_parts)
+
+ @CachedProperty
+ def _addressing_style(self):
+ # Use virtual host style addressing if accelerate is enabled or if
+ # the given endpoint url is an accelerate endpoint.
+ if self._use_accelerate_endpoint:
+ return 'virtual'
+
+ # If a particular addressing style is configured, use it.
+ configured_addressing_style = self._s3_config.get('addressing_style')
+ if configured_addressing_style:
+ return configured_addressing_style
+
+ @CachedProperty
+ def _s3_addressing_handler(self):
+ # If virtual host style was configured, use it regardless of whether
+ # or not the bucket looks dns compatible.
+ if self._addressing_style == 'virtual':
+ logger.debug("Using S3 virtual host style addressing.")
+ return switch_to_virtual_host_style
+
+ # If path style is configured, no additional steps are needed. If
+ # endpoint_url was specified, don't default to virtual. We could
+ # potentially default provided endpoint urls to virtual hosted
+ # style, but for now it is avoided.
+ if self._addressing_style == 'path' or self._endpoint_url is not None:
+ logger.debug("Using S3 path style addressing.")
+ return None
+
+ logger.debug(
+ "Defaulting to S3 virtual host style addressing with "
+ "path style addressing fallback."
+ )
+
+ # By default, try to use virtual style with path fallback.
+ return fix_s3_host
+
+
+class S3ControlEndpointSetter:
+ _DEFAULT_PARTITION = 'aws'
+ _DEFAULT_DNS_SUFFIX = 'amazonaws.com'
+ _HOST_LABEL_REGEX = re.compile(r'^[a-zA-Z0-9\-]{1,63}$')
+
+ def __init__(
+ self,
+ endpoint_resolver,
+ region=None,
+ s3_config=None,
+ endpoint_url=None,
+ partition=None,
+ use_fips_endpoint=False,
+ ):
+ self._endpoint_resolver = endpoint_resolver
+ self._region = region
+ self._s3_config = s3_config
+ self._use_fips_endpoint = use_fips_endpoint
+ if s3_config is None:
+ self._s3_config = {}
+ self._endpoint_url = endpoint_url
+ self._partition = partition
+ if partition is None:
+ self._partition = self._DEFAULT_PARTITION
+
+ def register(self, event_emitter):
+ event_emitter.register('before-sign.s3-control', self.set_endpoint)
+
+ def set_endpoint(self, request, **kwargs):
+ if self._use_endpoint_from_arn_details(request):
+ self._validate_endpoint_from_arn_details_supported(request)
+ region_name = self._resolve_region_from_arn_details(request)
+ self._resolve_signing_name_from_arn_details(request)
+ self._resolve_endpoint_from_arn_details(request, region_name)
+ self._add_headers_from_arn_details(request)
+ elif self._use_endpoint_from_outpost_id(request):
+ self._validate_outpost_redirection_valid(request)
+ self._override_signing_name(request, 's3-outposts')
+ new_netloc = self._construct_outpost_endpoint(self._region)
+ self._update_request_netloc(request, new_netloc)
+
+ def _use_endpoint_from_arn_details(self, request):
+ return 'arn_details' in request.context
+
+ def _use_endpoint_from_outpost_id(self, request):
+ return 'outpost_id' in request.context
+
+ def _validate_endpoint_from_arn_details_supported(self, request):
+ if 'fips' in request.context['arn_details']['region']:
+ raise UnsupportedS3ControlArnError(
+ arn=request.context['arn_details']['original'],
+ msg='Invalid ARN, FIPS region not allowed in ARN.',
+ )
+ if not self._s3_config.get('use_arn_region', False):
+ arn_region = request.context['arn_details']['region']
+ if arn_region != self._region:
+ error_msg = (
+ 'The use_arn_region configuration is disabled but '
+ f'received arn for "{arn_region}" when the client is configured '
+ f'to use "{self._region}"'
+ )
+ raise UnsupportedS3ControlConfigurationError(msg=error_msg)
+ request_partion = request.context['arn_details']['partition']
+ if request_partion != self._partition:
+ raise UnsupportedS3ControlConfigurationError(
+ msg=(
+ f'Client is configured for "{self._partition}" partition, but arn '
+ f'provided is for "{request_partion}" partition. The client and '
+ 'arn partition must be the same.'
+ )
+ )
+ if self._s3_config.get('use_accelerate_endpoint'):
+ raise UnsupportedS3ControlConfigurationError(
+ msg='S3 control client does not support accelerate endpoints',
+ )
+ if 'outpost_name' in request.context['arn_details']:
+ self._validate_outpost_redirection_valid(request)
+
+ def _validate_outpost_redirection_valid(self, request):
+ if self._s3_config.get('use_dualstack_endpoint'):
+ raise UnsupportedS3ControlConfigurationError(
+ msg=(
+ 'Client does not support s3 dualstack configuration '
+ 'when an outpost is specified.'
+ )
+ )
+
+ def _resolve_region_from_arn_details(self, request):
+ if self._s3_config.get('use_arn_region', False):
+ arn_region = request.context['arn_details']['region']
+ # If we are using the region from the expanded arn, we will also
+ # want to make sure that we set it as the signing region as well
+ self._override_signing_region(request, arn_region)
+ return arn_region
+ return self._region
+
+ def _resolve_signing_name_from_arn_details(self, request):
+ arn_service = request.context['arn_details']['service']
+ self._override_signing_name(request, arn_service)
+ return arn_service
+
+ def _resolve_endpoint_from_arn_details(self, request, region_name):
+ new_netloc = self._resolve_netloc_from_arn_details(
+ request, region_name
+ )
+ self._update_request_netloc(request, new_netloc)
+
+ def _update_request_netloc(self, request, new_netloc):
+ original_components = urlsplit(request.url)
+ arn_details_endpoint = urlunsplit(
+ (
+ original_components.scheme,
+ new_netloc,
+ original_components.path,
+ original_components.query,
+ '',
+ )
+ )
+ logger.debug(
+ f'Updating URI from {request.url} to {arn_details_endpoint}'
+ )
+ request.url = arn_details_endpoint
+
+ def _resolve_netloc_from_arn_details(self, request, region_name):
+ arn_details = request.context['arn_details']
+ if 'outpost_name' in arn_details:
+ return self._construct_outpost_endpoint(region_name)
+ account = arn_details['account']
+ return self._construct_s3_control_endpoint(region_name, account)
+
+ def _is_valid_host_label(self, label):
+ return self._HOST_LABEL_REGEX.match(label)
+
+ def _validate_host_labels(self, *labels):
+ for label in labels:
+ if not self._is_valid_host_label(label):
+ raise InvalidHostLabelError(label=label)
+
+ def _construct_s3_control_endpoint(self, region_name, account):
+ self._validate_host_labels(region_name, account)
+ if self._endpoint_url:
+ endpoint_url_netloc = urlsplit(self._endpoint_url).netloc
+ netloc = [account, endpoint_url_netloc]
+ else:
+ netloc = [
+ account,
+ 's3-control',
+ ]
+ self._add_dualstack(netloc)
+ dns_suffix = self._get_dns_suffix(region_name)
+ netloc.extend([region_name, dns_suffix])
+ return self._construct_netloc(netloc)
+
+ def _construct_outpost_endpoint(self, region_name):
+ self._validate_host_labels(region_name)
+ if self._endpoint_url:
+ return urlsplit(self._endpoint_url).netloc
+ else:
+ netloc = [
+ 's3-outposts',
+ region_name,
+ self._get_dns_suffix(region_name),
+ ]
+ self._add_fips(netloc)
+ return self._construct_netloc(netloc)
+
+ def _construct_netloc(self, netloc):
+ return '.'.join(netloc)
+
+ def _add_fips(self, netloc):
+ if self._use_fips_endpoint:
+ netloc[0] = netloc[0] + '-fips'
+
+ def _add_dualstack(self, netloc):
+ if self._s3_config.get('use_dualstack_endpoint'):
+ netloc.append('dualstack')
+
+ def _get_dns_suffix(self, region_name):
+ resolved = self._endpoint_resolver.construct_endpoint(
+ 's3', region_name
+ )
+ dns_suffix = self._DEFAULT_DNS_SUFFIX
+ if resolved and 'dnsSuffix' in resolved:
+ dns_suffix = resolved['dnsSuffix']
+ return dns_suffix
+
+ def _override_signing_region(self, request, region_name):
+ signing_context = request.context.get('signing', {})
+ # S3SigV4Auth will use the context['signing']['region'] value to
+ # sign with if present. This is used by the Bucket redirector
+ # as well but we should be fine because the redirector is never
+ # used in combination with the accesspoint setting logic.
+ signing_context['region'] = region_name
+ request.context['signing'] = signing_context
+
+ def _override_signing_name(self, request, signing_name):
+ signing_context = request.context.get('signing', {})
+ # S3SigV4Auth will use the context['signing']['signing_name'] value to
+ # sign with if present. This is used by the Bucket redirector
+ # as well but we should be fine because the redirector is never
+ # used in combination with the accesspoint setting logic.
+ signing_context['signing_name'] = signing_name
+ request.context['signing'] = signing_context
+
+ def _add_headers_from_arn_details(self, request):
+ arn_details = request.context['arn_details']
+ outpost_name = arn_details.get('outpost_name')
+ if outpost_name:
+ self._add_outpost_id_header(request, outpost_name)
+
+ def _add_outpost_id_header(self, request, outpost_name):
+ request.headers['x-amz-outpost-id'] = outpost_name
+
+
+class S3ControlArnParamHandler:
+ """This handler has been replaced by S3ControlArnParamHandlerv2. The
+ original version remains in place for any third-party importers.
+ """
+
+ _RESOURCE_SPLIT_REGEX = re.compile(r'[/:]')
+
+ def __init__(self, arn_parser=None):
+ self._arn_parser = arn_parser
+ if arn_parser is None:
+ self._arn_parser = ArnParser()
+ warnings.warn(
+ 'The S3ControlArnParamHandler class has been deprecated for a new '
+ 'internal replacement. A future version of botocore may remove '
+ 'this class.',
+ category=FutureWarning,
+ )
+
+ def register(self, event_emitter):
+ event_emitter.register(
+ 'before-parameter-build.s3-control',
+ self.handle_arn,
+ )
+
+ def handle_arn(self, params, model, context, **kwargs):
+ if model.name in ('CreateBucket', 'ListRegionalBuckets'):
+ # CreateBucket and ListRegionalBuckets are special cases that do
+ # not obey ARN based redirection but will redirect based off of the
+ # presence of the OutpostId parameter
+ self._handle_outpost_id_param(params, model, context)
+ else:
+ self._handle_name_param(params, model, context)
+ self._handle_bucket_param(params, model, context)
+
+ def _get_arn_details_from_param(self, params, param_name):
+ if param_name not in params:
+ return None
+ try:
+ arn = params[param_name]
+ arn_details = self._arn_parser.parse_arn(arn)
+ arn_details['original'] = arn
+ arn_details['resources'] = self._split_resource(arn_details)
+ return arn_details
+ except InvalidArnException:
+ return None
+
+ def _split_resource(self, arn_details):
+ return self._RESOURCE_SPLIT_REGEX.split(arn_details['resource'])
+
+ def _override_account_id_param(self, params, arn_details):
+ account_id = arn_details['account']
+ if 'AccountId' in params and params['AccountId'] != account_id:
+ error_msg = (
+ 'Account ID in arn does not match the AccountId parameter '
+ 'provided: "{}"'
+ ).format(params['AccountId'])
+ raise UnsupportedS3ControlArnError(
+ arn=arn_details['original'],
+ msg=error_msg,
+ )
+ params['AccountId'] = account_id
+
+ def _handle_outpost_id_param(self, params, model, context):
+ if 'OutpostId' not in params:
+ return
+ context['outpost_id'] = params['OutpostId']
+
+ def _handle_name_param(self, params, model, context):
+ # CreateAccessPoint is a special case that does not expand Name
+ if model.name == 'CreateAccessPoint':
+ return
+ arn_details = self._get_arn_details_from_param(params, 'Name')
+ if arn_details is None:
+ return
+ if self._is_outpost_accesspoint(arn_details):
+ self._store_outpost_accesspoint(params, context, arn_details)
+ else:
+ error_msg = 'The Name parameter does not support the provided ARN'
+ raise UnsupportedS3ControlArnError(
+ arn=arn_details['original'],
+ msg=error_msg,
+ )
+
+ def _is_outpost_accesspoint(self, arn_details):
+ if arn_details['service'] != 's3-outposts':
+ return False
+ resources = arn_details['resources']
+ if len(resources) != 4:
+ return False
+ # Resource must be of the form outpost/op-123/accesspoint/name
+ return resources[0] == 'outpost' and resources[2] == 'accesspoint'
+
+ def _store_outpost_accesspoint(self, params, context, arn_details):
+ self._override_account_id_param(params, arn_details)
+ accesspoint_name = arn_details['resources'][3]
+ params['Name'] = accesspoint_name
+ arn_details['accesspoint_name'] = accesspoint_name
+ arn_details['outpost_name'] = arn_details['resources'][1]
+ context['arn_details'] = arn_details
+
+ def _handle_bucket_param(self, params, model, context):
+ arn_details = self._get_arn_details_from_param(params, 'Bucket')
+ if arn_details is None:
+ return
+ if self._is_outpost_bucket(arn_details):
+ self._store_outpost_bucket(params, context, arn_details)
+ else:
+ error_msg = (
+ 'The Bucket parameter does not support the provided ARN'
+ )
+ raise UnsupportedS3ControlArnError(
+ arn=arn_details['original'],
+ msg=error_msg,
+ )
+
+ def _is_outpost_bucket(self, arn_details):
+ if arn_details['service'] != 's3-outposts':
+ return False
+ resources = arn_details['resources']
+ if len(resources) != 4:
+ return False
+ # Resource must be of the form outpost/op-123/bucket/name
+ return resources[0] == 'outpost' and resources[2] == 'bucket'
+
+ def _store_outpost_bucket(self, params, context, arn_details):
+ self._override_account_id_param(params, arn_details)
+ bucket_name = arn_details['resources'][3]
+ params['Bucket'] = bucket_name
+ arn_details['bucket_name'] = bucket_name
+ arn_details['outpost_name'] = arn_details['resources'][1]
+ context['arn_details'] = arn_details
+
+
+class S3ControlArnParamHandlerv2(S3ControlArnParamHandler):
+ """Updated version of S3ControlArnParamHandler for use when
+ EndpointRulesetResolver is in use for endpoint resolution.
+
+ This class is considered private and subject to abrupt breaking changes or
+ removal without prior announcement. Please do not use it directly.
+ """
+
+ def __init__(self, arn_parser=None):
+ self._arn_parser = arn_parser
+ if arn_parser is None:
+ self._arn_parser = ArnParser()
+
+ def register(self, event_emitter):
+ event_emitter.register(
+ 'before-endpoint-resolution.s3-control',
+ self.handle_arn,
+ )
+
+ def _handle_name_param(self, params, model, context):
+ # CreateAccessPoint is a special case that does not expand Name
+ if model.name == 'CreateAccessPoint':
+ return
+ arn_details = self._get_arn_details_from_param(params, 'Name')
+ if arn_details is None:
+ return
+ self._raise_for_fips_pseudo_region(arn_details)
+ self._raise_for_accelerate_endpoint(context)
+ if self._is_outpost_accesspoint(arn_details):
+ self._store_outpost_accesspoint(params, context, arn_details)
+ else:
+ error_msg = 'The Name parameter does not support the provided ARN'
+ raise UnsupportedS3ControlArnError(
+ arn=arn_details['original'],
+ msg=error_msg,
+ )
+
+ def _store_outpost_accesspoint(self, params, context, arn_details):
+ self._override_account_id_param(params, arn_details)
+
+ def _handle_bucket_param(self, params, model, context):
+ arn_details = self._get_arn_details_from_param(params, 'Bucket')
+ if arn_details is None:
+ return
+ self._raise_for_fips_pseudo_region(arn_details)
+ self._raise_for_accelerate_endpoint(context)
+ if self._is_outpost_bucket(arn_details):
+ self._store_outpost_bucket(params, context, arn_details)
+ else:
+ error_msg = (
+ 'The Bucket parameter does not support the provided ARN'
+ )
+ raise UnsupportedS3ControlArnError(
+ arn=arn_details['original'],
+ msg=error_msg,
+ )
+
+ def _store_outpost_bucket(self, params, context, arn_details):
+ self._override_account_id_param(params, arn_details)
+
+ def _raise_for_fips_pseudo_region(self, arn_details):
+ # FIPS pseudo region names cannot be used in ARNs
+ arn_region = arn_details['region']
+ if arn_region.startswith('fips-') or arn_region.endswith('fips-'):
+ raise UnsupportedS3ControlArnError(
+ arn=arn_details['original'],
+ msg='Invalid ARN, FIPS region not allowed in ARN.',
+ )
+
+ def _raise_for_accelerate_endpoint(self, context):
+ s3_config = context['client_config'].s3 or {}
+ if s3_config.get('use_accelerate_endpoint'):
+ raise UnsupportedS3ControlConfigurationError(
+ msg='S3 control client does not support accelerate endpoints',
+ )
+
+
+class ContainerMetadataFetcher:
+ TIMEOUT_SECONDS = 2
+ RETRY_ATTEMPTS = 3
+ SLEEP_TIME = 1
+ IP_ADDRESS = '169.254.170.2'
+ _ALLOWED_HOSTS = [
+ IP_ADDRESS,
+ '169.254.170.23',
+ 'fd00:ec2::23',
+ 'localhost',
+ ]
+
+ def __init__(self, session=None, sleep=time.sleep):
+ if session is None:
+ session = botocore.httpsession.URLLib3Session(
+ timeout=self.TIMEOUT_SECONDS
+ )
+ self._session = session
+ self._sleep = sleep
+
+ def retrieve_full_uri(self, full_url, headers=None):
+ """Retrieve JSON metadata from container metadata.
+
+ :type full_url: str
+ :param full_url: The full URL of the metadata service.
+ This should include the scheme as well, e.g
+ "http://localhost:123/foo"
+
+ """
+ self._validate_allowed_url(full_url)
+ return self._retrieve_credentials(full_url, headers)
+
+ def _validate_allowed_url(self, full_url):
+ parsed = botocore.compat.urlparse(full_url)
+ if self._is_loopback_address(parsed.hostname):
+ return
+ is_whitelisted_host = self._check_if_whitelisted_host(parsed.hostname)
+ if not is_whitelisted_host:
+ raise ValueError(
+ f"Unsupported host '{parsed.hostname}'. Can only retrieve metadata "
+ f"from a loopback address or one of these hosts: {', '.join(self._ALLOWED_HOSTS)}"
+ )
+
+ def _is_loopback_address(self, hostname):
+ try:
+ ip = ip_address(hostname)
+ return ip.is_loopback
+ except ValueError:
+ return False
+
+ def _check_if_whitelisted_host(self, host):
+ if host in self._ALLOWED_HOSTS:
+ return True
+ return False
+
+ def retrieve_uri(self, relative_uri):
+ """Retrieve JSON metadata from container metadata.
+
+ :type relative_uri: str
+ :param relative_uri: A relative URI, e.g "/foo/bar?id=123"
+
+ :return: The parsed JSON response.
+
+ """
+ full_url = self.full_url(relative_uri)
+ return self._retrieve_credentials(full_url)
+
+ def _retrieve_credentials(self, full_url, extra_headers=None):
+ headers = {'Accept': 'application/json'}
+ if extra_headers is not None:
+ headers.update(extra_headers)
+ attempts = 0
+ while True:
+ try:
+ return self._get_response(
+ full_url, headers, self.TIMEOUT_SECONDS
+ )
+ except MetadataRetrievalError as e:
+ logger.debug(
+ "Received error when attempting to retrieve "
+ "container metadata: %s",
+ e,
+ exc_info=True,
+ )
+ self._sleep(self.SLEEP_TIME)
+ attempts += 1
+ if attempts >= self.RETRY_ATTEMPTS:
+ raise
+
+ def _get_response(self, full_url, headers, timeout):
+ try:
+ AWSRequest = botocore.awsrequest.AWSRequest
+ request = AWSRequest(method='GET', url=full_url, headers=headers)
+ response = self._session.send(request.prepare())
+ response_text = response.content.decode('utf-8')
+ if response.status_code != 200:
+ raise MetadataRetrievalError(
+ error_msg=(
+ f"Received non 200 response {response.status_code} "
+ f"from container metadata: {response_text}"
+ )
+ )
+ try:
+ return json.loads(response_text)
+ except ValueError:
+ error_msg = "Unable to parse JSON returned from container metadata services"
+ logger.debug('%s:%s', error_msg, response_text)
+ raise MetadataRetrievalError(error_msg=error_msg)
+ except RETRYABLE_HTTP_ERRORS as e:
+ error_msg = (
+ "Received error when attempting to retrieve "
+ f"container metadata: {e}"
+ )
+ raise MetadataRetrievalError(error_msg=error_msg)
+
+ def full_url(self, relative_uri):
+ return f'http://{self.IP_ADDRESS}{relative_uri}'
+
+
+def get_environ_proxies(url):
+ if should_bypass_proxies(url):
+ return {}
+ else:
+ return getproxies()
+
+
+def should_bypass_proxies(url):
+ """
+ Returns whether we should bypass proxies or not.
+ """
+ # NOTE: requests allowed for ip/cidr entries in no_proxy env that we don't
+ # support current as urllib only checks DNS suffix
+ # If the system proxy settings indicate that this URL should be bypassed,
+ # don't proxy.
+ # The proxy_bypass function is incredibly buggy on OS X in early versions
+ # of Python 2.6, so allow this call to fail. Only catch the specific
+ # exceptions we've seen, though: this call failing in other ways can reveal
+ # legitimate problems.
+ try:
+ if proxy_bypass(urlparse(url).netloc):
+ return True
+ except (TypeError, socket.gaierror):
+ pass
+
+ return False
+
+
+def determine_content_length(body):
+ # No body, content length of 0
+ if not body:
+ return 0
+
+ # Try asking the body for it's length
+ try:
+ return len(body)
+ except (AttributeError, TypeError):
+ pass
+
+ # Try getting the length from a seekable stream
+ if hasattr(body, 'seek') and hasattr(body, 'tell'):
+ try:
+ orig_pos = body.tell()
+ body.seek(0, 2)
+ end_file_pos = body.tell()
+ body.seek(orig_pos)
+ return end_file_pos - orig_pos
+ except io.UnsupportedOperation:
+ # in case when body is, for example, io.BufferedIOBase object
+ # it has "seek" method which throws "UnsupportedOperation"
+ # exception in such case we want to fall back to "chunked"
+ # encoding
+ pass
+ # Failed to determine the length
+ return None
+
+
+def get_encoding_from_headers(headers, default='ISO-8859-1'):
+ """Returns encodings from given HTTP Header Dict.
+
+ :param headers: dictionary to extract encoding from.
+ :param default: default encoding if the content-type is text
+ """
+
+ content_type = headers.get('content-type')
+
+ if not content_type:
+ return None
+
+ message = email.message.Message()
+ message['content-type'] = content_type
+ charset = message.get_param("charset")
+
+ if charset is not None:
+ return charset
+
+ if 'text' in content_type:
+ return default
+
+
+def calculate_md5(body, **kwargs):
+ """This function has been deprecated, but is kept for backwards compatibility."""
+ if isinstance(body, (bytes, bytearray)):
+ binary_md5 = _calculate_md5_from_bytes(body)
+ else:
+ binary_md5 = _calculate_md5_from_file(body)
+ return base64.b64encode(binary_md5).decode('ascii')
+
+
+def _calculate_md5_from_bytes(body_bytes):
+ """This function has been deprecated, but is kept for backwards compatibility."""
+ md5 = get_md5(body_bytes)
+ return md5.digest()
+
+
+def _calculate_md5_from_file(fileobj):
+ """This function has been deprecated, but is kept for backwards compatibility."""
+ start_position = fileobj.tell()
+ md5 = get_md5()
+ for chunk in iter(lambda: fileobj.read(1024 * 1024), b''):
+ md5.update(chunk)
+ fileobj.seek(start_position)
+ return md5.digest()
+
+
+def _is_s3express_request(params):
+ endpoint_properties = params.get('context', {}).get(
+ 'endpoint_properties', {}
+ )
+ return endpoint_properties.get('backend') == 'S3Express'
+
+
+def has_checksum_header(params):
+ """
+ Checks if a header starting with "x-amz-checksum-" is provided in a request.
+
+ This function is considered private and subject to abrupt breaking changes or
+ removal without prior announcement. Please do not use it directly.
+ """
+ headers = params['headers']
+
+ # If a header matching the x-amz-checksum-* pattern is present, we
+ # assume a checksum has already been provided by the user.
+ for header in headers:
+ if CHECKSUM_HEADER_PATTERN.match(header):
+ return True
+
+ return False
+
+
+def conditionally_calculate_checksum(params, **kwargs):
+ """This function has been deprecated, but is kept for backwards compatibility."""
+ if not has_checksum_header(params):
+ conditionally_calculate_md5(params, **kwargs)
+ conditionally_enable_crc32(params, **kwargs)
+
+
+def conditionally_enable_crc32(params, **kwargs):
+ """This function has been deprecated, but is kept for backwards compatibility."""
+ checksum_context = params.get('context', {}).get('checksum', {})
+ checksum_algorithm = checksum_context.get('request_algorithm')
+ if (
+ _is_s3express_request(params)
+ and params['body'] is not None
+ and checksum_algorithm in (None, "conditional-md5")
+ ):
+ params['context']['checksum'] = {
+ 'request_algorithm': {
+ 'algorithm': 'crc32',
+ 'in': 'header',
+ 'name': 'x-amz-checksum-crc32',
+ }
+ }
+
+
+def conditionally_calculate_md5(params, **kwargs):
+ """Only add a Content-MD5 if the system supports it.
+
+ This function has been deprecated, but is kept for backwards compatibility.
+ """
+ body = params['body']
+ checksum_context = params.get('context', {}).get('checksum', {})
+ checksum_algorithm = checksum_context.get('request_algorithm')
+ if checksum_algorithm and checksum_algorithm != 'conditional-md5':
+ # Skip for requests that will have a flexible checksum applied
+ return
+
+ if has_checksum_header(params):
+ # Don't add a new header if one is already available.
+ return
+
+ if _is_s3express_request(params):
+ # S3Express doesn't support MD5
+ return
+
+ if MD5_AVAILABLE and body is not None:
+ md5_digest = calculate_md5(body, **kwargs)
+ params['headers']['Content-MD5'] = md5_digest
+
+
+class FileWebIdentityTokenLoader:
+ def __init__(self, web_identity_token_path, _open=open):
+ self._web_identity_token_path = web_identity_token_path
+ self._open = _open
+
+ def __call__(self):
+ with self._open(self._web_identity_token_path) as token_file:
+ return token_file.read()
+
+
+class SSOTokenLoader:
+ def __init__(self, cache=None):
+ if cache is None:
+ cache = {}
+ self._cache = cache
+
+ def _generate_cache_key(self, start_url, session_name):
+ input_str = start_url
+ if session_name is not None:
+ input_str = session_name
+ return hashlib.sha1(input_str.encode('utf-8')).hexdigest()
+
+ def save_token(self, start_url, token, session_name=None):
+ cache_key = self._generate_cache_key(start_url, session_name)
+ self._cache[cache_key] = token
+
+ def __call__(self, start_url, session_name=None):
+ cache_key = self._generate_cache_key(start_url, session_name)
+ logger.debug(f'Checking for cached token at: {cache_key}')
+ if cache_key not in self._cache:
+ name = start_url
+ if session_name is not None:
+ name = session_name
+ error_msg = f'Token for {name} does not exist'
+ raise SSOTokenLoadError(error_msg=error_msg)
+
+ token = self._cache[cache_key]
+ if 'accessToken' not in token or 'expiresAt' not in token:
+ error_msg = f'Token for {start_url} is invalid'
+ raise SSOTokenLoadError(error_msg=error_msg)
+ return token
+
+
+class EventbridgeSignerSetter:
+ _DEFAULT_PARTITION = 'aws'
+ _DEFAULT_DNS_SUFFIX = 'amazonaws.com'
+
+ def __init__(self, endpoint_resolver, region=None, endpoint_url=None):
+ self._endpoint_resolver = endpoint_resolver
+ self._region = region
+ self._endpoint_url = endpoint_url
+
+ def register(self, event_emitter):
+ event_emitter.register(
+ 'before-parameter-build.events.PutEvents',
+ self.check_for_global_endpoint,
+ )
+ event_emitter.register(
+ 'before-call.events.PutEvents', self.set_endpoint_url
+ )
+
+ def set_endpoint_url(self, params, context, **kwargs):
+ if 'eventbridge_endpoint' in context:
+ endpoint = context['eventbridge_endpoint']
+ logger.debug(f"Rewriting URL from {params['url']} to {endpoint}")
+ params['url'] = endpoint
+
+ def check_for_global_endpoint(self, params, context, **kwargs):
+ endpoint = params.get('EndpointId')
+ if endpoint is None:
+ return
+
+ if len(endpoint) == 0:
+ raise InvalidEndpointConfigurationError(
+ msg='EndpointId must not be a zero length string'
+ )
+
+ if not HAS_CRT:
+ raise MissingDependencyException(
+ msg="Using EndpointId requires an additional "
+ "dependency. You will need to pip install "
+ "botocore[crt] before proceeding."
+ )
+
+ config = context.get('client_config')
+ endpoint_variant_tags = None
+ if config is not None:
+ if config.use_fips_endpoint:
+ raise InvalidEndpointConfigurationError(
+ msg="FIPS is not supported with EventBridge "
+ "multi-region endpoints."
+ )
+ if config.use_dualstack_endpoint:
+ endpoint_variant_tags = ['dualstack']
+
+ if self._endpoint_url is None:
+ # Validate endpoint is a valid hostname component
+ parts = urlparse(f'https://{endpoint}')
+ if parts.hostname != endpoint:
+ raise InvalidEndpointConfigurationError(
+ msg='EndpointId is not a valid hostname component.'
+ )
+ resolved_endpoint = self._get_global_endpoint(
+ endpoint, endpoint_variant_tags=endpoint_variant_tags
+ )
+ else:
+ resolved_endpoint = self._endpoint_url
+
+ context['eventbridge_endpoint'] = resolved_endpoint
+ context['auth_type'] = 'v4a'
+
+ def _get_global_endpoint(self, endpoint, endpoint_variant_tags=None):
+ resolver = self._endpoint_resolver
+
+ partition = resolver.get_partition_for_region(self._region)
+ if partition is None:
+ partition = self._DEFAULT_PARTITION
+ dns_suffix = resolver.get_partition_dns_suffix(
+ partition, endpoint_variant_tags=endpoint_variant_tags
+ )
+ if dns_suffix is None:
+ dns_suffix = self._DEFAULT_DNS_SUFFIX
+
+ return f"https://{endpoint}.endpoint.events.{dns_suffix}/"
+
+
+def is_s3_accelerate_url(url):
+ """Does the URL match the S3 Accelerate endpoint scheme?
+
+ Virtual host naming style with bucket names in the netloc part of the URL
+ are not allowed by this function.
+ """
+ if url is None:
+ return False
+
+ # Accelerate is only valid for Amazon endpoints.
+ url_parts = urlsplit(url)
+ if not url_parts.netloc.endswith(
+ 'amazonaws.com'
+ ) or url_parts.scheme not in ['https', 'http']:
+ return False
+
+ # The first part of the URL must be s3-accelerate.
+ parts = url_parts.netloc.split('.')
+ if parts[0] != 's3-accelerate':
+ return False
+
+ # Url parts between 's3-accelerate' and 'amazonaws.com' which
+ # represent different url features.
+ feature_parts = parts[1:-2]
+
+ # There should be no duplicate URL parts.
+ if len(feature_parts) != len(set(feature_parts)):
+ return False
+
+ # Remaining parts must all be in the whitelist.
+ return all(p in S3_ACCELERATE_WHITELIST for p in feature_parts)
+
+
+class JSONFileCache:
+ """JSON file cache.
+ This provides a dict like interface that stores JSON serializable
+ objects.
+ The objects are serialized to JSON and stored in a file. These
+ values can be retrieved at a later time.
+ """
+
+ CACHE_DIR = os.path.expanduser(os.path.join('~', '.aws', 'boto', 'cache'))
+
+ def __init__(self, working_dir=CACHE_DIR, dumps_func=None):
+ self._working_dir = working_dir
+ if dumps_func is None:
+ dumps_func = self._default_dumps
+ self._dumps = dumps_func
+
+ def _default_dumps(self, obj):
+ return json.dumps(obj, default=self._serialize_if_needed)
+
+ def __contains__(self, cache_key):
+ actual_key = self._convert_cache_key(cache_key)
+ return os.path.isfile(actual_key)
+
+ def __getitem__(self, cache_key):
+ """Retrieve value from a cache key."""
+ actual_key = self._convert_cache_key(cache_key)
+ try:
+ with open(actual_key) as f:
+ return json.load(f)
+ except (OSError, ValueError):
+ raise KeyError(cache_key)
+
+ def __delitem__(self, cache_key):
+ actual_key = self._convert_cache_key(cache_key)
+ try:
+ key_path = Path(actual_key)
+ key_path.unlink()
+ except FileNotFoundError:
+ raise KeyError(cache_key)
+
+ def __setitem__(self, cache_key, value):
+ full_key = self._convert_cache_key(cache_key)
+ try:
+ file_content = self._dumps(value)
+ except (TypeError, ValueError):
+ raise ValueError(
+ f"Value cannot be cached, must be "
+ f"JSON serializable: {value}"
+ )
+ if not os.path.isdir(self._working_dir):
+ os.makedirs(self._working_dir)
+ with os.fdopen(
+ os.open(full_key, os.O_WRONLY | os.O_CREAT, 0o600), 'w'
+ ) as f:
+ f.truncate()
+ f.write(file_content)
+
+ def _convert_cache_key(self, cache_key):
+ full_path = os.path.join(self._working_dir, cache_key + '.json')
+ return full_path
+
+ def _serialize_if_needed(self, value, iso=False):
+ if isinstance(value, _DatetimeClass):
+ if iso:
+ return value.isoformat()
+ return value.strftime('%Y-%m-%dT%H:%M:%S%Z')
+ return value
+
+
+def is_s3express_bucket(bucket):
+ if bucket is None:
+ return False
+ return bucket.endswith('--x-s3')
+
+
+# This parameter is not part of the public interface and is subject to abrupt
+# breaking changes or removal without prior announcement.
+# Mapping of services that have been renamed for backwards compatibility reasons.
+# Keys are the previous name that should be allowed, values are the documented
+# and preferred client name.
+SERVICE_NAME_ALIASES = {'runtime.sagemaker': 'sagemaker-runtime'}
+
+
+# This parameter is not part of the public interface and is subject to abrupt
+# breaking changes or removal without prior announcement.
+# Mapping to determine the service ID for services that do not use it as the
+# model data directory name. The keys are the data directory name and the
+# values are the transformed service IDs (lower case and hyphenated).
+CLIENT_NAME_TO_HYPHENIZED_SERVICE_ID_OVERRIDES = {
+ # Actual service name we use -> Allowed computed service name.
+ 'apigateway': 'api-gateway',
+ 'application-autoscaling': 'application-auto-scaling',
+ 'appmesh': 'app-mesh',
+ 'autoscaling': 'auto-scaling',
+ 'autoscaling-plans': 'auto-scaling-plans',
+ 'ce': 'cost-explorer',
+ 'cloudhsmv2': 'cloudhsm-v2',
+ 'cloudsearchdomain': 'cloudsearch-domain',
+ 'cognito-idp': 'cognito-identity-provider',
+ 'config': 'config-service',
+ 'cur': 'cost-and-usage-report-service',
+ 'datapipeline': 'data-pipeline',
+ 'directconnect': 'direct-connect',
+ 'devicefarm': 'device-farm',
+ 'discovery': 'application-discovery-service',
+ 'dms': 'database-migration-service',
+ 'ds': 'directory-service',
+ 'ds-data': 'directory-service-data',
+ 'dynamodbstreams': 'dynamodb-streams',
+ 'elasticbeanstalk': 'elastic-beanstalk',
+ 'elastictranscoder': 'elastic-transcoder',
+ 'elb': 'elastic-load-balancing',
+ 'elbv2': 'elastic-load-balancing-v2',
+ 'es': 'elasticsearch-service',
+ 'events': 'eventbridge',
+ 'globalaccelerator': 'global-accelerator',
+ 'iot-data': 'iot-data-plane',
+ 'iot-jobs-data': 'iot-jobs-data-plane',
+ 'iotevents-data': 'iot-events-data',
+ 'iotevents': 'iot-events',
+ 'iotwireless': 'iot-wireless',
+ 'kinesisanalytics': 'kinesis-analytics',
+ 'kinesisanalyticsv2': 'kinesis-analytics-v2',
+ 'kinesisvideo': 'kinesis-video',
+ 'lex-models': 'lex-model-building-service',
+ 'lexv2-models': 'lex-models-v2',
+ 'lex-runtime': 'lex-runtime-service',
+ 'lexv2-runtime': 'lex-runtime-v2',
+ 'logs': 'cloudwatch-logs',
+ 'machinelearning': 'machine-learning',
+ 'marketplacecommerceanalytics': 'marketplace-commerce-analytics',
+ 'marketplace-entitlement': 'marketplace-entitlement-service',
+ 'meteringmarketplace': 'marketplace-metering',
+ 'mgh': 'migration-hub',
+ 'sms-voice': 'pinpoint-sms-voice',
+ 'resourcegroupstaggingapi': 'resource-groups-tagging-api',
+ 'route53': 'route-53',
+ 'route53domains': 'route-53-domains',
+ 's3control': 's3-control',
+ 'sdb': 'simpledb',
+ 'secretsmanager': 'secrets-manager',
+ 'serverlessrepo': 'serverlessapplicationrepository',
+ 'servicecatalog': 'service-catalog',
+ 'servicecatalog-appregistry': 'service-catalog-appregistry',
+ 'stepfunctions': 'sfn',
+ 'storagegateway': 'storage-gateway',
+}
diff --git a/.venv/lib/python3.12/site-packages/botocore/validate.py b/.venv/lib/python3.12/site-packages/botocore/validate.py
new file mode 100644
index 00000000..82aabd66
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/validate.py
@@ -0,0 +1,384 @@
+"""User input parameter validation.
+
+This module handles user input parameter validation
+against a provided input model.
+
+Note that the objects in this module do *not* mutate any
+arguments. No type version happens here. It is up to another
+layer to properly convert arguments to any required types.
+
+Validation Errors
+-----------------
+
+
+"""
+
+import decimal
+import json
+from datetime import datetime
+
+from botocore.exceptions import ParamValidationError
+from botocore.utils import is_json_value_header, parse_to_aware_datetime
+
+
+def validate_parameters(params, shape):
+ """Validates input parameters against a schema.
+
+ This is a convenience function that validates parameters against a schema.
+ You can also instantiate and use the ParamValidator class directly if you
+ want more control.
+
+ If there are any validation errors then a ParamValidationError
+ will be raised. If there are no validation errors than no exception
+ is raised and a value of None is returned.
+
+ :param params: The user provided input parameters.
+
+ :type shape: botocore.model.Shape
+ :param shape: The schema which the input parameters should
+ adhere to.
+
+ :raise: ParamValidationError
+
+ """
+ validator = ParamValidator()
+ report = validator.validate(params, shape)
+ if report.has_errors():
+ raise ParamValidationError(report=report.generate_report())
+
+
+def type_check(valid_types):
+ def _create_type_check_guard(func):
+ def _on_passes_type_check(self, param, shape, errors, name):
+ if _type_check(param, errors, name):
+ return func(self, param, shape, errors, name)
+
+ def _type_check(param, errors, name):
+ if not isinstance(param, valid_types):
+ valid_type_names = [str(t) for t in valid_types]
+ errors.report(
+ name,
+ 'invalid type',
+ param=param,
+ valid_types=valid_type_names,
+ )
+ return False
+ return True
+
+ return _on_passes_type_check
+
+ return _create_type_check_guard
+
+
+def range_check(name, value, shape, error_type, errors):
+ failed = False
+ min_allowed = float('-inf')
+ if 'min' in shape.metadata:
+ min_allowed = shape.metadata['min']
+ if value < min_allowed:
+ failed = True
+ elif hasattr(shape, 'serialization'):
+ # Members that can be bound to the host have an implicit min of 1
+ if shape.serialization.get('hostLabel'):
+ min_allowed = 1
+ if value < min_allowed:
+ failed = True
+ if failed:
+ errors.report(name, error_type, param=value, min_allowed=min_allowed)
+
+
+class ValidationErrors:
+ def __init__(self):
+ self._errors = []
+
+ def has_errors(self):
+ if self._errors:
+ return True
+ return False
+
+ def generate_report(self):
+ error_messages = []
+ for error in self._errors:
+ error_messages.append(self._format_error(error))
+ return '\n'.join(error_messages)
+
+ def _format_error(self, error):
+ error_type, name, additional = error
+ name = self._get_name(name)
+ if error_type == 'missing required field':
+ return (
+ f"Missing required parameter in {name}: "
+ f"\"{additional['required_name']}\""
+ )
+ elif error_type == 'unknown field':
+ unknown_param = additional['unknown_param']
+ valid_names = ', '.join(additional['valid_names'])
+ return (
+ f'Unknown parameter in {name}: "{unknown_param}", '
+ f'must be one of: {valid_names}'
+ )
+ elif error_type == 'invalid type':
+ param = additional['param']
+ param_type = type(param)
+ valid_types = ', '.join(additional['valid_types'])
+ return (
+ f'Invalid type for parameter {name}, value: {param}, '
+ f'type: {param_type}, valid types: {valid_types}'
+ )
+ elif error_type == 'invalid range':
+ param = additional['param']
+ min_allowed = additional['min_allowed']
+ return (
+ f'Invalid value for parameter {name}, value: {param}, '
+ f'valid min value: {min_allowed}'
+ )
+ elif error_type == 'invalid length':
+ param = additional['param']
+ min_allowed = additional['min_allowed']
+ return (
+ f'Invalid length for parameter {name}, value: {param}, '
+ f'valid min length: {min_allowed}'
+ )
+ elif error_type == 'unable to encode to json':
+ return 'Invalid parameter {} must be json serializable: {}'.format(
+ name,
+ additional['type_error'],
+ )
+ elif error_type == 'invalid type for document':
+ param = additional['param']
+ param_type = type(param)
+ valid_types = ', '.join(additional['valid_types'])
+ return (
+ f'Invalid type for document parameter {name}, value: {param}, '
+ f'type: {param_type}, valid types: {valid_types}'
+ )
+ elif error_type == 'more than one input':
+ members = ', '.join(additional['members'])
+ return (
+ f'Invalid number of parameters set for tagged union structure '
+ f'{name}. Can only set one of the following keys: '
+ f'{members}.'
+ )
+ elif error_type == 'empty input':
+ members = ', '.join(additional['members'])
+ return (
+ f'Must set one of the following keys for tagged union'
+ f'structure {name}: {members}.'
+ )
+
+ def _get_name(self, name):
+ if not name:
+ return 'input'
+ elif name.startswith('.'):
+ return name[1:]
+ else:
+ return name
+
+ def report(self, name, reason, **kwargs):
+ self._errors.append((reason, name, kwargs))
+
+
+class ParamValidator:
+ """Validates parameters against a shape model."""
+
+ def validate(self, params, shape):
+ """Validate parameters against a shape model.
+
+ This method will validate the parameters against a provided shape model.
+ All errors will be collected before returning to the caller. This means
+ that this method will not stop at the first error, it will return all
+ possible errors.
+
+ :param params: User provided dict of parameters
+ :param shape: A shape model describing the expected input.
+
+ :return: A list of errors.
+
+ """
+ errors = ValidationErrors()
+ self._validate(params, shape, errors, name='')
+ return errors
+
+ def _check_special_validation_cases(self, shape):
+ if is_json_value_header(shape):
+ return self._validate_jsonvalue_string
+ if shape.type_name == 'structure' and shape.is_document_type:
+ return self._validate_document
+
+ def _validate(self, params, shape, errors, name):
+ special_validator = self._check_special_validation_cases(shape)
+ if special_validator:
+ special_validator(params, shape, errors, name)
+ else:
+ getattr(self, f'_validate_{shape.type_name}')(
+ params, shape, errors, name
+ )
+
+ def _validate_jsonvalue_string(self, params, shape, errors, name):
+ # Check to see if a value marked as a jsonvalue can be dumped to
+ # a json string.
+ try:
+ json.dumps(params)
+ except (ValueError, TypeError) as e:
+ errors.report(name, 'unable to encode to json', type_error=e)
+
+ def _validate_document(self, params, shape, errors, name):
+ if params is None:
+ return
+
+ if isinstance(params, dict):
+ for key in params:
+ self._validate_document(params[key], shape, errors, key)
+ elif isinstance(params, list):
+ for index, entity in enumerate(params):
+ self._validate_document(
+ entity, shape, errors, '%s[%d]' % (name, index)
+ )
+ elif not isinstance(params, ((str,), int, bool, float)):
+ valid_types = (str, int, bool, float, list, dict)
+ valid_type_names = [str(t) for t in valid_types]
+ errors.report(
+ name,
+ 'invalid type for document',
+ param=params,
+ param_type=type(params),
+ valid_types=valid_type_names,
+ )
+
+ @type_check(valid_types=(dict,))
+ def _validate_structure(self, params, shape, errors, name):
+ if shape.is_tagged_union:
+ if len(params) == 0:
+ errors.report(name, 'empty input', members=shape.members)
+ elif len(params) > 1:
+ errors.report(
+ name, 'more than one input', members=shape.members
+ )
+
+ # Validate required fields.
+ for required_member in shape.metadata.get('required', []):
+ if required_member not in params:
+ errors.report(
+ name,
+ 'missing required field',
+ required_name=required_member,
+ user_params=params,
+ )
+ members = shape.members
+ known_params = []
+ # Validate known params.
+ for param in params:
+ if param not in members:
+ errors.report(
+ name,
+ 'unknown field',
+ unknown_param=param,
+ valid_names=list(members),
+ )
+ else:
+ known_params.append(param)
+ # Validate structure members.
+ for param in known_params:
+ self._validate(
+ params[param],
+ shape.members[param],
+ errors,
+ f'{name}.{param}',
+ )
+
+ @type_check(valid_types=(str,))
+ def _validate_string(self, param, shape, errors, name):
+ # Validate range. For a string, the min/max constraints
+ # are of the string length.
+ # Looks like:
+ # "WorkflowId":{
+ # "type":"string",
+ # "min":1,
+ # "max":256
+ # }
+ range_check(name, len(param), shape, 'invalid length', errors)
+
+ @type_check(valid_types=(list, tuple))
+ def _validate_list(self, param, shape, errors, name):
+ member_shape = shape.member
+ range_check(name, len(param), shape, 'invalid length', errors)
+ for i, item in enumerate(param):
+ self._validate(item, member_shape, errors, f'{name}[{i}]')
+
+ @type_check(valid_types=(dict,))
+ def _validate_map(self, param, shape, errors, name):
+ key_shape = shape.key
+ value_shape = shape.value
+ for key, value in param.items():
+ self._validate(key, key_shape, errors, f"{name} (key: {key})")
+ self._validate(value, value_shape, errors, f'{name}.{key}')
+
+ @type_check(valid_types=(int,))
+ def _validate_integer(self, param, shape, errors, name):
+ range_check(name, param, shape, 'invalid range', errors)
+
+ def _validate_blob(self, param, shape, errors, name):
+ if isinstance(param, (bytes, bytearray, str)):
+ return
+ elif hasattr(param, 'read'):
+ # File like objects are also allowed for blob types.
+ return
+ else:
+ errors.report(
+ name,
+ 'invalid type',
+ param=param,
+ valid_types=[str(bytes), str(bytearray), 'file-like object'],
+ )
+
+ @type_check(valid_types=(bool,))
+ def _validate_boolean(self, param, shape, errors, name):
+ pass
+
+ @type_check(valid_types=(float, decimal.Decimal) + (int,))
+ def _validate_double(self, param, shape, errors, name):
+ range_check(name, param, shape, 'invalid range', errors)
+
+ _validate_float = _validate_double
+
+ @type_check(valid_types=(int,))
+ def _validate_long(self, param, shape, errors, name):
+ range_check(name, param, shape, 'invalid range', errors)
+
+ def _validate_timestamp(self, param, shape, errors, name):
+ # We don't use @type_check because datetimes are a bit
+ # more flexible. You can either provide a datetime
+ # object, or a string that parses to a datetime.
+ is_valid_type = self._type_check_datetime(param)
+ if not is_valid_type:
+ valid_type_names = [str(datetime), 'timestamp-string']
+ errors.report(
+ name, 'invalid type', param=param, valid_types=valid_type_names
+ )
+
+ def _type_check_datetime(self, value):
+ try:
+ parse_to_aware_datetime(value)
+ return True
+ except (TypeError, ValueError, AttributeError):
+ # Yes, dateutil can sometimes raise an AttributeError
+ # when parsing timestamps.
+ return False
+
+
+class ParamValidationDecorator:
+ def __init__(self, param_validator, serializer):
+ self._param_validator = param_validator
+ self._serializer = serializer
+
+ def serialize_to_request(self, parameters, operation_model):
+ input_shape = operation_model.input_shape
+ if input_shape is not None:
+ report = self._param_validator.validate(
+ parameters, operation_model.input_shape
+ )
+ if report.has_errors():
+ raise ParamValidationError(report=report.generate_report())
+ return self._serializer.serialize_to_request(
+ parameters, operation_model
+ )
diff --git a/.venv/lib/python3.12/site-packages/botocore/vendored/__init__.py b/.venv/lib/python3.12/site-packages/botocore/vendored/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/vendored/__init__.py
diff --git a/.venv/lib/python3.12/site-packages/botocore/vendored/requests/__init__.py b/.venv/lib/python3.12/site-packages/botocore/vendored/requests/__init__.py
new file mode 100644
index 00000000..0ada6e0f
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/vendored/requests/__init__.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+
+# __
+# /__) _ _ _ _ _/ _
+# / ( (- (/ (/ (- _) / _)
+# /
+from .exceptions import (
+ RequestException, Timeout, URLRequired,
+ TooManyRedirects, HTTPError, ConnectionError
+)
diff --git a/.venv/lib/python3.12/site-packages/botocore/vendored/requests/exceptions.py b/.venv/lib/python3.12/site-packages/botocore/vendored/requests/exceptions.py
new file mode 100644
index 00000000..89135a80
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/vendored/requests/exceptions.py
@@ -0,0 +1,99 @@
+# -*- coding: utf-8 -*-
+
+"""
+requests.exceptions
+~~~~~~~~~~~~~~~~~~~
+
+This module contains the set of Requests' exceptions.
+
+"""
+from .packages.urllib3.exceptions import HTTPError as BaseHTTPError
+
+
+class RequestException(IOError):
+ """There was an ambiguous exception that occurred while handling your
+ request."""
+
+ def __init__(self, *args, **kwargs):
+ """
+ Initialize RequestException with `request` and `response` objects.
+ """
+ response = kwargs.pop('response', None)
+ self.response = response
+ self.request = kwargs.pop('request', None)
+ if (response is not None and not self.request and
+ hasattr(response, 'request')):
+ self.request = self.response.request
+ super(RequestException, self).__init__(*args, **kwargs)
+
+
+class HTTPError(RequestException):
+ """An HTTP error occurred."""
+
+
+class ConnectionError(RequestException):
+ """A Connection error occurred."""
+
+
+class ProxyError(ConnectionError):
+ """A proxy error occurred."""
+
+
+class SSLError(ConnectionError):
+ """An SSL error occurred."""
+
+
+class Timeout(RequestException):
+ """The request timed out.
+
+ Catching this error will catch both
+ :exc:`~requests.exceptions.ConnectTimeout` and
+ :exc:`~requests.exceptions.ReadTimeout` errors.
+ """
+
+
+class ConnectTimeout(ConnectionError, Timeout):
+ """The request timed out while trying to connect to the remote server.
+
+ Requests that produced this error are safe to retry.
+ """
+
+
+class ReadTimeout(Timeout):
+ """The server did not send any data in the allotted amount of time."""
+
+
+class URLRequired(RequestException):
+ """A valid URL is required to make a request."""
+
+
+class TooManyRedirects(RequestException):
+ """Too many redirects."""
+
+
+class MissingSchema(RequestException, ValueError):
+ """The URL schema (e.g. http or https) is missing."""
+
+
+class InvalidSchema(RequestException, ValueError):
+ """See defaults.py for valid schemas."""
+
+
+class InvalidURL(RequestException, ValueError):
+ """ The URL provided was somehow invalid. """
+
+
+class ChunkedEncodingError(RequestException):
+ """The server declared chunked encoding but sent an invalid chunk."""
+
+
+class ContentDecodingError(RequestException, BaseHTTPError):
+ """Failed to decode response content"""
+
+
+class StreamConsumedError(RequestException, TypeError):
+ """The content for this response was already consumed"""
+
+
+class RetryError(RequestException):
+ """Custom retries logic failed"""
diff --git a/.venv/lib/python3.12/site-packages/botocore/vendored/requests/packages/__init__.py b/.venv/lib/python3.12/site-packages/botocore/vendored/requests/packages/__init__.py
new file mode 100644
index 00000000..d62c4b71
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/vendored/requests/packages/__init__.py
@@ -0,0 +1,3 @@
+from __future__ import absolute_import
+
+from . import urllib3
diff --git a/.venv/lib/python3.12/site-packages/botocore/vendored/requests/packages/urllib3/__init__.py b/.venv/lib/python3.12/site-packages/botocore/vendored/requests/packages/urllib3/__init__.py
new file mode 100644
index 00000000..88697016
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/vendored/requests/packages/urllib3/__init__.py
@@ -0,0 +1,10 @@
+"""
+urllib3 - Thread-safe connection pooling and re-using.
+"""
+
+__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)'
+__license__ = 'MIT'
+__version__ = ''
+
+
+from . import exceptions
diff --git a/.venv/lib/python3.12/site-packages/botocore/vendored/requests/packages/urllib3/exceptions.py b/.venv/lib/python3.12/site-packages/botocore/vendored/requests/packages/urllib3/exceptions.py
new file mode 100644
index 00000000..31bda1c0
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/vendored/requests/packages/urllib3/exceptions.py
@@ -0,0 +1,169 @@
+
+## Base Exceptions
+
+class HTTPError(Exception):
+ "Base exception used by this module."
+ pass
+
+class HTTPWarning(Warning):
+ "Base warning used by this module."
+ pass
+
+
+
+class PoolError(HTTPError):
+ "Base exception for errors caused within a pool."
+ def __init__(self, pool, message):
+ self.pool = pool
+ HTTPError.__init__(self, "%s: %s" % (pool, message))
+
+ def __reduce__(self):
+ # For pickling purposes.
+ return self.__class__, (None, None)
+
+
+class RequestError(PoolError):
+ "Base exception for PoolErrors that have associated URLs."
+ def __init__(self, pool, url, message):
+ self.url = url
+ PoolError.__init__(self, pool, message)
+
+ def __reduce__(self):
+ # For pickling purposes.
+ return self.__class__, (None, self.url, None)
+
+
+class SSLError(HTTPError):
+ "Raised when SSL certificate fails in an HTTPS connection."
+ pass
+
+
+class ProxyError(HTTPError):
+ "Raised when the connection to a proxy fails."
+ pass
+
+
+class DecodeError(HTTPError):
+ "Raised when automatic decoding based on Content-Type fails."
+ pass
+
+
+class ProtocolError(HTTPError):
+ "Raised when something unexpected happens mid-request/response."
+ pass
+
+
+#: Renamed to ProtocolError but aliased for backwards compatibility.
+ConnectionError = ProtocolError
+
+
+## Leaf Exceptions
+
+class MaxRetryError(RequestError):
+ """Raised when the maximum number of retries is exceeded.
+
+ :param pool: The connection pool
+ :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool`
+ :param string url: The requested Url
+ :param exceptions.Exception reason: The underlying error
+
+ """
+
+ def __init__(self, pool, url, reason=None):
+ self.reason = reason
+
+ message = "Max retries exceeded with url: %s (Caused by %r)" % (
+ url, reason)
+
+ RequestError.__init__(self, pool, url, message)
+
+
+class HostChangedError(RequestError):
+ "Raised when an existing pool gets a request for a foreign host."
+
+ def __init__(self, pool, url, retries=3):
+ message = "Tried to open a foreign host with url: %s" % url
+ RequestError.__init__(self, pool, url, message)
+ self.retries = retries
+
+
+class TimeoutStateError(HTTPError):
+ """ Raised when passing an invalid state to a timeout """
+ pass
+
+
+class TimeoutError(HTTPError):
+ """ Raised when a socket timeout error occurs.
+
+ Catching this error will catch both :exc:`ReadTimeoutErrors
+ <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`.
+ """
+ pass
+
+
+class ReadTimeoutError(TimeoutError, RequestError):
+ "Raised when a socket timeout occurs while receiving data from a server"
+ pass
+
+
+# This timeout error does not have a URL attached and needs to inherit from the
+# base HTTPError
+class ConnectTimeoutError(TimeoutError):
+ "Raised when a socket timeout occurs while connecting to a server"
+ pass
+
+
+class EmptyPoolError(PoolError):
+ "Raised when a pool runs out of connections and no more are allowed."
+ pass
+
+
+class ClosedPoolError(PoolError):
+ "Raised when a request enters a pool after the pool has been closed."
+ pass
+
+
+class LocationValueError(ValueError, HTTPError):
+ "Raised when there is something wrong with a given URL input."
+ pass
+
+
+class LocationParseError(LocationValueError):
+ "Raised when get_host or similar fails to parse the URL input."
+
+ def __init__(self, location):
+ message = "Failed to parse: %s" % location
+ HTTPError.__init__(self, message)
+
+ self.location = location
+
+
+class ResponseError(HTTPError):
+ "Used as a container for an error reason supplied in a MaxRetryError."
+ GENERIC_ERROR = 'too many error responses'
+ SPECIFIC_ERROR = 'too many {status_code} error responses'
+
+
+class SecurityWarning(HTTPWarning):
+ "Warned when perfoming security reducing actions"
+ pass
+
+
+class InsecureRequestWarning(SecurityWarning):
+ "Warned when making an unverified HTTPS request."
+ pass
+
+
+class SystemTimeWarning(SecurityWarning):
+ "Warned when system time is suspected to be wrong"
+ pass
+
+
+class InsecurePlatformWarning(SecurityWarning):
+ "Warned when certain SSL configuration is not available on a platform."
+ pass
+
+
+class ResponseNotChunked(ProtocolError, ValueError):
+ "Response needs to be chunked in order to read it as chunks."
+ pass
diff --git a/.venv/lib/python3.12/site-packages/botocore/vendored/six.py b/.venv/lib/python3.12/site-packages/botocore/vendored/six.py
new file mode 100644
index 00000000..4e15675d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/vendored/six.py
@@ -0,0 +1,998 @@
+# Copyright (c) 2010-2020 Benjamin Peterson
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+"""Utilities for writing code that runs on Python 2 and 3"""
+
+from __future__ import absolute_import
+
+import functools
+import itertools
+import operator
+import sys
+import types
+
+__author__ = "Benjamin Peterson <benjamin@python.org>"
+__version__ = "1.16.0"
+
+
+# Useful for very coarse version differentiation.
+PY2 = sys.version_info[0] == 2
+PY3 = sys.version_info[0] == 3
+PY34 = sys.version_info[0:2] >= (3, 4)
+
+if PY3:
+ string_types = str,
+ integer_types = int,
+ class_types = type,
+ text_type = str
+ binary_type = bytes
+
+ MAXSIZE = sys.maxsize
+else:
+ string_types = basestring,
+ integer_types = (int, long)
+ class_types = (type, types.ClassType)
+ text_type = unicode
+ binary_type = str
+
+ if sys.platform.startswith("java"):
+ # Jython always uses 32 bits.
+ MAXSIZE = int((1 << 31) - 1)
+ else:
+ # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
+ class X(object):
+
+ def __len__(self):
+ return 1 << 31
+ try:
+ len(X())
+ except OverflowError:
+ # 32-bit
+ MAXSIZE = int((1 << 31) - 1)
+ else:
+ # 64-bit
+ MAXSIZE = int((1 << 63) - 1)
+ del X
+
+if PY34:
+ from importlib.util import spec_from_loader
+else:
+ spec_from_loader = None
+
+
+def _add_doc(func, doc):
+ """Add documentation to a function."""
+ func.__doc__ = doc
+
+
+def _import_module(name):
+ """Import module, returning the module after the last dot."""
+ __import__(name)
+ return sys.modules[name]
+
+
+class _LazyDescr(object):
+
+ def __init__(self, name):
+ self.name = name
+
+ def __get__(self, obj, tp):
+ result = self._resolve()
+ setattr(obj, self.name, result) # Invokes __set__.
+ try:
+ # This is a bit ugly, but it avoids running this again by
+ # removing this descriptor.
+ delattr(obj.__class__, self.name)
+ except AttributeError:
+ pass
+ return result
+
+
+class MovedModule(_LazyDescr):
+
+ def __init__(self, name, old, new=None):
+ super(MovedModule, self).__init__(name)
+ if PY3:
+ if new is None:
+ new = name
+ self.mod = new
+ else:
+ self.mod = old
+
+ def _resolve(self):
+ return _import_module(self.mod)
+
+ def __getattr__(self, attr):
+ _module = self._resolve()
+ value = getattr(_module, attr)
+ setattr(self, attr, value)
+ return value
+
+
+class _LazyModule(types.ModuleType):
+
+ def __init__(self, name):
+ super(_LazyModule, self).__init__(name)
+ self.__doc__ = self.__class__.__doc__
+
+ def __dir__(self):
+ attrs = ["__doc__", "__name__"]
+ attrs += [attr.name for attr in self._moved_attributes]
+ return attrs
+
+ # Subclasses should override this
+ _moved_attributes = []
+
+
+class MovedAttribute(_LazyDescr):
+
+ def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
+ super(MovedAttribute, self).__init__(name)
+ if PY3:
+ if new_mod is None:
+ new_mod = name
+ self.mod = new_mod
+ if new_attr is None:
+ if old_attr is None:
+ new_attr = name
+ else:
+ new_attr = old_attr
+ self.attr = new_attr
+ else:
+ self.mod = old_mod
+ if old_attr is None:
+ old_attr = name
+ self.attr = old_attr
+
+ def _resolve(self):
+ module = _import_module(self.mod)
+ return getattr(module, self.attr)
+
+
+class _SixMetaPathImporter(object):
+
+ """
+ A meta path importer to import six.moves and its submodules.
+
+ This class implements a PEP302 finder and loader. It should be compatible
+ with Python 2.5 and all existing versions of Python3
+ """
+
+ def __init__(self, six_module_name):
+ self.name = six_module_name
+ self.known_modules = {}
+
+ def _add_module(self, mod, *fullnames):
+ for fullname in fullnames:
+ self.known_modules[self.name + "." + fullname] = mod
+
+ def _get_module(self, fullname):
+ return self.known_modules[self.name + "." + fullname]
+
+ def find_module(self, fullname, path=None):
+ if fullname in self.known_modules:
+ return self
+ return None
+
+ def find_spec(self, fullname, path, target=None):
+ if fullname in self.known_modules:
+ return spec_from_loader(fullname, self)
+ return None
+
+ def __get_module(self, fullname):
+ try:
+ return self.known_modules[fullname]
+ except KeyError:
+ raise ImportError("This loader does not know module " + fullname)
+
+ def load_module(self, fullname):
+ try:
+ # in case of a reload
+ return sys.modules[fullname]
+ except KeyError:
+ pass
+ mod = self.__get_module(fullname)
+ if isinstance(mod, MovedModule):
+ mod = mod._resolve()
+ else:
+ mod.__loader__ = self
+ sys.modules[fullname] = mod
+ return mod
+
+ def is_package(self, fullname):
+ """
+ Return true, if the named module is a package.
+
+ We need this method to get correct spec objects with
+ Python 3.4 (see PEP451)
+ """
+ return hasattr(self.__get_module(fullname), "__path__")
+
+ def get_code(self, fullname):
+ """Return None
+
+ Required, if is_package is implemented"""
+ self.__get_module(fullname) # eventually raises ImportError
+ return None
+ get_source = get_code # same as get_code
+
+ def create_module(self, spec):
+ return self.load_module(spec.name)
+
+ def exec_module(self, module):
+ pass
+
+_importer = _SixMetaPathImporter(__name__)
+
+
+class _MovedItems(_LazyModule):
+
+ """Lazy loading of moved objects"""
+ __path__ = [] # mark as package
+
+
+_moved_attributes = [
+ MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
+ MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
+ MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"),
+ MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
+ MovedAttribute("intern", "__builtin__", "sys"),
+ MovedAttribute("map", "itertools", "builtins", "imap", "map"),
+ MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"),
+ MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"),
+ MovedAttribute("getoutput", "commands", "subprocess"),
+ MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
+ MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"),
+ MovedAttribute("reduce", "__builtin__", "functools"),
+ MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
+ MovedAttribute("StringIO", "StringIO", "io"),
+ MovedAttribute("UserDict", "UserDict", "collections"),
+ MovedAttribute("UserList", "UserList", "collections"),
+ MovedAttribute("UserString", "UserString", "collections"),
+ MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
+ MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
+ MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),
+ MovedModule("builtins", "__builtin__"),
+ MovedModule("configparser", "ConfigParser"),
+ MovedModule("collections_abc", "collections", "collections.abc" if sys.version_info >= (3, 3) else "collections"),
+ MovedModule("copyreg", "copy_reg"),
+ MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
+ MovedModule("dbm_ndbm", "dbm", "dbm.ndbm"),
+ MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread" if sys.version_info < (3, 9) else "_thread"),
+ MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
+ MovedModule("http_cookies", "Cookie", "http.cookies"),
+ MovedModule("html_entities", "htmlentitydefs", "html.entities"),
+ MovedModule("html_parser", "HTMLParser", "html.parser"),
+ MovedModule("http_client", "httplib", "http.client"),
+ MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
+ MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"),
+ MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
+ MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
+ MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
+ MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
+ MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
+ MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
+ MovedModule("cPickle", "cPickle", "pickle"),
+ MovedModule("queue", "Queue"),
+ MovedModule("reprlib", "repr"),
+ MovedModule("socketserver", "SocketServer"),
+ MovedModule("_thread", "thread", "_thread"),
+ MovedModule("tkinter", "Tkinter"),
+ MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
+ MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
+ MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
+ MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
+ MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
+ MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"),
+ MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
+ MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
+ MovedModule("tkinter_colorchooser", "tkColorChooser",
+ "tkinter.colorchooser"),
+ MovedModule("tkinter_commondialog", "tkCommonDialog",
+ "tkinter.commondialog"),
+ MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
+ MovedModule("tkinter_font", "tkFont", "tkinter.font"),
+ MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
+ MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
+ "tkinter.simpledialog"),
+ MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"),
+ MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"),
+ MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"),
+ MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
+ MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
+ MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
+]
+# Add windows specific modules.
+if sys.platform == "win32":
+ _moved_attributes += [
+ MovedModule("winreg", "_winreg"),
+ ]
+
+for attr in _moved_attributes:
+ setattr(_MovedItems, attr.name, attr)
+ if isinstance(attr, MovedModule):
+ _importer._add_module(attr, "moves." + attr.name)
+del attr
+
+_MovedItems._moved_attributes = _moved_attributes
+
+moves = _MovedItems(__name__ + ".moves")
+_importer._add_module(moves, "moves")
+
+
+class Module_six_moves_urllib_parse(_LazyModule):
+
+ """Lazy loading of moved objects in six.moves.urllib_parse"""
+
+
+_urllib_parse_moved_attributes = [
+ MovedAttribute("ParseResult", "urlparse", "urllib.parse"),
+ MovedAttribute("SplitResult", "urlparse", "urllib.parse"),
+ MovedAttribute("parse_qs", "urlparse", "urllib.parse"),
+ MovedAttribute("parse_qsl", "urlparse", "urllib.parse"),
+ MovedAttribute("urldefrag", "urlparse", "urllib.parse"),
+ MovedAttribute("urljoin", "urlparse", "urllib.parse"),
+ MovedAttribute("urlparse", "urlparse", "urllib.parse"),
+ MovedAttribute("urlsplit", "urlparse", "urllib.parse"),
+ MovedAttribute("urlunparse", "urlparse", "urllib.parse"),
+ MovedAttribute("urlunsplit", "urlparse", "urllib.parse"),
+ MovedAttribute("quote", "urllib", "urllib.parse"),
+ MovedAttribute("quote_plus", "urllib", "urllib.parse"),
+ MovedAttribute("unquote", "urllib", "urllib.parse"),
+ MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
+ MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"),
+ MovedAttribute("urlencode", "urllib", "urllib.parse"),
+ MovedAttribute("splitquery", "urllib", "urllib.parse"),
+ MovedAttribute("splittag", "urllib", "urllib.parse"),
+ MovedAttribute("splituser", "urllib", "urllib.parse"),
+ MovedAttribute("splitvalue", "urllib", "urllib.parse"),
+ MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
+ MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
+ MovedAttribute("uses_params", "urlparse", "urllib.parse"),
+ MovedAttribute("uses_query", "urlparse", "urllib.parse"),
+ MovedAttribute("uses_relative", "urlparse", "urllib.parse"),
+]
+for attr in _urllib_parse_moved_attributes:
+ setattr(Module_six_moves_urllib_parse, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"),
+ "moves.urllib_parse", "moves.urllib.parse")
+
+
+class Module_six_moves_urllib_error(_LazyModule):
+
+ """Lazy loading of moved objects in six.moves.urllib_error"""
+
+
+_urllib_error_moved_attributes = [
+ MovedAttribute("URLError", "urllib2", "urllib.error"),
+ MovedAttribute("HTTPError", "urllib2", "urllib.error"),
+ MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
+]
+for attr in _urllib_error_moved_attributes:
+ setattr(Module_six_moves_urllib_error, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"),
+ "moves.urllib_error", "moves.urllib.error")
+
+
+class Module_six_moves_urllib_request(_LazyModule):
+
+ """Lazy loading of moved objects in six.moves.urllib_request"""
+
+
+_urllib_request_moved_attributes = [
+ MovedAttribute("urlopen", "urllib2", "urllib.request"),
+ MovedAttribute("install_opener", "urllib2", "urllib.request"),
+ MovedAttribute("build_opener", "urllib2", "urllib.request"),
+ MovedAttribute("pathname2url", "urllib", "urllib.request"),
+ MovedAttribute("url2pathname", "urllib", "urllib.request"),
+ MovedAttribute("getproxies", "urllib", "urllib.request"),
+ MovedAttribute("Request", "urllib2", "urllib.request"),
+ MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
+ MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
+ MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
+ MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
+ MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
+ MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
+ MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
+ MovedAttribute("FileHandler", "urllib2", "urllib.request"),
+ MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
+ MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
+ MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
+ MovedAttribute("urlretrieve", "urllib", "urllib.request"),
+ MovedAttribute("urlcleanup", "urllib", "urllib.request"),
+ MovedAttribute("URLopener", "urllib", "urllib.request"),
+ MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
+ MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
+ MovedAttribute("parse_http_list", "urllib2", "urllib.request"),
+ MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"),
+]
+for attr in _urllib_request_moved_attributes:
+ setattr(Module_six_moves_urllib_request, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"),
+ "moves.urllib_request", "moves.urllib.request")
+
+
+class Module_six_moves_urllib_response(_LazyModule):
+
+ """Lazy loading of moved objects in six.moves.urllib_response"""
+
+
+_urllib_response_moved_attributes = [
+ MovedAttribute("addbase", "urllib", "urllib.response"),
+ MovedAttribute("addclosehook", "urllib", "urllib.response"),
+ MovedAttribute("addinfo", "urllib", "urllib.response"),
+ MovedAttribute("addinfourl", "urllib", "urllib.response"),
+]
+for attr in _urllib_response_moved_attributes:
+ setattr(Module_six_moves_urllib_response, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"),
+ "moves.urllib_response", "moves.urllib.response")
+
+
+class Module_six_moves_urllib_robotparser(_LazyModule):
+
+ """Lazy loading of moved objects in six.moves.urllib_robotparser"""
+
+
+_urllib_robotparser_moved_attributes = [
+ MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
+]
+for attr in _urllib_robotparser_moved_attributes:
+ setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"),
+ "moves.urllib_robotparser", "moves.urllib.robotparser")
+
+
+class Module_six_moves_urllib(types.ModuleType):
+
+ """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
+ __path__ = [] # mark as package
+ parse = _importer._get_module("moves.urllib_parse")
+ error = _importer._get_module("moves.urllib_error")
+ request = _importer._get_module("moves.urllib_request")
+ response = _importer._get_module("moves.urllib_response")
+ robotparser = _importer._get_module("moves.urllib_robotparser")
+
+ def __dir__(self):
+ return ['parse', 'error', 'request', 'response', 'robotparser']
+
+_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"),
+ "moves.urllib")
+
+
+def add_move(move):
+ """Add an item to six.moves."""
+ setattr(_MovedItems, move.name, move)
+
+
+def remove_move(name):
+ """Remove item from six.moves."""
+ try:
+ delattr(_MovedItems, name)
+ except AttributeError:
+ try:
+ del moves.__dict__[name]
+ except KeyError:
+ raise AttributeError("no such move, %r" % (name,))
+
+
+if PY3:
+ _meth_func = "__func__"
+ _meth_self = "__self__"
+
+ _func_closure = "__closure__"
+ _func_code = "__code__"
+ _func_defaults = "__defaults__"
+ _func_globals = "__globals__"
+else:
+ _meth_func = "im_func"
+ _meth_self = "im_self"
+
+ _func_closure = "func_closure"
+ _func_code = "func_code"
+ _func_defaults = "func_defaults"
+ _func_globals = "func_globals"
+
+
+try:
+ advance_iterator = next
+except NameError:
+ def advance_iterator(it):
+ return it.next()
+next = advance_iterator
+
+
+try:
+ callable = callable
+except NameError:
+ def callable(obj):
+ return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
+
+
+if PY3:
+ def get_unbound_function(unbound):
+ return unbound
+
+ create_bound_method = types.MethodType
+
+ def create_unbound_method(func, cls):
+ return func
+
+ Iterator = object
+else:
+ def get_unbound_function(unbound):
+ return unbound.im_func
+
+ def create_bound_method(func, obj):
+ return types.MethodType(func, obj, obj.__class__)
+
+ def create_unbound_method(func, cls):
+ return types.MethodType(func, None, cls)
+
+ class Iterator(object):
+
+ def next(self):
+ return type(self).__next__(self)
+
+ callable = callable
+_add_doc(get_unbound_function,
+ """Get the function out of a possibly unbound function""")
+
+
+get_method_function = operator.attrgetter(_meth_func)
+get_method_self = operator.attrgetter(_meth_self)
+get_function_closure = operator.attrgetter(_func_closure)
+get_function_code = operator.attrgetter(_func_code)
+get_function_defaults = operator.attrgetter(_func_defaults)
+get_function_globals = operator.attrgetter(_func_globals)
+
+
+if PY3:
+ def iterkeys(d, **kw):
+ return iter(d.keys(**kw))
+
+ def itervalues(d, **kw):
+ return iter(d.values(**kw))
+
+ def iteritems(d, **kw):
+ return iter(d.items(**kw))
+
+ def iterlists(d, **kw):
+ return iter(d.lists(**kw))
+
+ viewkeys = operator.methodcaller("keys")
+
+ viewvalues = operator.methodcaller("values")
+
+ viewitems = operator.methodcaller("items")
+else:
+ def iterkeys(d, **kw):
+ return d.iterkeys(**kw)
+
+ def itervalues(d, **kw):
+ return d.itervalues(**kw)
+
+ def iteritems(d, **kw):
+ return d.iteritems(**kw)
+
+ def iterlists(d, **kw):
+ return d.iterlists(**kw)
+
+ viewkeys = operator.methodcaller("viewkeys")
+
+ viewvalues = operator.methodcaller("viewvalues")
+
+ viewitems = operator.methodcaller("viewitems")
+
+_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
+_add_doc(itervalues, "Return an iterator over the values of a dictionary.")
+_add_doc(iteritems,
+ "Return an iterator over the (key, value) pairs of a dictionary.")
+_add_doc(iterlists,
+ "Return an iterator over the (key, [values]) pairs of a dictionary.")
+
+
+if PY3:
+ def b(s):
+ return s.encode("latin-1")
+
+ def u(s):
+ return s
+ unichr = chr
+ import struct
+ int2byte = struct.Struct(">B").pack
+ del struct
+ byte2int = operator.itemgetter(0)
+ indexbytes = operator.getitem
+ iterbytes = iter
+ import io
+ StringIO = io.StringIO
+ BytesIO = io.BytesIO
+ del io
+ _assertCountEqual = "assertCountEqual"
+ if sys.version_info[1] <= 1:
+ _assertRaisesRegex = "assertRaisesRegexp"
+ _assertRegex = "assertRegexpMatches"
+ _assertNotRegex = "assertNotRegexpMatches"
+ else:
+ _assertRaisesRegex = "assertRaisesRegex"
+ _assertRegex = "assertRegex"
+ _assertNotRegex = "assertNotRegex"
+else:
+ def b(s):
+ return s
+ # Workaround for standalone backslash
+
+ def u(s):
+ return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
+ unichr = unichr
+ int2byte = chr
+
+ def byte2int(bs):
+ return ord(bs[0])
+
+ def indexbytes(buf, i):
+ return ord(buf[i])
+ iterbytes = functools.partial(itertools.imap, ord)
+ import StringIO
+ StringIO = BytesIO = StringIO.StringIO
+ _assertCountEqual = "assertItemsEqual"
+ _assertRaisesRegex = "assertRaisesRegexp"
+ _assertRegex = "assertRegexpMatches"
+ _assertNotRegex = "assertNotRegexpMatches"
+_add_doc(b, """Byte literal""")
+_add_doc(u, """Text literal""")
+
+
+def assertCountEqual(self, *args, **kwargs):
+ return getattr(self, _assertCountEqual)(*args, **kwargs)
+
+
+def assertRaisesRegex(self, *args, **kwargs):
+ return getattr(self, _assertRaisesRegex)(*args, **kwargs)
+
+
+def assertRegex(self, *args, **kwargs):
+ return getattr(self, _assertRegex)(*args, **kwargs)
+
+
+def assertNotRegex(self, *args, **kwargs):
+ return getattr(self, _assertNotRegex)(*args, **kwargs)
+
+
+if PY3:
+ exec_ = getattr(moves.builtins, "exec")
+
+ def reraise(tp, value, tb=None):
+ try:
+ if value is None:
+ value = tp()
+ if value.__traceback__ is not tb:
+ raise value.with_traceback(tb)
+ raise value
+ finally:
+ value = None
+ tb = None
+
+else:
+ def exec_(_code_, _globs_=None, _locs_=None):
+ """Execute code in a namespace."""
+ if _globs_ is None:
+ frame = sys._getframe(1)
+ _globs_ = frame.f_globals
+ if _locs_ is None:
+ _locs_ = frame.f_locals
+ del frame
+ elif _locs_ is None:
+ _locs_ = _globs_
+ exec("""exec _code_ in _globs_, _locs_""")
+
+ exec_("""def reraise(tp, value, tb=None):
+ try:
+ raise tp, value, tb
+ finally:
+ tb = None
+""")
+
+
+if sys.version_info[:2] > (3,):
+ exec_("""def raise_from(value, from_value):
+ try:
+ raise value from from_value
+ finally:
+ value = None
+""")
+else:
+ def raise_from(value, from_value):
+ raise value
+
+
+print_ = getattr(moves.builtins, "print", None)
+if print_ is None:
+ def print_(*args, **kwargs):
+ """The new-style print function for Python 2.4 and 2.5."""
+ fp = kwargs.pop("file", sys.stdout)
+ if fp is None:
+ return
+
+ def write(data):
+ if not isinstance(data, basestring):
+ data = str(data)
+ # If the file has an encoding, encode unicode with it.
+ if (isinstance(fp, file) and
+ isinstance(data, unicode) and
+ fp.encoding is not None):
+ errors = getattr(fp, "errors", None)
+ if errors is None:
+ errors = "strict"
+ data = data.encode(fp.encoding, errors)
+ fp.write(data)
+ want_unicode = False
+ sep = kwargs.pop("sep", None)
+ if sep is not None:
+ if isinstance(sep, unicode):
+ want_unicode = True
+ elif not isinstance(sep, str):
+ raise TypeError("sep must be None or a string")
+ end = kwargs.pop("end", None)
+ if end is not None:
+ if isinstance(end, unicode):
+ want_unicode = True
+ elif not isinstance(end, str):
+ raise TypeError("end must be None or a string")
+ if kwargs:
+ raise TypeError("invalid keyword arguments to print()")
+ if not want_unicode:
+ for arg in args:
+ if isinstance(arg, unicode):
+ want_unicode = True
+ break
+ if want_unicode:
+ newline = unicode("\n")
+ space = unicode(" ")
+ else:
+ newline = "\n"
+ space = " "
+ if sep is None:
+ sep = space
+ if end is None:
+ end = newline
+ for i, arg in enumerate(args):
+ if i:
+ write(sep)
+ write(arg)
+ write(end)
+if sys.version_info[:2] < (3, 3):
+ _print = print_
+
+ def print_(*args, **kwargs):
+ fp = kwargs.get("file", sys.stdout)
+ flush = kwargs.pop("flush", False)
+ _print(*args, **kwargs)
+ if flush and fp is not None:
+ fp.flush()
+
+_add_doc(reraise, """Reraise an exception.""")
+
+if sys.version_info[0:2] < (3, 4):
+ # This does exactly the same what the :func:`py3:functools.update_wrapper`
+ # function does on Python versions after 3.2. It sets the ``__wrapped__``
+ # attribute on ``wrapper`` object and it doesn't raise an error if any of
+ # the attributes mentioned in ``assigned`` and ``updated`` are missing on
+ # ``wrapped`` object.
+ def _update_wrapper(wrapper, wrapped,
+ assigned=functools.WRAPPER_ASSIGNMENTS,
+ updated=functools.WRAPPER_UPDATES):
+ for attr in assigned:
+ try:
+ value = getattr(wrapped, attr)
+ except AttributeError:
+ continue
+ else:
+ setattr(wrapper, attr, value)
+ for attr in updated:
+ getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
+ wrapper.__wrapped__ = wrapped
+ return wrapper
+ _update_wrapper.__doc__ = functools.update_wrapper.__doc__
+
+ def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
+ updated=functools.WRAPPER_UPDATES):
+ return functools.partial(_update_wrapper, wrapped=wrapped,
+ assigned=assigned, updated=updated)
+ wraps.__doc__ = functools.wraps.__doc__
+
+else:
+ wraps = functools.wraps
+
+
+def with_metaclass(meta, *bases):
+ """Create a base class with a metaclass."""
+ # This requires a bit of explanation: the basic idea is to make a dummy
+ # metaclass for one level of class instantiation that replaces itself with
+ # the actual metaclass.
+ class metaclass(type):
+
+ def __new__(cls, name, this_bases, d):
+ if sys.version_info[:2] >= (3, 7):
+ # This version introduced PEP 560 that requires a bit
+ # of extra care (we mimic what is done by __build_class__).
+ resolved_bases = types.resolve_bases(bases)
+ if resolved_bases is not bases:
+ d['__orig_bases__'] = bases
+ else:
+ resolved_bases = bases
+ return meta(name, resolved_bases, d)
+
+ @classmethod
+ def __prepare__(cls, name, this_bases):
+ return meta.__prepare__(name, bases)
+ return type.__new__(metaclass, 'temporary_class', (), {})
+
+
+def add_metaclass(metaclass):
+ """Class decorator for creating a class with a metaclass."""
+ def wrapper(cls):
+ orig_vars = cls.__dict__.copy()
+ slots = orig_vars.get('__slots__')
+ if slots is not None:
+ if isinstance(slots, str):
+ slots = [slots]
+ for slots_var in slots:
+ orig_vars.pop(slots_var)
+ orig_vars.pop('__dict__', None)
+ orig_vars.pop('__weakref__', None)
+ if hasattr(cls, '__qualname__'):
+ orig_vars['__qualname__'] = cls.__qualname__
+ return metaclass(cls.__name__, cls.__bases__, orig_vars)
+ return wrapper
+
+
+def ensure_binary(s, encoding='utf-8', errors='strict'):
+ """Coerce **s** to six.binary_type.
+
+ For Python 2:
+ - `unicode` -> encoded to `str`
+ - `str` -> `str`
+
+ For Python 3:
+ - `str` -> encoded to `bytes`
+ - `bytes` -> `bytes`
+ """
+ if isinstance(s, binary_type):
+ return s
+ if isinstance(s, text_type):
+ return s.encode(encoding, errors)
+ raise TypeError("not expecting type '%s'" % type(s))
+
+
+def ensure_str(s, encoding='utf-8', errors='strict'):
+ """Coerce *s* to `str`.
+
+ For Python 2:
+ - `unicode` -> encoded to `str`
+ - `str` -> `str`
+
+ For Python 3:
+ - `str` -> `str`
+ - `bytes` -> decoded to `str`
+ """
+ # Optimization: Fast return for the common case.
+ if type(s) is str:
+ return s
+ if PY2 and isinstance(s, text_type):
+ return s.encode(encoding, errors)
+ elif PY3 and isinstance(s, binary_type):
+ return s.decode(encoding, errors)
+ elif not isinstance(s, (text_type, binary_type)):
+ raise TypeError("not expecting type '%s'" % type(s))
+ return s
+
+
+def ensure_text(s, encoding='utf-8', errors='strict'):
+ """Coerce *s* to six.text_type.
+
+ For Python 2:
+ - `unicode` -> `unicode`
+ - `str` -> `unicode`
+
+ For Python 3:
+ - `str` -> `str`
+ - `bytes` -> decoded to `str`
+ """
+ if isinstance(s, binary_type):
+ return s.decode(encoding, errors)
+ elif isinstance(s, text_type):
+ return s
+ else:
+ raise TypeError("not expecting type '%s'" % type(s))
+
+
+def python_2_unicode_compatible(klass):
+ """
+ A class decorator that defines __unicode__ and __str__ methods under Python 2.
+ Under Python 3 it does nothing.
+
+ To support Python 2 and 3 with a single code base, define a __str__ method
+ returning text and apply this decorator to the class.
+ """
+ if PY2:
+ if '__str__' not in klass.__dict__:
+ raise ValueError("@python_2_unicode_compatible cannot be applied "
+ "to %s because it doesn't define __str__()." %
+ klass.__name__)
+ klass.__unicode__ = klass.__str__
+ klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
+ return klass
+
+
+# Complete the moves implementation.
+# This code is at the end of this module to speed up module loading.
+# Turn this module into a package.
+__path__ = [] # required for PEP 302 and PEP 451
+__package__ = __name__ # see PEP 366 @ReservedAssignment
+if globals().get("__spec__") is not None:
+ __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable
+# Remove other six meta path importers, since they cause problems. This can
+# happen if six is removed from sys.modules and then reloaded. (Setuptools does
+# this for some reason.)
+if sys.meta_path:
+ for i, importer in enumerate(sys.meta_path):
+ # Here's some real nastiness: Another "instance" of the six module might
+ # be floating around. Therefore, we can't use isinstance() to check for
+ # the six meta path importer, since the other six instance will have
+ # inserted an importer with different class.
+ if (type(importer).__name__ == "_SixMetaPathImporter" and
+ importer.name == __name__):
+ del sys.meta_path[i]
+ break
+ del i, importer
+# Finally, add the importer to the meta path import hook.
+sys.meta_path.append(_importer)
diff --git a/.venv/lib/python3.12/site-packages/botocore/waiter.py b/.venv/lib/python3.12/site-packages/botocore/waiter.py
new file mode 100644
index 00000000..5c1e8f1c
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/botocore/waiter.py
@@ -0,0 +1,396 @@
+# Copyright 2012-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+# http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+import logging
+import time
+from functools import partial
+
+import jmespath
+
+from botocore.context import with_current_context
+from botocore.docs.docstring import WaiterDocstring
+from botocore.useragent import register_feature_id
+from botocore.utils import get_service_module_name
+
+from . import xform_name
+from .exceptions import ClientError, WaiterConfigError, WaiterError
+
+logger = logging.getLogger(__name__)
+
+
+def create_waiter_with_client(waiter_name, waiter_model, client):
+ """
+
+ :type waiter_name: str
+ :param waiter_name: The name of the waiter. The name should match
+ the name (including the casing) of the key name in the waiter
+ model file (typically this is CamelCasing).
+
+ :type waiter_model: botocore.waiter.WaiterModel
+ :param waiter_model: The model for the waiter configuration.
+
+ :type client: botocore.client.BaseClient
+ :param client: The botocore client associated with the service.
+
+ :rtype: botocore.waiter.Waiter
+ :return: The waiter object.
+
+ """
+ single_waiter_config = waiter_model.get_waiter(waiter_name)
+ operation_name = xform_name(single_waiter_config.operation)
+ operation_method = NormalizedOperationMethod(
+ getattr(client, operation_name)
+ )
+
+ # Create a new wait method that will serve as a proxy to the underlying
+ # Waiter.wait method. This is needed to attach a docstring to the
+ # method.
+ def wait(self, **kwargs):
+ Waiter.wait(self, **kwargs)
+
+ wait.__doc__ = WaiterDocstring(
+ waiter_name=waiter_name,
+ event_emitter=client.meta.events,
+ service_model=client.meta.service_model,
+ service_waiter_model=waiter_model,
+ include_signature=False,
+ )
+
+ # Rename the waiter class based on the type of waiter.
+ waiter_class_name = str(
+ f'{get_service_module_name(client.meta.service_model)}.Waiter.{waiter_name}'
+ )
+
+ # Create the new waiter class
+ documented_waiter_cls = type(waiter_class_name, (Waiter,), {'wait': wait})
+
+ # Return an instance of the new waiter class.
+ return documented_waiter_cls(
+ waiter_name, single_waiter_config, operation_method
+ )
+
+
+def is_valid_waiter_error(response):
+ error = response.get('Error')
+ if isinstance(error, dict) and 'Code' in error:
+ return True
+ return False
+
+
+class NormalizedOperationMethod:
+ def __init__(self, client_method):
+ self._client_method = client_method
+
+ def __call__(self, **kwargs):
+ try:
+ return self._client_method(**kwargs)
+ except ClientError as e:
+ return e.response
+
+
+class WaiterModel:
+ SUPPORTED_VERSION = 2
+
+ def __init__(self, waiter_config):
+ """
+
+ Note that the WaiterModel takes ownership of the waiter_config.
+ It may or may not mutate the waiter_config. If this is a concern,
+ it is best to make a copy of the waiter config before passing it to
+ the WaiterModel.
+
+ :type waiter_config: dict
+ :param waiter_config: The loaded waiter config
+ from the <service>*.waiters.json file. This can be
+ obtained from a botocore Loader object as well.
+
+ """
+ self._waiter_config = waiter_config['waiters']
+
+ # These are part of the public API. Changing these
+ # will result in having to update the consuming code,
+ # so don't change unless you really need to.
+ version = waiter_config.get('version', 'unknown')
+ self._verify_supported_version(version)
+ self.version = version
+ self.waiter_names = list(sorted(waiter_config['waiters'].keys()))
+
+ def _verify_supported_version(self, version):
+ if version != self.SUPPORTED_VERSION:
+ raise WaiterConfigError(
+ error_msg=(
+ "Unsupported waiter version, supported version "
+ f"must be: {self.SUPPORTED_VERSION}, but version "
+ f"of waiter config is: {version}"
+ )
+ )
+
+ def get_waiter(self, waiter_name):
+ try:
+ single_waiter_config = self._waiter_config[waiter_name]
+ except KeyError:
+ raise ValueError(f"Waiter does not exist: {waiter_name}")
+ return SingleWaiterConfig(single_waiter_config)
+
+
+class SingleWaiterConfig:
+ """Represents the waiter configuration for a single waiter.
+
+ A single waiter is considered the configuration for a single
+ value associated with a named waiter (i.e TableExists).
+
+ """
+
+ def __init__(self, single_waiter_config):
+ self._config = single_waiter_config
+
+ # These attributes are part of the public API.
+ self.description = single_waiter_config.get('description', '')
+ # Per the spec, these three fields are required.
+ self.operation = single_waiter_config['operation']
+ self.delay = single_waiter_config['delay']
+ self.max_attempts = single_waiter_config['maxAttempts']
+
+ @property
+ def acceptors(self):
+ acceptors = []
+ for acceptor_config in self._config['acceptors']:
+ acceptor = AcceptorConfig(acceptor_config)
+ acceptors.append(acceptor)
+ return acceptors
+
+
+class AcceptorConfig:
+ def __init__(self, config):
+ self.state = config['state']
+ self.matcher = config['matcher']
+ self.expected = config['expected']
+ self.argument = config.get('argument')
+ self.matcher_func = self._create_matcher_func()
+
+ @property
+ def explanation(self):
+ if self.matcher == 'path':
+ return f'For expression "{self.argument}" we matched expected path: "{self.expected}"'
+ elif self.matcher == 'pathAll':
+ return (
+ f'For expression "{self.argument}" all members matched '
+ f'expected path: "{self.expected}"'
+ )
+ elif self.matcher == 'pathAny':
+ return (
+ f'For expression "{self.argument}" we matched expected '
+ f'path: "{self.expected}" at least once'
+ )
+ elif self.matcher == 'status':
+ return f'Matched expected HTTP status code: {self.expected}'
+ elif self.matcher == 'error':
+ return f'Matched expected service error code: {self.expected}'
+ else:
+ return f'No explanation for unknown waiter type: "{self.matcher}"'
+
+ def _create_matcher_func(self):
+ # An acceptor function is a callable that takes a single value. The
+ # parsed AWS response. Note that the parsed error response is also
+ # provided in the case of errors, so it's entirely possible to
+ # handle all the available matcher capabilities in the future.
+ # There's only three supported matchers, so for now, this is all
+ # contained to a single method. If this grows, we can expand this
+ # out to separate methods or even objects.
+
+ if self.matcher == 'path':
+ return self._create_path_matcher()
+ elif self.matcher == 'pathAll':
+ return self._create_path_all_matcher()
+ elif self.matcher == 'pathAny':
+ return self._create_path_any_matcher()
+ elif self.matcher == 'status':
+ return self._create_status_matcher()
+ elif self.matcher == 'error':
+ return self._create_error_matcher()
+ else:
+ raise WaiterConfigError(
+ error_msg=f"Unknown acceptor: {self.matcher}"
+ )
+
+ def _create_path_matcher(self):
+ expression = jmespath.compile(self.argument)
+ expected = self.expected
+
+ def acceptor_matches(response):
+ if is_valid_waiter_error(response):
+ return
+ return expression.search(response) == expected
+
+ return acceptor_matches
+
+ def _create_path_all_matcher(self):
+ expression = jmespath.compile(self.argument)
+ expected = self.expected
+
+ def acceptor_matches(response):
+ if is_valid_waiter_error(response):
+ return
+ result = expression.search(response)
+ if not isinstance(result, list) or not result:
+ # pathAll matcher must result in a list.
+ # Also we require at least one element in the list,
+ # that is, an empty list should not result in this
+ # acceptor match.
+ return False
+ for element in result:
+ if element != expected:
+ return False
+ return True
+
+ return acceptor_matches
+
+ def _create_path_any_matcher(self):
+ expression = jmespath.compile(self.argument)
+ expected = self.expected
+
+ def acceptor_matches(response):
+ if is_valid_waiter_error(response):
+ return
+ result = expression.search(response)
+ if not isinstance(result, list) or not result:
+ # pathAny matcher must result in a list.
+ # Also we require at least one element in the list,
+ # that is, an empty list should not result in this
+ # acceptor match.
+ return False
+ for element in result:
+ if element == expected:
+ return True
+ return False
+
+ return acceptor_matches
+
+ def _create_status_matcher(self):
+ expected = self.expected
+
+ def acceptor_matches(response):
+ # We don't have any requirements on the expected incoming data
+ # other than it is a dict, so we don't assume there's
+ # a ResponseMetadata.HTTPStatusCode.
+ status_code = response.get('ResponseMetadata', {}).get(
+ 'HTTPStatusCode'
+ )
+ return status_code == expected
+
+ return acceptor_matches
+
+ def _create_error_matcher(self):
+ expected = self.expected
+
+ def acceptor_matches(response):
+ # When the client encounters an error, it will normally raise
+ # an exception. However, the waiter implementation will catch
+ # this exception, and instead send us the parsed error
+ # response. So response is still a dictionary, and in the case
+ # of an error response will contain the "Error" and
+ # "ResponseMetadata" key.
+ # When expected is True, accept any error code.
+ # When expected is False, check if any errors were encountered.
+ # Otherwise, check for a specific AWS error code.
+ if expected is True:
+ return "Error" in response and "Code" in response["Error"]
+ elif expected is False:
+ return "Error" not in response
+ else:
+ return response.get("Error", {}).get("Code", "") == expected
+
+ return acceptor_matches
+
+
+class Waiter:
+ def __init__(self, name, config, operation_method):
+ """
+
+ :type name: string
+ :param name: The name of the waiter
+
+ :type config: botocore.waiter.SingleWaiterConfig
+ :param config: The configuration for the waiter.
+
+ :type operation_method: callable
+ :param operation_method: A callable that accepts **kwargs
+ and returns a response. For example, this can be
+ a method from a botocore client.
+
+ """
+ self._operation_method = operation_method
+ # The two attributes are exposed to allow for introspection
+ # and documentation.
+ self.name = name
+ self.config = config
+
+ @with_current_context(partial(register_feature_id, 'WAITER'))
+ def wait(self, **kwargs):
+ acceptors = list(self.config.acceptors)
+ current_state = 'waiting'
+ # pop the invocation specific config
+ config = kwargs.pop('WaiterConfig', {})
+ sleep_amount = config.get('Delay', self.config.delay)
+ max_attempts = config.get('MaxAttempts', self.config.max_attempts)
+ last_matched_acceptor = None
+ num_attempts = 0
+
+ while True:
+ response = self._operation_method(**kwargs)
+ num_attempts += 1
+ for acceptor in acceptors:
+ if acceptor.matcher_func(response):
+ last_matched_acceptor = acceptor
+ current_state = acceptor.state
+ break
+ else:
+ # If none of the acceptors matched, we should
+ # transition to the failure state if an error
+ # response was received.
+ if is_valid_waiter_error(response):
+ # Transition to a failure state, which we
+ # can just handle here by raising an exception.
+ raise WaiterError(
+ name=self.name,
+ reason='An error occurred ({}): {}'.format(
+ response['Error'].get('Code', 'Unknown'),
+ response['Error'].get('Message', 'Unknown'),
+ ),
+ last_response=response,
+ )
+ if current_state == 'success':
+ logger.debug(
+ "Waiting complete, waiter matched the " "success state."
+ )
+ return
+ if current_state == 'failure':
+ reason = f'Waiter encountered a terminal failure state: {acceptor.explanation}'
+ raise WaiterError(
+ name=self.name,
+ reason=reason,
+ last_response=response,
+ )
+ if num_attempts >= max_attempts:
+ if last_matched_acceptor is None:
+ reason = 'Max attempts exceeded'
+ else:
+ reason = (
+ f'Max attempts exceeded. Previously accepted state: '
+ f'{acceptor.explanation}'
+ )
+ raise WaiterError(
+ name=self.name,
+ reason=reason,
+ last_response=response,
+ )
+ time.sleep(sleep_amount)